📄 csyg.c
字号:
//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 + -