📄 key_scan.c
字号:
#include<reg52.h>
#include<ds1307.h>
#define KEY_IDEL 0x00
#define KEY_DELAY 0x01
#define WAIT_KEY_OPEN 0x02
#define DISP_TIME 0x03
#define SET_TIME 0x04
#define SET_ALARM_TIME 0x05
#define DISP_ALARM_TIME 0x06
#define KEY_STATE 0xff
#define KEY_DELAY_TIME 10
sbit BEEP=P1^2;
unsigned char time_base;
unsigned char led_buf[6];
unsigned char disflag[6]={0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char KeyDelaytime;
unsigned char key;
unsigned char Key_v;
unsigned char Key45_v;
unsigned char Keystate;
unsigned char n,flag;
unsigned char Sec, Min, Hrs;
unsigned char Machine_State;
unsigned char led_control;
unsigned char alarm_disp_contol;
unsigned char alarm_conter;
unsigned char alarm_time[9][2];
void key_pro(unsigned char Key_v)
{
unsigned char min_low,min_high,hrs_low,hrs_high,i;
// unsigned char min_lowtemp,min_hightemp,hrs_lowtemp,hrs_hightemp;
switch(Key_v&0xff)
{
case 0xfe ://功能键
switch(Machine_State)
{
case DISP_TIME:
led_control=1;
Machine_State=SET_TIME;
for(i=0;i<6;i++)
{
led_buf[i]=zimo[0];
}
led_buf[4]=zimo[1];
break;
case SET_TIME:
led_control=1;
Machine_State=SET_ALARM_TIME;
for(i=0;i<6;i++)
{
led_buf[i]=zimo[0];
}
led_buf[4]=zimo[2];
break;
case SET_ALARM_TIME:
Machine_State=DISP_ALARM_TIME;
for(i=0;i<6;i++)
{
led_buf[i]=zimo[0];
}
led_buf[4]=zimo[3];
break;
case DISP_ALARM_TIME:
Machine_State=DISP_TIME;
break;
}
break;
case 0xfd ://确认键
switch(Machine_State)
{
case DISP_TIME:
BEEP=0;
case SET_TIME:
switch(led_control)
{
case 2:
min_low=Key45_v;
break;
case 3:
min_high=Key45_v;
break;
case 4:
hrs_low=Key45_v;
break;
case 5:
hrs_high=Key45_v;
break;
}
Key45_v=0;
led_control++;
if(led_control==6)
{
Sec=0x00;
Min=(min_high<<4)|min_low;
Hrs=(hrs_high<<4)|hrs_low;
Init_Rtc(Sec,Min,Hrs);
Machine_State=DISP_TIME;
led_control=0;
}
break;
case SET_ALARM_TIME:
switch(led_control)
{
case 2:
min_low=Key45_v;
break;
case 3:
min_high=Key45_v;
break;
case 4:
hrs_low=Key45_v;
break;
case 5:
hrs_high=Key45_v;
break;
}
Key45_v=0;
led_control++;
if(led_control==6)
{
alarm_time[alarm_conter][0]=(min_high<<4)|min_low;
alarm_time[alarm_conter][1]=(hrs_high<<4)|hrs_low;
alarm_conter++;
led_control=0;
if(alarm_conter==9)
{
alarm_conter=0;
}
Machine_State=DISP_TIME;
}
break;
case DISP_ALARM_TIME:
alarm_disp_contol++;
if(alarm_disp_contol==alarm_conter)
{
Machine_State=DISP_TIME;
alarm_disp_contol=0;
}
break;
}
break;
case 0xfb ://调节亮度键
key++;
if(key==8)key=0;
break;
case 0xf7 ://增加键
Key45_v++;
if(Key45_v==10)Key45_v=0;
break;
case 0xef ://减少键
Key45_v--;
if(Key45_v==-1)Key45_v=9;
break;
}
}
void scan_key()
{
switch(Keystate)
{
case KEY_IDEL :
Key_v=P3;
if(Key_v!=KEY_STATE)
{
Keystate=KEY_DELAY;
KeyDelaytime=0;
P3=0xff;
}
break;
case KEY_DELAY :
if(KeyDelaytime>=KEY_DELAY_TIME)
{
P3=0xff;
Key_v=P3;
if(Key_v!=KEY_STATE)
{
key_pro(Key_v);
Keystate=WAIT_KEY_OPEN;
}
else
{
Keystate=KEY_IDEL;
}
}
break;
case WAIT_KEY_OPEN :
P3=0xff;
Key_v=P3;
if(Key_v==KEY_STATE)Keystate=KEY_IDEL;
break;
}
}
int main()
{
// unsigned char min_low,min_high,hrs_low,hrs_high;
unsigned char min_lowtemp,min_hightemp,hrs_lowtemp,hrs_hightemp;
P0 = 0xff;
P2 = 0xff;
TMOD = 0x01;
TH0 = 0xfe;
TL0 = 0x0c;
IE = 0x82;
flag=0;
key=0;
alarm_disp_contol=0;
BEEP=0;
Key45_v=0;
led_control=0;
alarm_conter=0;
Keystate=KEY_IDEL;
Machine_State=DISP_TIME;
TR0=1;
while(1)
{
scan_key();
switch(Machine_State)
{
case DISP_TIME :
disp_time();
for(i=0;i<alarm_conter;i++)
{
if(Min==alarm_time[i][0]&&Hrs==alarm_time[i][1])
{
BEEP=1;
}
else
{
BEEP=0;
}
}
break;
case SET_TIME:
led_buf[led_control]=zimo[Key45_v];
break;
case SET_ALARM_TIME:
led_buf[led_control]=zimo[Key45_v];
break;
case DISP_ALARM_TIME:
led_buf[4]=zimo[alarm_disp_contol+1];
min_hightemp=(alarm_time[alarm_disp_contol][0]&0xf0)>>4;
min_lowtemp=alarm_time[alarm_disp_contol][0]&0x0f;
hrs_hightemp=(alarm_time[alarm_disp_contol][1]&0xf0)>>4;
hrs_lowtemp=alarm_time[alarm_disp_contol][1]&0x0f;
led_buf[3]=zimo[hrs_hightemp];
led_buf[2]=zimo[hrs_lowtemp];
led_buf[1]=zimo[min_hightemp];
led_buf[0]=zimo[min_lowtemp];
break;
}
}
}
void timer0(void) interrupt 1
{
TH0=0xfe;
TL0=0x0c;
KeyDelaytime++;
time_base++;
if(flag<key+1)
{
P0=led_buf[n];
P2=disflag[n];
}
else
{
P2=0x00;
P0=0;
}
flag++;
if(flag==8)
{
n++;
if(n==6)
{
n=0;
}
flag=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -