📄 key.c
字号:
#define SET 0x20
#define LEFT 0x10
#define RIGHT 0x08
#define UP 0x04
#define DOWN 0x02
#define OK 0x01
#include <reg51.h>
extern unsigned char sec,min,hour;
extern unsigned char code table[16]; // 字形数据
extern unsigned char DispBuf[6];
unsigned char sec1,min1,hour1; //闹钟值
unsigned char Alarmsec,Alarmmin,Alarmhour;
unsigned char Alarm;
bit p1,p2; //12.24时转换标志位
unsigned char EditSec,EditMin,EditHour;
extern unsigned char KeyVal;
unsigned char CurKey,LastKey;
unsigned char KeySts;
void DisplayEdit()
{
DispBuf[0] = table[EditSec % 10];
DispBuf[1] = table[EditSec / 10];
DispBuf[2] = table[EditMin % 10];
DispBuf[3] = table[EditMin / 10];
DispBuf[4] = table[EditHour % 10];
DispBuf[5] = table[EditHour / 10];
DispBuf[6-KeySts] &= 0x7F;
} // 编辑期间的显示
void DisplayEditAlarm() //编辑闹钟期间的显示
{
DispBuf[0] = table[Alarmsec % 10];
DispBuf[1] = table[Alarmsec/ 10];
DispBuf[2] = table[Alarmmin % 10];
DispBuf[3] = table[Alarmmin / 10];
DispBuf[4] = table[Alarmhour % 10];
DispBuf[5] = table[Alarmhour / 10];
DispBuf[12-KeySts] &= 0x7F;
}
void Copy()
{
sec =EditSec;
min =EditMin;
hour =EditHour;
} // 编辑值刷新当前时间
void CopyAlarm()
{
sec1=Alarmsec;
min1=Alarmmin;
hour1=Alarmhour;
} // 编辑值刷新当前闹钟时间
void KeyPro(void)
{
unsigned char KeyPressed;
LastKey = CurKey;
CurKey = KeyVal;
KeyPressed = CurKey^LastKey;
if(KeyPressed==0) return; //检测键的变化
if(CurKey==0) return;// 键释放忽略
switch(KeySts)
{
case 0: // Set Key pressed while running
p1=p2=0;
if(KeyPressed==SET)
{
KeySts++;
}
EditSec = sec;
EditMin = min;
EditHour = hour;
if(KeyPressed==UP)
{
p1=1;
}
if(KeyPressed==DOWN)
{
p2=1;
}
break;
case 1: // hourHi edit status;
switch(KeyPressed)
{
case SET:KeySts+=6; Alarmsec =sec1;Alarmmin=min1;Alarmhour=hour1;break;//进入闹钟设定状态
case RIGHT: KeySts++; break;
case UP: if(EditHour<13) EditHour += 10;
else EditHour = 23;
break;
case DOWN: if(EditHour>10) EditHour -= 10;
else EditHour = 0;
break;
case OK: Copy();
KeySts=0;
break;
}
break;
case 2: // hourLo edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(EditHour<23) EditHour++;
break;
case DOWN: if(EditHour>0) EditHour--;
break;
case OK: Copy();
KeySts=0;
break;
}
break;
case 3: // minHi edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(EditMin<49) EditMin+=10;
else EditMin = 59;
break;
case DOWN: if(EditMin>10) EditMin-=10;
else EditMin = 0;
break;
case OK: Copy();
KeySts=0;
break;
} break;
case 4: // minLo edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(EditMin<59) EditMin++;
break;
case DOWN: if(EditMin>0) EditMin--;
break;
case OK: Copy();
KeySts=0;
break;
}
break;
case 5: // secHi edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(EditSec<49) EditSec+=10;
else EditSec = 59;
break;
case DOWN: if(EditSec>10) EditSec-=10;
else EditSec = 0;
break;
case OK: Copy();
KeySts=0;
break;
}
break;
case 6: // secLo edit status;
switch(KeyPressed)
{
case LEFT: KeySts--;
break;
case UP: if(EditSec<59) EditSec++;
break;
case DOWN: if(EditSec>0) EditSec--;
break;
case OK: Copy();
KeySts=0;
break;
}
break;
case 7: // alarmhourHi edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++; break;
case UP: if(Alarmhour<13) Alarmhour += 10;
else Alarmhour = 23;
break;
case DOWN: if(Alarmhour>10) Alarmhour -= 10;
else Alarmhour = 0;
break;
case OK: CopyAlarm();
KeySts=0; Alarm=1;
break;
}
break;
case 8: // alarmhourLo edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(Alarmhour<23) Alarmhour++;
break;
case DOWN: if(Alarmhour>0) Alarmhour--;
break;
case OK: CopyAlarm();
KeySts=0; Alarm=1;
break;
}
break;
case 9: // alarmminHi edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(Alarmmin<49) Alarmmin+=10;
else Alarmmin = 59;
break;
case DOWN: if(Alarmmin>10) Alarmmin-=10;
else Alarmmin = 0;
break;
case OK: CopyAlarm();
KeySts=0; Alarm=1;
break;
} break;
case 10: // minLo edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(Alarmmin<59) Alarmmin++;
break;
case DOWN: if(Alarmmin>0) Alarmmin--;
break;
case OK: CopyAlarm();
KeySts=0; Alarm=1;
break;
}
break;
case 11: // alarmsecHi edit status;
switch(KeyPressed)
{
case RIGHT: KeySts++;
break;
case LEFT: KeySts--;
break;
case UP: if(Alarmsec<49) Alarmsec+=10;
else Alarmsec = 59;
break;
case DOWN: if(Alarmsec>10) Alarmsec-=10;
else Alarmsec = 0;
break;
case OK: CopyAlarm();
KeySts=0;Alarm=1;
break;
}
break;
case 12: // alarmsecLo edit status;
switch(KeyPressed)
{
case LEFT: KeySts--;
break;
case UP: if(Alarmsec<59) Alarmsec++;
break;
case DOWN: if(Alarmsec>0) Alarmsec--;
break;
case OK: CopyAlarm();
KeySts=0;Alarm=1;
break;
}
break;
default:
KeySts = 0; break; // 默认的状态机出错处理
}
if(KeySts<7)
DisplayEdit(); //调用时钟显示函数
if(KeySts>=7)
DisplayEditAlarm(); //调用闹钟显示函数
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -