📄 key.c
字号:
//****************************************************************
//FILE: key.c
//功能: 按键识别和按键处理
//****************************************************************
#include <REG931.H>
#include"main.h"
#include"pcf8576d.h"
#include"time.h"
#include"ctime.h"
#include"spi.h"
//****************************************************************
uchar KeyNum; //按键ID
bit KeyFlag; //按键有效标志
uchar ModifyP; //修改状态指示()0-2
uchar Mode; //系统模式
//****************************************************************
void KeyPressed() interrupt 7 //按键中断服务函数
{
uint delay; //延时变量
KeyFlag =1; //置位按键有效标志
for(delay=10000;delay>0;delay--); //延时去抖动
if(!MODEKEY) //如果是模式按键
{
KeyNum=1; //按键ID设为1
if(Mode<8)
Mode++; //模式<8模式加1
else
Mode=1; //否则模式设置为1
while(!MODEKEY); //等待按键释放
}
else if(!MODIFY) //如果是MODIFY按键
{
KeyNum=2; //把按键盘ID设为2
while(!MODIFY); //等待按键释放
}
else if(!ADD) //如果是ADD按键
{
KeyNum=3; //把按键ID设为3
while(!ADD); //等待按键释放
}
else if(!DEC) //如果是ADDH按键
{
KeyNum=4; //把按键ID设为4
while(!DEC); //等待按键释放
}
else if(!ENTER) //如果是确认按键
{
KeyNum=5; //将按键ID设为5
while(!ENTER); //等待按键释放
}
else KeyFlag=0; //无效按键,清楚按键标志
for(delay=10000;delay>0;delay--); //延时去抖动
KBCON=0x00; //清楚按键中断标志
}
//****************************************************************
void ModeKeyP() //模式键服务程序
{
SendDatTo595(0xff<<Mode); //指示当前模式
if(Mode==2) //如果是星期模式
GetWeek(); //需要进行公历到星期的换算
if(Mode==5) //如果是农历模式
ConvertDate(); //需要将进行农历换算
PCF8576Mode(1); //显示当前模式内容
ModifyP=0; //清零修改状态
}
//****************************************************************
void AddorDecKeyP() //加或减按键服务程序
{
bit modifytype;
if(ModifyP!=0) //如果当前修改状态有效
{ //则进行数据调整
if(KeyNum==3) //如果是ADD按键
modifytype=1; //置修改类型为1(加)
else //否则置为0(减)
modifytype=0;
if(Mode==1) //如果是时间模式
{
if(ModifyP==1) //修改状态为1(状态只有0,1,2)
ModifyHour(modifytype); //则对小时进行修改
else //为2则对分钟进行修改
ModifyMinute(modifytype);
}
else if(Mode==3) //如果是日期模式
{
if(ModifyP==1) //修改状态为1
ModifyMonth(modifytype);//则对月进行修改
else
ModifyDay(modifytype); //否则对日进行修改
}
else if(Mode==4) //如果是年模式
{
ModifyYear(modifytype); //则对年进行修改
}
else if(Mode==7) //如果是闹钟模式
{
if(ModifyP==1) //状态为1,则对闹钟小时修改
ModifyAlarmHour(modifytype);
else //否则对闹钟分钟进行修改
ModifyAlarmMinute(modifytype);
}
}
}
//****************************************************************
void ModifyKeyP() //修改按键服务函数
{
if(Mode==1||Mode==3||Mode==4||Mode==7)//判断是否是可修改模式
{
if(Mode==4) //如果是年模式,状态设置为2
ModifyP=2; //只允许修改低位(0-99)
else //如果是其它可修改模式
{
if(ModifyP<2) //使状态在1和2之间切换
ModifyP++; //置为2
else
ModifyP--; //置为1
}
}
}
//****************************************************************
void KeyProcess() //按键处理函数
{
if(KeyNum==1) //如果是模式按键
ModeKeyP(); //调用模式键服务程序
else if(KeyNum==2) //如果是修改按键
ModifyKeyP(); //调用修改按键服务
else if(KeyNum==3||KeyNum==4) //如果是加减键
AddorDecKeyP(); //调用加减服务
else if(KeyNum==5) //如果是确认键
ModifyP=0; //清楚修改状态
}
//*****************************END********************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -