📄 power_supply.c
字号:
t--;
if(t==0) t=99;
temp_h=t/10;
temp_l=t%10;
lcd_wrcmd(0x87);
lcd_wrdata(0x30+temp_h);
lcd_wrdata(0x30+temp_l);
lcd_wrcmd(0x87);
if((sw4==0)||(sw3==0)) //还有按键,延时一段时间
{
for(n=0;n<1000;n++)delay(200);
while((sw4==0)||(sw3==0)) //有按键,处理连击键
{
//beep=beep_f;
t--;
if(t==0) t=99;
temp_h=t/10;
temp_l=t%10;
lcd_wrcmd(0x87);
lcd_wrdata(0x30+temp_h);
lcd_wrdata(0x30+temp_l);
lcd_wrcmd(0x87);
for(n=0;n<200;n++)delay(250);
beep=beep_f;
for(n=0;n<100;n++)delay(250);
beep=1;
for(n=0;n<100;n++)delay(250);
}
}
beep=1; //关闭蜂鸣器
}
}
//**********************END************************
else if(((sw1==0)||(sw0==0)))
{
ii=key();
if(ii==5)
{
set_t=t;
IICWrite(1004,set_t);
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
display(0xc3,str_su);
for(n=0;n<1500;n++)delay(250);
lcd_wrcmd(1);
state=2;
break;
}
else if(ii==6)
{
lcd_wrcmd(1);
lcd_wrcmd(0x0c);
state=2;
break;
}
}
/*
ii=key();
if((ii==1)||(ii==4)) //加1操作
{
t++;
if(t>99)
{
t=0;
}
temp_h=t/10;
temp_l=t%10;
lcd_wrcmd(0x87);
lcd_wrdata(0x30+temp_h);
lcd_wrdata(0x30+temp_l);
lcd_wrcmd(0x88);
}
else if((ii==2)||(ii==3))//减1操作
{
t--;
if(t==0)
{
t=99;
}
temp_h=t/10;
temp_l=t%10;
lcd_wrcmd(0x87);
lcd_wrdata(0x30+temp_h);
lcd_wrdata(0x30+temp_l);
lcd_wrcmd(0x88);
}
else if(ii==5)
{
set_t=t;
IICWrite(1004,set_t);
lcd_wrcmd(0x0c);
lcd_wrcmd(1);
display(0xc3,str_su);
for(n=0;n<1500;n++)delay(250);
lcd_wrcmd(1);
state=2;
break;
}
else if(ii==6)
{
lcd_wrcmd(1);
lcd_wrcmd(0x0c);
state=2;
break;
}
*/
}
}
lcd_h()
{
uchar i;
lcd_wrcmd(0x40);
for(i=0;i<40;i++) lcd_wrdata(hanzi[i]);
}
menu()
{
uchar ii,ss=1; //ss=1 极为重要,当ss=0时按键会出现失控现象
lcd_wrcmd(1);
lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu1);
display(0xc3,str_menu2);
while(1)
{
ii=key();
///////////////////////////////////////////////
if(ii==1) //UP
{
ss--;
if(ss==0)ss=3;
if(ss==1)
{
lcd_wrcmd(1);lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu1);
display(0xc3,str_menu2);
}
else if(ss==2)
{
lcd_wrcmd(1);
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu1);
display(0xc3,str_menu2);
}
else if(ss==3)
{
lcd_wrcmd(1);
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu2);
display(0xc3,str_menu3);
}
}
else if(ii==2) //Down
{
ss++;
if(ss==4)ss=1;
if(ss==1)
{
lcd_wrcmd(1);lcd_wrcmd(0x80);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu1);
display(0xc3,str_menu2);
}
else if(ss==2)
{
lcd_wrcmd(1);
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu1);
display(0xc3,str_menu2);
}
else if(ss==3)
{
lcd_wrcmd(1);
lcd_wrcmd(0xc0);
lcd_wrdata('-');
lcd_wrdata('>');
display(0x83,str_menu2);
display(0xc3,str_menu3);
}
}
else if(ii==5) //确定键
{
if(ss==1)
{
lcd_wrcmd(1);
state=5; //voltage()
break;
}
else if(ss==2)
{
lcd_wrcmd(1);
state=2; //clock()
break;
}
else if(ss==3)
{
lcd_wrcmd(1);
state=9;
break;
}
//
}
else if(ii==6)
{
lcd_wrcmd(1);
state=0;
break;
}
}
}
rollscreen_l(uchar *str,uchar l)
{
uchar i,temp;
temp=str[0];
for(i=0;i<l;i++)
str[i]=str[i+1];
str[l-1]=temp;
}
rollscreen_r(uchar *str,uchar l)
{
uchar i,temp;
temp=str[l-1];
for(i=l-1;i>0;i--)
str[i]=str[i-1];
str[0]=temp;
}
about()
{
uchar ii,i;
uint j;
bit flag=1;
uchar str[23]=" BY H.C.H VERSION1.0 ";
lcd_wrcmd(1);
display(0xc0,str_test);
while(1)
{
ii=key();
if(ii==6)
{
lcd_wrcmd(1);
state=1;
break;
}
else if(ii==3) flag=0;
else if(ii==4) flag=1;
if(flag==0) rollscreen_l(str,23);
else rollscreen_r(str,23);
lcd_wrcmd(0xc0);
for(i=0;i<16;i++)
lcd_wrdata(str[i]);
for(j=0;j<600;j++)
delay(250);
}
}
time_up()
{
uchar cnt=0,i,ii=0;
uchar hour_h,hour_l,minute_h,minute_l;
lcd_wrcmd(1);
display(0xc3,str_timeup);
hour_h=hour/16;
hour_l=hour%16;
minute_h=minute/16;
minute_l=minute%16;
lcd_wrcmd(0x85);
lcd_wrdata(0x30+hour_h);
lcd_wrdata(0x30+hour_l);
lcd_wrdata(':');
lcd_wrdata(0x30+minute_h);
lcd_wrdata(0x30+minute_l);
while(1)
{
cnt++;
beep=0;
for(i=0;i<250;i++)delay(200);
beep=1;
for(i=0;i<250;i++)delay(200);
ii=key();
if((ii!=0)||(cnt==100))
{
lcd_wrcmd(1);
if(f==1)f=0;
else if(f_p==1)f_p=0;
state=0;
break;
}
}
}
time()
{
uchar ii,hour_h,hour_l,minute_h,minute_l,second_h,second_l;
uint j;
uchar year_h,year_l,month_h,month_l,date_h,date_l,t_h,t_l;
uchar h,m;
uchar lock,lock_time=0;
t_h=read_temperature()/10;
t_l=read_temperature()%10;
lock=second;
read_time();
year_h=year/16;
year_l=year%16;
date_h=date/16;
date_l=date%16;
month_h=month/16;
month_l=month%16;
hour_h=hour/16;
hour_l=hour%16;
minute_h=minute/16;
minute_l=minute%16;
second_h=second/16;
second_l=second%16;
lcd_wrcmd(1);
lcd_wrcmd(0x80);
if(alarm_f==1)lcd_wrdata(0);
else lcd_wrdata(' ');
lcd_wrcmd(0xc0);
if(beep_f==0)lcd_wrdata(3);
else lcd_wrdata(' ');
lcd_wrcmd(0xc2);
if(key_lock)lcd_wrdata(4);
else lcd_wrdata(' ');
//显示第一行
lcd_wrcmd(0x83);
lcd_wrdata('2');
lcd_wrdata('0');
lcd_wrdata(0x30+year_h);lcd_wrdata(0x30+year_l);lcd_wrdata('/');
lcd_wrdata(0x30+month_h);lcd_wrdata(0x30+month_l);lcd_wrdata('/');
lcd_wrdata(0x30+date_h);lcd_wrdata(0x30+date_l);
lcd_wrcmd(0x8e);
lcd_wrdata(str_week[2*(week-1)]);
lcd_wrdata(str_week[2*week-1]);
//显示第二行
lcd_wrcmd(0xc4);
lcd_wrdata(0x30+hour_h);
lcd_wrdata(0x30+hour_l);
lcd_wrdata(':');
lcd_wrdata(0x30+minute_h);
lcd_wrdata(0x30+minute_l);
lcd_wrdata(':');
lcd_wrdata(0x30+second_h);
lcd_wrdata(0x30+second_l);
while(1)
{
t_h=read_temperature()/10;
t_l=read_temperature()%10;
if(read_temperature()>set_t) fan=1;
else if(read_temperature()<(set_t-1))fan=0;
read_time();
year_h=year/16;
year_l=year%16;
date_h=date/16;
date_l=date%16;
month_h=month/16;
month_l=month%16;
hour_h=hour/16;
hour_l=hour%16;
minute_h=minute/16;
minute_l=minute%16;
second_h=second/16;
second_l=second%16;
h=hour_h*10+hour_l;
m=minute_h*10+minute_l;
//*********************************************************
//利用实时时钟DS1302完成计时的功能
//思路:定义变量lock=second;然后读实时时钟
//当读出的second不等于lock时,表示时间过了一秒
//变量lock_time++,同时lock=second,等待下一秒的
//变化,当lock_time>40时,键盘上锁
//*********************************************************
if((second!=lock)&&(key_lock==0))
{
lock_time++;
lock=second;
}
if(lock_time>40)key_lock=1;
lcd_wrcmd(0xc2);
if(key_lock)lcd_wrdata(4);
else lcd_wrdata(' ');
if(f==1)
{
if((h==alarm_hour[0])&&(m==alarm_minute[0])&&(alarm_f==1))
{
lcd_wrcmd(1);
state=10;
break;
}
}
if(f_p==1)
{
if((h==alarm_hour[1])&&(m==alarm_minute[1])&&(alarm_f==1))
{
lcd_wrcmd(1);
state=10;
break;
}
}
if((h!=alarm_hour[0])||(m!=alarm_minute[0]))
{
f=1;
}
if((h!=alarm_hour[1])||(m!=alarm_minute[1]))
{
f_p=1;
}
lcd_wrcmd(0x80);
//显示第一行
lcd_wrcmd(0x83);
lcd_wrdata('2');
lcd_wrdata('0');
lcd_wrdata(0x30+year_h);lcd_wrdata(0x30+year_l);lcd_wrdata('/');
lcd_wrdata(0x30+month_h);lcd_wrdata(0x30+month_l);lcd_wrdata('/');
lcd_wrdata(0x30+date_h);lcd_wrdata(0x30+date_l);
lcd_wrcmd(0x8e);
lcd_wrdata(str_week[2*(week-1)]);
lcd_wrdata(str_week[2*week-1]);
//显示第二行
lcd_wrcmd(0xc4);
lcd_wrdata(0x30+hour_h);
lcd_wrdata(0x30+hour_l);
lcd_wrdata(':');
lcd_wrdata(0x30+minute_h);
lcd_wrdata(0x30+minute_l);
lcd_wrdata(':');
lcd_wrdata(0x30+second_h);
lcd_wrdata(0x30+second_l);
lcd_wrcmd(0xcd);
lcd_wrdata(0x30+t_h);
lcd_wrdata(0x30+t_l);
lcd_wrdata(2);
if(key_lock==1) //键盘上锁时,只有确定键有效
{
if(sw1==0)
{
for(j=0;j<4000;j++) delay(250);
while(sw1==0)
{
lock_time=0; //时间计数器清零
key_lock=0;
lcd_wrcmd(0xc2);
lcd_wrdata(' ');
}
}
}
else //键盘解锁时
{
ii=key();
if(ii!=0)
{
lcd_wrcmd(1);
state=1;
break;
}
}
}
}
uchar key()
{
uchar keycode=0,temp;
//键盘口,先置1
sw0=1; sw1=1;sw2=1;sw3=1;
sw4=1;sw4=1;
temp=P2&0x3f;
if(temp!=0x3f)
{
beep=beep_f;
delay(250);
//键盘口,先置1
sw0=1; sw1=1;sw2=1;sw3=1;
sw4=1;sw4=1;
temp=P2&0x3f;
if(temp!=0x3f)
{
if(temp==0x3e) keycode=6; //P20
else if(temp==0x3d) keycode=5; //P21
else if(temp==0x3b) keycode=4;
else if(temp==0x37) keycode=3;
else if(temp==0x2f) keycode=2;
else if(temp==0x1f) keycode=1;
}
while(temp!=0x3f)
{
temp=P2&0x3f;
}
beep=1;
}
return keycode;
}
void display(uchar cmd,uchar code *str)
{
uchar i=0;
lcd_wrcmd(cmd);
while(str[i]!='\0')
{
lcd_wrdata(str[i]);
i++;
}
}
delay(uchar d)
{
while(--d);
}
/**********判断忙标志,返回的是一个位BF**********/
bit lcd_busy(void)
{
uchar bflag;
rs=0;
rw=1;
_nop_();
e=1;
_nop_();
lcd_bus=0xff;
bflag=lcd_bus;
e=0;
return(bit)(bflag&0x80); //BF=1 busy
}
/*********写命令,有两个参数,第一个是要写的命令控制字,
第二个是用来控制是否进行忙标志的判断。
busyflag=1:判断;为 0:不判断****************/
void lcd_wrcmd(uchar cmd)
{
while(lcd_busy());
lcd_bus=cmd;
rs=0;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
/************向液晶片写数据***************/
void lcd_wrdata( uchar lcddata)
{
while(lcd_busy());
lcd_bus=lcddata;
rs=1;
rw=0;
_nop_();
e=1;
_nop_();
_nop_();
e=0;
}
void lcd_ini(void)
{
lcd_wrcmd(0x38);
delay(100);
lcd_wrcmd(0x0c);
delay(100);
lcd_wrcmd(0x06);
delay(100);
lcd_wrcmd(0x01);
delay(100);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -