📄 csyg.c
字号:
}
void DisplayInitial(void) // 显示初始画面
{
int i,j;
// DDRD|=0x40;
strncpy(Line_str,"VER 5.30",8);
Line_nums=8;
Line=0;
Col=0;
Disp1608(); //显示程序
if(Languageflag) //Languageflag=1为英文
{
strncpy_P(Line_str,IniMenuE,16);//" Initial...... "
Line_nums=16;
Line=1;
Col=0;
Disp1608(); //显示程序
}
else//否则为汉语
{
strncpy_P(Line_str,IniMenu,10);//"正在初始化......"
Line_nums=10;
Line=1;
Col=3;
Disp1608(); //显示程序
}
for(i=0;i<1000;i++) //延时
{
for(j=0;j<3000;j++);
}
Clr_LCD(); //清列
// DDRD|=0x40;
// PORTD&=0xbf;
}
void Disp1608(void) //显示程序
{
//signed char temp;
char i,k,m,n,Cur_Y,Y_address,X_address,CSY_addr;
unsigned int HZK_ptr;
Cur_Y=Col;
IniLCD(); //屏幕初始化
for(i=0;i<Line_nums;i++)
{
if(Line_str[i]>=0x80)
{
HZK_ptr=(Line_str[i]&0x7f)*0x80+(Line_str[i+1]&0x7f);
HZK_ptr*=32;
for(m=0;m<2;m++)
{
Y_address=Cur_Y*8;
X_address=Line*2+m;
for(n=0;n<2;n++)
{
SET_CS1;
CLR_CS2;
Y_address+=n*8;
CSY_addr=Y_address;
if(Y_address>63)
{
CSY_addr-=64;
SET_CS2;
CLR_CS1;
}
Read_BF(); //判断显示器忙?
DDRB=0xff;
CLR_RW;
CLR_RS;
PORTB=CSY_addr+0x40;
SET_E;
CLR_E;
Read_BF(); //判断显示器忙?
DDRB=0xff;
CLR_RW;
CLR_RS;
PORTB=X_address+0xb8;
SET_E;
CLR_E;
for(k=0;k<8;k++)
{
Read_BF(); //判断显示器忙?
CLR_RW;
SET_RS;
DDRB=0xff;
if(M_flag==1)
PORTB=0xff-HZK[HZK_ptr];
else
PORTB=HZK[HZK_ptr];
SET_E;
CLR_E;
HZK_ptr++;
}
}
}
i++;Cur_Y++;
}
else
{
HZK_ptr=Line_str[i]*16;
for(m=0;m<2;m++)
{
Y_address=Cur_Y*8;
X_address=Line*2+m;
SET_CS1;
CLR_CS2;
if(Y_address>63)
{
Y_address-=64;
SET_CS2;
CLR_CS1;
}
Read_BF(); //判断显示器忙?
CLR_RW;
CLR_RS;
DDRB=0xff;
PORTB=Y_address+0x40;
SET_E;
CLR_E;
Read_BF(); //判断显示器忙?
CLR_RW;
CLR_RS;
DDRB=0xff;
PORTB=X_address+0xb8;
SET_E;
CLR_E;
for(k=0;k<8;k++)
{
Read_BF(); //判断显示器忙?
CLR_RW;
SET_RS;
DDRB=0xff;
if(M_flag==1)
PORTB=0xff-asc000[HZK_ptr];//+k+m*8];
else
PORTB=asc000[HZK_ptr];//+k+m*8];
SET_E;
CLR_E;
HZK_ptr++;
}
}
}
Cur_Y++;
}
M_flag=0;
}
void Read_BF(void) //判断显示器忙?
{
unsigned char ch,ch1;
while(1)
{
CLR_E;
SET_RW;CLR_RS;//SET_CS1;CLR_CS2;
DDRB=0x00;
PORTB=0x00;
SET_E;//下降沿触发
CLR_E;//
ch=PINB;
ch1=ch&0x90;//1001 00000
if(ch1==0)
break;
}
}
void Clr_Row(char Row)//清行
{
memcpy_P(Line_str,SPACE,16);
Col=0;Line=Row;
Line_nums=16;
CLR1608(); //清显示屏幕
}
void CLR1608(void) //清显示屏幕
{
char i,m,j,X_address;
for(j=0;j<2;j++)
{
if(j==0)
{
SET_CS1;//左半面
CLR_CS2;
}
else
{
SET_CS2;//右半面
CLR_CS1;
}
for(m=0;m<2;m++)
{
X_address=Line*2+m;
Read_BF(); //判断显示器忙?
CLR_RW;
CLR_RS;
DDRB=0xff;
SET_E;//下降沿触发
CLR_E;//
Read_BF(); //判断显示器忙?
CLR_RW;
CLR_RS;
DDRB=0xff;
PORTB=X_address+0xb8;
SET_E;//下降沿触发
CLR_E;//
for(i=0;i<64;i++)//64列
{
Read_BF(); //判断显示器忙?
CLR_RW;
SET_RS;
DDRB=0xff;
PORTB=0;
SET_E;//下降沿触发
CLR_E;//
}
}
}
}
void Clr_LCD(void) //清列
{
char i;
for(i=0;i<4;i++)
Clr_Row(i);//清行
}
void Clr_4Row(void) //清4行
{
char i;
for(i=1;i<4;i++)
Clr_Row(i);//清行
}
void IniLCD(void) //屏幕初始化
{
// DDRA=0x00;
// PORTA&=0x07;
SET_CS1;
CLR_CS2;
Read_BF(); //判断显示器忙?
DDRB=0xff; //PB口输出口
PORTB=0x3f; //PB口
LCDCommand(); //屏幕写命令
SET_CS2;
CLR_CS1;
Read_BF(); //判断显示器忙?
DDRB=0xff;
PORTB=0x3f;
LCDCommand(); //屏幕写命令
SET_CS1 ;
CLR_CS2;
DDRB=0xff;
PORTB=0xc0;
LCDCommand(); //屏幕写命令
SET_CS2;
CLR_CS1;
DDRB=0xff;
PORTB=0xc0;
LCDCommand(); //屏幕写命令
}
void LCDCommand(void) //屏幕写命令
{
CLR_E;//清液晶片选
CLR_RW;//写液晶
CLR_RS;//读液晶
SET_E;//置液晶片选
CLR_E;//清液晶片选
}
void Key(void) //判断有键按下吗?
{
unsigned int i;
char temp;
BackLight();//背光灯
Key_pressed=0;//设,没键按下
// KeyCode=0xff;
DDRA=0x0;
temp=PINA;
temp|=0xf5;//判断上下键有按吗?
if(temp!=0xff) //有下降沿
{ //有
for(i=0;i<100;i++);//延时防抖
temp=PINA; //再一次判断有上下键有按吗?
temp|=0xf5;
if(temp!=0xff)//有下降键?
{ //有
Key_pressed=1;//有键按下
_CLI(); //关中断
TimerOff=0; //时间计数 有键按下时间计数清0
_SEI();//开中断
}
}
}
void Get_Keycode(void)//取键值
{
KeyCode=0xff;
DDRA=0x00;//A口为输入
KeyCode=PINA|0xf5;//取键值
}
void KeyWaite(void)//键等待
{
while(1)
{
BackLight();//背光灯
Get_Keycode();//取键值
if(KeyCode==0xff)
break;
}
}
void SetupLanguage(void) //设置中英
{
char CurRow1;//临时变量CurRow1为字符型
CurRow1=CurRow;//标志暂存于CurRow1中
Clr_LCD(); //清列
CurRow=Languageflag;//中英标志送CurRow
while(1)
{
SetupLanguageUpdate(); //选择中英文显示面
// Key(); //判断有键按下吗?
// if(Key_pressed)
// break;
if(!Get_BackLightKey())//假如没有背光键按下
break;//跳出往下进行
}
while(1)
{
SetupLanguageUpdate(); //选择中英文显示面
Key(); //判断有键按下吗?
if(Key_pressed)//有键按下吗?
{
Get_Keycode();//取键值
if(KeyCode==UP_KEY)//是上升键吗?
{
KeyWaite();//键等待(防抖)
if(CurRow>0)
CurRow--;//是1变为0
}
else if(KeyCode==DOWN_KEY)//否则是下降键
{
KeyWaite();//键等待(防抖)
if(CurRow<1)
CurRow++;//是0变为1
}
// else if(KeyCode==BG_KEY)
// {
// KeyWaite();//键等待(防抖)
// Languageflag=CurRow;
// EE_Languageflag=CurRow;
// break;
// }
}
if(Get_BackLightKey())//假如背光键按下
{
Languageflag=CurRow;//送标志位
EE_Languageflag=CurRow;//送EEPROM中保存
break;//跳出
}
}
CurRow=CurRow1;//恢复原来标志
}
void SetupLanguageUpdate(void) //选择“中英文”显示面
{
char i;
if(!Languageflag)//Languageflag=0?是进入中文吗?
strncpy_P(Line_str,SetupLanguageMenu,16);//" 语 言 "
else
strncpy_P(Line_str,SetupLanguageMenuE,16);//" LANGUAGE "
Line_nums=16;
Col=0;
Line=0;
M_flag=1;
Disp1608(); //显示程序
for(i=0;i<2;i++)
{
strncpy_P(Line_str,&SetupLanguageMenu1[7*i],7);//"汉 语English"
Line_nums=7;
Col=4;
Line=1+i;
Disp1608(); //显示程序
if(CurRow==i)
strncpy_P(Line_str,&SetupDisplayMenu1[2],2);//"○⊙"
else
strncpy_P(Line_str,SetupDisplayMenu1,2);
Line_nums=2;
Col=0;
Line=1+i;
Disp1608(); //显示程序
}
}
__interrupt void TIMER1VF_Handler(void) //T1中断
{
DDRA&=0x7f; //PA。8口输入(LINK)
PORTA&=0x7f; //PA。8口底电瓶
ICR1=15000; //ICR1输入 寄存器
if(!(PINA&0x80))//PA。8口(LINK)底电瓶 有信号?
{ //有信号
if(TimerCount<50) //计数
TimerCount++; //计数
else
{
Synflag=1; //在(LINK)有信号的情况下,计数超过50,标志Synflag=1
TimerOff=0; //清 时间记数 有信号的情况下,时间记数清0
TimerOffflag=0; //清 长时间无按键
}
}
else //没有信号
{
TimerOff++; //时间计数
if(TimerOff>5000) //没有信号,又超过15分钟,让TimerOffflag=1准备关机
TimerOffflag=1; //长时间无按键
TimerCount=0; // 清 计数
Synflag=0; //清标志Synflag
}
}
void ADCBattery(void) //A/D电池检测
{
ADCSRA|=0x40;
while(!(ADCSRA&0x10));
Battery=ADCH;//A/D转换高电瓶 存 Battery
if(Battery<200)//采集的A/D数字小于200吗?
{ //小
Battery=0; //清
LowOffflag=1; //电池电压底标志=1
}
else if(Battery<210)//<6.8V Turn off
{
LowOffflag=1; //电池电压底标志=1
Battery-=200; //减去底的电池值
}
else if(Battery<216)//<7.0V Alarm
{
BeeSpeak(30); //蜂鸣器(时间长短)
Battery-=200; //减去底的电池值
}
else
Battery-=200; //减去底的电池值
Battery=Battery*2+2; //将余下的值*2+2
if(Battery>112) //
Battery=112; //
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -