📄 key.c
字号:
/**************************************************************************************
* 子程序:底层程序 *
* 功能:按键处理,键值显示; *
* *
* *
***************************************************************************************/
# include "main.h"
# include "ds1302.h"
# include "nokia5110.h"
# include "delay.h"
# include "printf.h"
# include "eeprom.h"
uchar set=0; //按键选择标志位;
char key_flag=0;//按键加减标志位;
uchar menue=0; //菜单选择标志位;
uchar ok=0; //确认标志位;
char miao,fen,shi,ri,yue,zhou,nian;/*时间日期数值标志位;*/
uchar clocktable[5]; //分,时,星期;
char hour=7;
char minute=30;
char week2=1;
void Delay10ms() //@11.0592MHz
{
unsigned char i, j;
i = 108;
j = 145;
do
{
while (--j);
} while (--i);
}
void key()
{
EA=0;
/*判断选择按键是否按下;如果按下了当松开的时候让背光打开;set++;*/
if(keyswitch==0)
{
Delay10ms();
if(keyswitch==0)
{
Delay10ms();
while(keyswitch==0);
LCD_BLA=1;
if(set>8)set=0;
set++;
}
}
/*up和down按键的检测;加减标志位*/
if(keyup==0)
{ Delay10ms();
if(keyup==0)
{
LCD_BLA=1;
Delay10ms();
while(keyup==0);
key_flag++;
}
}
if(keydown==0)
{ Delay10ms();
if(keydown==0)
{
LCD_BLA=1;
Delay10ms();
while(keydown==0);
key_flag--;
}
}
if(keymenue==0)
{
Delay10ms();
if(keymenue==0) //菜单选择标志位;
{
Delay10ms();
while(keymenue==0);
LCD_BLA=1;
menue++;
if(menue>3)menue=0;
}
} if(keyok==0)
{
Delay10ms();
if(keyok==0) //确认标志位;
{ Delay10ms();
while(keyok==0);
ok++;
if(ok>1)ok=0;
set=0;LCD_BLA=0;TR0 = 0;
}
}
if(set>=2)TR0 = 0;
EA=1;
}
void set_date_time()
{
if(set==2)
{
// while(keyup==0|keydown==0);
{
miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];
miao=miao+key_flag;
if((key_flag<0)&(miao==0))miao=59;
if(miao>59)miao=0;
miao=miao%10+(miao/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x80,miao);
Write_Ds1302(0x8E,0x80);
}
}
if(set==3)
{
// while(keyup==0||keydown==0);
{
fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];
fen=fen+key_flag;
if(fen>59)
{
fen=0;
}
if((key_flag<0)&&(fen<0))
{
fen=59;
}
fen=fen%10+(fen/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x82,fen);
Write_Ds1302(0x8E,0x80);
}
}
if(set==4)
{
// while(keyup==0||keydown==0);
{
shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];
shi=shi+key_flag;
if(shi>23)shi=0;
if((key_flag<0)&&(shi<0))shi=23;
shi=shi%10+(shi/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x84,shi);
Write_Ds1302(0x8E,0x80);
}
}
if(set==5)
{
// while(keyup==0||keydown==0);
{
ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];
ri=ri+key_flag;
if(ri>31)ri=1;
if((key_flag<0)&&(ri<1))ri=31;
ri=ri%10+(ri/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x86,ri);
Write_Ds1302(0x8E,0x80);
}
}
if(set==6)
{
//while(keyup==0||keydown==0);
{
yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];
yue=yue+key_flag;
if(yue>12)yue=1;
if((key_flag<0)&&(yue<1))yue=12;
yue=yue%10+(yue/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x88,yue);
Write_Ds1302(0x8E,0x80);
}
}
if(set==7)
{
//while(keyup==0||keydown==0);
{
zhou=l_tmpdisplay[12];
zhou=zhou+key_flag;
if(zhou>7)zhou=1;
if((key_flag<0)&&(zhou<1))zhou=7;
zhou=zhou%10+(zhou/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x8A,zhou);
Write_Ds1302(0x8E,0x80);
}
}
if(set==8)
{
// while(keyup==0||keydown==0);
{
nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;;
if(nian>79)nian=0;
if((key_flag<0)&&(nian<0))nian=79;
nian=nian%10+(nian/10)*16;
Write_Ds1302(0x8E,0x00);
Write_Ds1302(0x8C,nian);
Write_Ds1302(0x8E,0x80);
}
}
key_flag=0;
}
void caidan()
{
uchar counter;
uchar function;
/*光标显示位置控制*/
if(menue==0)
{
LCD_write_hanzi(0,4,10);Delay1ms(120);LCD_write_hanzi(0,0,3);Delay1ms(120);LCD_write_hanzi(0,2,10);LCD_write_hanzi(4,0,10);
}
else if(menue==1)
{
LCD_write_hanzi(0,0,10);Delay1ms(120);LCD_write_hanzi(0,2,3);Delay1ms(120);LCD_write_hanzi(0,4,10);LCD_write_hanzi(4,0,10);
}
else if(menue==2)
{
LCD_write_hanzi(0,2,10);Delay1ms(120);LCD_write_hanzi(0,4,3);Delay1ms(120);LCD_write_hanzi(0,0,10);LCD_write_hanzi(4,0,10);
}
else if(menue==3)
{LCD_write_hanzi(0,4,10);Delay1ms(120);LCD_write_hanzi(0,0,10);Delay1ms(120);LCD_write_hanzi(0,2,10);LCD_write_hanzi(4,0,28);}
else
{
LCD_write_hanzi(0,4,10);Delay1ms(120);LCD_write_hanzi(0,0,3);Delay1ms(120);LCD_write_hanzi(0,2,10);LCD_write_hanzi(4,0,10);
}
for(function=0;function<2;function++)
{
LCD_write_hanzi(function+1,0,function+4);
LCD_write_hanzi(function+1,2,function+6);
LCD_write_hanzi(function+1,4,function+8);
}
if(set<2)
{
TR0 = 1;
if(TF0==1)
{
counter++;
TF0=0;
}
if(counter==100)
{
counter=0;LCD_BLA=0;TR0 = 0;
if(menue==0)ok=1;
}
}
}
/*闹钟程序 */
void clock()
{
Read_RTC();//读取时钟;
data_change();//时钟数据处理
if(set==2)
{
// while(keyup==0||keydown==0);
{
minute+=key_flag;
if((key_flag<0)&(minute==0))minute=59;
if(minute>59)minute=0;
EA=0;//使用iap功能时关闭中断;
hour=R_EROM(1,2);//读闹钟小时数据;
week2=R_EROM(1,3);//读闹钟分数据;
C_EROM(1);
W_EROM(1,1,minute); //写闹钟分数据;
W_EROM(1,2,hour); //写闹钟小时数据;
W_EROM(1,3,week2);//写闹钟星期数据;
EA=1;//不使用iap功能时打开中断;
}
key_flag=0;
}
if(set==3)
{
// while(keyup==0||keydown==0);
{
hour=hour+key_flag;
if(hour>23)hour=0;
if((key_flag<0)&&(hour<0))hour=23;
}
EA=0;//使用iap功能时关闭中断
minute=R_EROM(1,1);
week2=R_EROM(1,3);
C_EROM(1);
W_EROM(1,1,minute);
W_EROM(1,2,hour);
W_EROM(1,3,week2);
EA=1;//不使用iap功能时打开中断;
key_flag=0;
}
if(set==4)
{
// while(keyup==0||keydown==0);
{
week2=week2+key_flag;
if(week2>7)week2=1;
if((key_flag<0)&&(week2<1))week2=7;
}
EA=0;//使用iap功能时关闭中断
minute=R_EROM(1,1);
hour=R_EROM(1,2);
C_EROM(1);
W_EROM(1,1,minute);
W_EROM(1,2,hour);
W_EROM(1,3,week2);
EA=1;//不使用iap功能时打开中断;
key_flag=0;
}
EA=0;//使用iap功能时关闭中断
minute=R_EROM(1,1);
hour=R_EROM(1,2);
week2=R_EROM(1,3);
EA=1;//不使用iap功能时打开中断;
clocktable[0]=minute/10;//分十位;
clocktable[1]=minute%10;//分个位
clocktable[2]=hour/10; //时十位
clocktable[3]=hour%10; //时个位
clocktable[4]=week2; //星期;
LCD_write_hanzi(2,0,28);
LCD_write_shu(1,2,clocktable[2]);
LCD_write_shu(2,2,clocktable[3]);//时
LCD_write_shu(3,2,64);
LCD_write_shu(4,2,clocktable[0]);
LCD_write_shu(5,2,clocktable[1]);//分;
if(clocktable[4]==1)
{
LCD_write_6x8shu(10,3,23);
LCD_write_6x8shu(11,3,25);
LCD_write_6x8shu(12,3,24);
}
if(clocktable[4]==2)
{
LCD_write_6x8shu(10,3,30);
LCD_write_6x8shu(11,3,31);
LCD_write_6x8shu(12,3,15);
}
if(clocktable[4]==3)
{
LCD_write_6x8shu(10,3,33);
LCD_write_6x8shu(11,3,15);
LCD_write_6x8shu(12,3,14);
}
if(clocktable[4]==4)
{
LCD_write_6x8shu(10,3,30);
LCD_write_6x8shu(11,3,18);
LCD_write_6x8shu(12,3,31);
}
if(clocktable[4]==5)
{
LCD_write_6x8shu(10,3,16);
LCD_write_6x8shu(11,3,28);
LCD_write_6x8shu(12,3,19);
}
if(clocktable[4]==6)
{
LCD_write_6x8shu(10,3,29);
LCD_write_6x8shu(11,3,11);
LCD_write_6x8shu(12,3,30);
}
if(week2==7)
{
LCD_write_6x8shu(10,3,29);
LCD_write_6x8shu(11,3,31);
LCD_write_6x8shu(12,3,24);
}
switch(set)
{
case 0: LCD_write_6x8shu(10,4,96);LCD_write_6x8shu(11,4,96);LCD_write_6x8shu(12,4,96);LCD_write_6x8shu(13,4,96);break;
case 1: LCD_write_6x8shu(10,4,96);LCD_write_6x8shu(11,4,96);LCD_write_6x8shu(12,4,96);LCD_write_6x8shu(13,4,96);break;
case 2: Delay100ms();LCD_write_shu(4,2,76);LCD_write_shu(5,2,76);Delay100ms(); LCD_write_6x8shu(10,4,96);LCD_write_6x8shu(11,4,23);LCD_write_6x8shu(12,4,45);LCD_write_6x8shu(13,4,50);break;
case 3: Delay100ms();LCD_write_shu(1,2,76);LCD_write_shu(2,2,76);Delay100ms(); LCD_write_6x8shu(10,4,18);LCD_write_6x8shu(11,4,51);LCD_write_6x8shu(12,4,57);LCD_write_6x8shu(13,4,54);break;
case 4: Delay100ms();LCD_write_6x8shu(10,3,98);LCD_write_6x8shu(11,3,98);LCD_write_6x8shu(12,3,98);Delay100ms(); LCD_write_6x8shu(10,4,33);LCD_write_6x8shu(11,4,41);LCD_write_6x8shu(12,4,41);LCD_write_6x8shu(13,4,47);break;
default:LCD_write_6x8shu(10,4,96);LCD_write_6x8shu(11,4,96);LCD_write_6x8shu(12,4,96);LCD_write_6x8shu(13,4,96);set=0;break;
}
}
void checkclock()
{
key();
if((hour==(l_tmpdisplay[6]*10+l_tmpdisplay[7]))&&(minute==(l_tmpdisplay[8]*10+l_tmpdisplay[9]))&&(week2==l_tmpdisplay[12])&&(set==0))
{ beep=0;}
else
beep=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -