⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csyg.c

📁 ADSL测试仪
💻 C
📖 第 1 页 / 共 3 页
字号:
//LCD12864P.c
#include <iom16.h>
#include <ina90.h>
#include <stdio.h>
#include <pgmspace.h>
#include <string.h>
#include <stdlib.h>
#include "HZ.h"
#include "menu.h"
#include "asc1608a.h"
#define SET_CS2 PORTD|=0x08
#define SET_CS1 PORTD|=0x10
#define CLR_CS2 PORTD&=0xF7
#define CLR_CS1 PORTD&=0xEF
#define SET_E   PORTD|=0x80
#define CLR_E   PORTD&=0x7f
#define SET_RW  PORTD|=0x20
#define CLR_RW  PORTD&=0xDf
#define SET_RS  PORTD|=0x40
#define CLR_RS  PORTD&=0xBF

#define  UP_KEY      0xfd   //上升键
#define  DOWN_KEY    0xf7   //下降键
#define  BG_KEY      0xfb   //背光键

#define  Version           1.00

#pragma  vector=TIMER1_OVF_vect
__interrupt void TIMER1VF_Handler(void);

char Line_str[16],BUF[6];
char Languageflag,M_flag,Synflag;
unsigned char Col,Line,Cur_Y=0,Line_nums,CurRow;
char Key_pressed,KeyCode,MenuNumbers=0;
char TimerCount,TimerOffflag,LowOffflag,SampleTime;
unsigned int TimerOff;

__eeprom char unuse @0x00;
__eeprom char EE_Languageflag=0; 
__eeprom unsigned char EE_RecordDown1[5]="24000",EE_RecordDown2[5]="24000",EE_RecordDown3[5]="24000"; 
__eeprom unsigned char EE_RecordUP1[5]=" 1024",EE_RecordUP2[5]=" 1024",EE_RecordUP3[5]=" 1024"; 

char Battery;//电池A/D转换高电瓶  存  Battery(ADCH变量)
void Disp1608(void);  //显示程序
void Disp1608E(void);
void Read_BF(void);  //判断显示器忙?
void Clr_Row(char Row);  //清行
void Clr_LCD(void);    //清列
void Clr_4Row(void);   //清4行
void CLR1608(void);  //清显示屏幕
void IniLCD(void);   //屏幕初始化
void LCDCommand(void);  //屏幕写命令

void Key(void);      //判断有键按下吗?
void Get_Keycode(void);//取键值
void Initial(void);//初始化
void KeyWaite(void);//键等待

void MainMenu(void);   //主菜单
void DisplayOne(void);  //显示1面
void DisplayTwo(void);  //显示2面
void DisplayThree(void);  //显示3面
void DisplayFour(void);  //显示4面
void DisplayFive(void);  //显示5面
void DisplaySix(void);  //显示6面

void SetupLanguage(void);  //设置中英
void SetupLanguageUpdate(void);  //选择中英文显示面
void DelayTime(unsigned int);   //延时
void BeeSpeak(unsigned int time);   //蜂鸣器(时间长短)
void Disp2(void);
void DrawDot(unsigned char x,unsigned char y);//画点
void DrawLine(unsigned char x,unsigned char y);//画线
void BackLight(void);//背光灯
char Get_BackLightKey(void);  //取背光键值
char ReceiveComm(void);    //串行口接受
void WriteComm(unsigned char Data);  //串行口发射
void ReadComm(void);//读串行口
void Start(void);  //开始
void ADCBattery(void);   //A/D电池检测
struct dsl{                        //串行口数组结构
          char standard[15];//ADSL2/2+(“连接标准”)
          char Local_Tx_Power[5];//12.1 (上行功率)
          char Remote_Tx_Power[5];//20.5 (下行功率)
          char Local_Line_Att[5];//36.0(上行衰减)
          char Remote_Line_Att[5];//17.0 (下行衰减)
          char Local_SNR_Margin[5];//6.0 (上行噪声余量)
          char Remote_SNR_Margin[5];//9.5 (下行噪声余量)
          char Tx_Line_Rate[5];//1020 (上行速率:)
          char Rx_Line_Rate[5];//22078(下行速率:)
          char Up_Svalue[10];//线路容量:
          char Down_Svalue[10];//线路容量:
         // char Up_Dvalue[10];
         // char Down_Dvalue[10];
}Dsl;

void main(void)  //主程序
{
  char Synflag1,i;
  DDRD=0xff;//PD口为输出口
  Synflag=0;       //清标志位
  Synflag1=0;      //清标志位
  PORTD|=0x77;//1为高电平
   IniLCD();   //屏幕初始化
   Clr_LCD();    //清列
   
  BeeSpeak(10);   //蜂鸣器(时间长短)
  Languageflag=EE_Languageflag;//从eeprom中取“中/英”标志,送Languageflag中,
//Languageflag=1为英文。
//Languageflag=0为汉语。
   if(Get_BackLightKey())//问:有背光吗?
    SetupLanguage(); //设置中英
  Initial();//初始化
  SampleTime=0;  //A/D抽样时间
   //adc set
   ADMUX=0xE0;//Set VREF=2.56V Select PA0
   ADCSRA=0x87;//
  ADCBattery();   //A/D电池检测
  if(LowOffflag)//A/D电池底吗?(LowOffflag=1)为底
  {                         //底   应关机
        DDRC|=0x02;
        PORTC|=0x02;
        DelayTime(30);   //延时
        PORTC&=0xfd;
  }
  Start();  //开始
  DDRA=0;
  PORTA&=0x7f;
 
  DelayTime(600);   //延时
  Clr_LCD();    //清列
  MenuNumbers=0; //显示画面号码
  TimerCount=0;     //计数
  MainMenu();   //主菜单
  TimerOffflag=0;   //清    长时间无按键 
  TimerOff=0;  //时间计数
  Synflag=0;       //清标志位
  Synflag1=0;      //清标志位
  while(1)
  { 
     SampleTime++;       //A/D抽样时间
     if(SampleTime&0x10)//抽样A/D电池检测
          ADCBattery();   //A/D电池检测
     if(LowOffflag||TimerOffflag)   //有电池底 或 长时间无按键  都关机
     {
        DDRC|=0x02;
        PORTC|=0x02;
        DelayTime(30);   //延时
       // PORTC&=0xfd;
     }
     if(Synflag!=Synflag1)//不相等?
     {
         if(Synflag)
         {
             ReadComm();//读串行口
             ReadComm();//读串行口
         }
         else
         {
           for(i=0;i<5;i++)//将新的速率存入3,3进2,2进1 到EEPROM中保存
           {
              EE_RecordDown1[i]=EE_RecordDown2[i];
              EE_RecordDown2[i]=EE_RecordDown3[i];
              EE_RecordDown3[i]=Dsl.Rx_Line_Rate[i];//22078下降速率
              EE_RecordUP1[i]=EE_RecordUP2[i];
              EE_RecordUP2[i]=EE_RecordUP3[i];
              EE_RecordUP3[i]=Dsl.Tx_Line_Rate[i];//1020 上升速率
           }
         } 
         BeeSpeak(10);   //蜂鸣器(时间长短)
         MainMenu();   //主菜单
         Synflag1=Synflag;  //状态保存
     }
     Key();         //判断有键按下吗?
     if(Key_pressed)
     {
       Get_Keycode();//取键值
       if(KeyCode==DOWN_KEY)//下降键吗?
       {
           if(MenuNumbers<4) //显示画面号码
           { 
              MenuNumbers++;  //显示画面号码
              BeeSpeak(10);   //蜂鸣器(时间长短)
              Clr_LCD();    //清列
              MainMenu();   //主菜单
           }
           KeyWaite();//键等待(防抖)
       }
       else  if(KeyCode==UP_KEY)//是上升键吗?
       {
        
           if(MenuNumbers>0) //显示画面号码
           {
             MenuNumbers--;  //显示画面号码
             Clr_LCD();    //清列
             BeeSpeak(10);   //蜂鸣器(时间长短)
             MainMenu();   //主菜单
           }
           KeyWaite();//键等待(防抖)
       }
     }  
  }
} 


void Start(void)  //开始
{
   Clr_LCD();    //清列
   if(!Languageflag)    //Languageflag=0吗?(汉语)
      strncpy_P(Line_str,StartMenu1,16);//"   北京广域     "
   else
      strncpy_P(Line_str,StartMenu1E,16);//"BeiJing Widearea"
   Line=0;
   Col=0;Line_nums=16;
   Disp1608();  //显示程序
   
   if(!Languageflag)    //Languageflag=0吗?(汉语)
      strncpy_P(Line_str,StartMenu3,16);//"  ...我们致力于"
   else
     // strncpy_P(Line_str,StartMenu3E,16);//"   Intialing    "
   Line=2;
   Col=0;Line_nums=16;
   Disp1608();  //显示程序
   
   if(!Languageflag) //Languageflag=0吗?(汉语)
      strncpy_P(Line_str,StartMenu2,16);//"您的宽带延深..."
   else
      //strncpy_P(Line_str,StartMenu2E,16);//"Please waite... "
   Line=3;
   Col=0;Line_nums=16;
   Disp1608();  //显示程序
   
}

void ReadComm(void)//读串行口
{
  char Command[]="get dsl params",chr;//get dsl params为串行模块口命令14个字符
  unsigned int i,j,n;
  _CLI();   //关中断
  for(i=0;i<14;i++)//首先发送命令
     WriteComm(Command[i]); //串行口发射
  WriteComm(0x0a); //换行
  WriteComm(0x0d); //回车
  i=0;j=0,n=0;
  while(1)
  {
    chr=ReceiveComm();    //串行口接受的数据存入临时寄存器   chr为临时寄存器
    if(chr=='$')  //'$'为结束符号
      break;     //退出
    else if(chr==':')//遇到':'进入
    {
      j++;
      i=0;
      chr=ReceiveComm();    //串行口接受
      do 
      {
          n++;
          chr=ReceiveComm();    //串行口接受
          if(j==6)
            Dsl.standard[i++]=chr;//ADSL2/2+(“连接标准”)
          else if(j==8)
            Dsl.Local_Tx_Power[i++]=chr;//12.1 (上行功率)
          else if(j==9)
            Dsl.Remote_Tx_Power[i++]=chr;//20.5 (下行功率)
          else if(j==10)
            Dsl.Local_Line_Att[i++]=chr;//36.0(上行衰减)
          else if(j==11)
            Dsl.Remote_Line_Att[i++]=chr;//17.0 (下行衰减)
          else if(j==12)
            Dsl.Local_SNR_Margin[i++]=chr;//6.0 (上行噪声余量)
          else if(j==13)
            Dsl.Remote_SNR_Margin[i++]=chr;//9.5 (下行噪声余量)
          else if(j==14)
            Dsl.Tx_Line_Rate[i++]=chr;//1020 (上行速率:)
          else if(j==15)
            Dsl.Rx_Line_Rate[i++]=chr;//22078(下行速率:)
          else if(j==16)
           Dsl.Up_Svalue[i++]=chr;//线路容量:
          else if(j==17)
            Dsl.Down_Svalue[i++]=chr;//线路容量:
         // else if(j==18)
         //   Dsl.Up_Dvalue[i++]=chr;//
         // else if(j==19)
         //   Dsl.Down_Dvalue[i++]=chr;//
        }while((chr!=' '));
     }
    if(n>2048)//大于2K返回
      break;
  }
  _SEI();//开中断
}

char ReceiveComm(void)    //串行口接受
{
  while(!(UCSRA&0x80));//USART接受数据结束=1?
  return UDR;     //返回数据
}
void WriteComm(unsigned char Data) //串行口发射
{
    while ((UCSRA&0x20)==0); //USART数据积存器=1为空?
    UDR=Data;     //发送数据
}

void BeeSpeak(unsigned int time)   //蜂鸣器(时间长短)
{
  DDRC|=0x01;//PC。0口为输出
  PORTC|=0x01;//蜂鸣器  高电瓶  响
  DelayTime(time);   //延时
  PORTC&=0xfe;//蜂鸣器 不响
  DelayTime(time);    //延时
}
char Get_BackLightKey(void)  //取背光键值
{
  char temp,BackLightKey;//定义临时寄存器和背光键值都为字符型
  unsigned int i;
  DDRA=0x00;
  temp=PINA|0xfb;//如果PA口背光键按下,相应口为高电平,再跟0xfb或就为0xff。结果送临时寄存器temp进行比较。
  BackLightKey=0;
  if(temp!=0xff)//不相等则有背光键按下
  {
    for(i=0;i<100;i++);
    temp=PINA|0xfb;  //
    if(temp!=0xff)//不相等则有背光键按下
    {
       BackLightKey=1;
       _CLI();  //关中断
       TimerOff=0;  //时间计数
       _SEI();//开中断
    }
  }
  return BackLightKey;//返回背光标志值
}
void BackLight(void)//背光灯
{
  char temp;//定义临时寄存器为字符型
  unsigned int i;
  DDRA=0x00;//PA口定义为输入口
  temp=PINA|0xfb;//如果PA口背光键按下,相应口为高电平,再跟0xfb或就为0xff。结果送临时寄存器temp进行比较。
  if(temp!=0xff)//不相等则有背光键按下
  {
    for(i=0;i<100;i++);//延时
    temp=PINA|0xfb;//如果PA口背光键按下,相应口为高电平,再跟0xfb或就为0xff。结果送临时寄存器temp进行比较。
    if(temp!=0xff)//不相等则有背光键按下
    {
       DDRD|=0x04;
       PORTD|=0x04;//背光灯亮
    }
    else
    {
       DDRD|=0x04;
       PORTD&=0xfb;//背光灯灭
    }
  }
  else
  {
       DDRD|=0x04;
       PORTD&=0xfb;//背光灯关
  }
}
void MainMenu(void)   //主菜单
{
   if(MenuNumbers==0) //显示画面号码
     DisplayOne(); //显示1面
   else if(MenuNumbers==1) //显示画面号码
     DisplayTwo(); //显示2面
   else if(MenuNumbers==2) //显示画面号码
     DisplayThree();  //显示3面
   else if(MenuNumbers==3) //显示画面号码
     DisplayFour();  //显示4面
   else if(MenuNumbers==4) //显示画面号码
     DisplayFive();  //显示5面
   else if(MenuNumbers==5) //显示画面号码
     DisplaySix(); //显示6面
     
}
void DisplayOne(void) //显示1面
{
     char i;
     for(i=0;i<3;i++)//i为行变量(i为0行变=1行(链接标准:),i为1行变=2行(下行速率:),i为2行变=3行(上行速率:),)
     {                                                        //(线路容量:)不用
       if(!Languageflag) //Languageflag=0吗?(汉语?)
          strncpy_P(Line_str,&DisplayOneMenu[i*9],9);//"链接标准:下行速率:上行速率:(线路容量:)"
       else
          strncpy_P(Line_str,&DisplayOneMenuE[i*9],9);//"Link Mod:DN  Rate:UP  Rate:(线路容量:)"
       Line=i;//显示第几行,个共有4行
       Line_nums=10;//
       Col=0;   //从0列开始
       Disp1608();  //显示程序
     }
     if(!Synflag)//Synflag=0?
     {
         for(i=0;i<3;i++)
         {
              strncpy(Line_str,"  --  ",6);
              Line=i;
              Line_nums=6;
              Col=9;
              Disp1608();  //显示程序
         }
          Line_str[0]=25;
          Line_nums=1;
          Col=15;
          Disp1608();  //显示程序
     }
     else//Synflag=1
     {
         if(Dsl.standard[6]=='2')//ADSL2/2+
            Dsl.standard[5]='+';
         strncpy(Line_str,Dsl.standard,6);//ADSL2/2+(链接标准:)
         Line=0;
         Line_nums=6;
         Col=9;Disp1608();  //显示程序
         strncpy(Line_str,Dsl.Rx_Line_Rate,5);//22078(下行速率:)
         Line_nums=5;
         Line=1;
         Disp1608();  //显示程序
         strncpy(Line_str,Dsl.Tx_Line_Rate,6);//1020 (上行速率:)
         Line_nums=4;
         Line=2;
         Disp1608();  //显示程序
     }
     Line_str[0]='K';
     Line=1;       //在第2行的第15列  有K
     Line_nums=1;  //显示1个字
     Col=15;
     Disp1608();  //显示程序
     Line=2;     //在第3行的第15列  有K
     Disp1608();  //显示程序
     Line_str[0]=25;      //下降键头
     Line=3;               //在第3行的第15列
     Disp1608();  //显示程序
     
}

 void DisplayTwo(void)//显示2面???????????????????????
{
  if(!Languageflag) //Languageflag=0吗?(汉语)
      strncpy_P(Line_str,DisplayTwoMenu,15);//"    线路容量    "????
   else
      strncpy_P(Line_str,DisplayTwoMenuE,15);//"  Line capabilit  "?????
  Line=0;
  Line_nums=15;
  Col=0;
  Disp1608();   //显示程序
 /* if(!Languageflag) //Languageflag=0吗?(汉语)
      strncpy_P(Line_str,DisplayThreeMenu2,15);
   else
      strncpy_P(Line_str,DisplayThreeMenu2E,15);
  Line=2;
  Line_nums=15;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -