📄 keycontrol.c
字号:
else
{
task++; //按键状态转入重复的延缓阶段
keycnt = 0; //按键年龄清零
}
}
break;
case 1: //重复的延缓阶段
if(keycnt == MaxRate) //按键年龄等于重复的延缓时间
{
enflash = 0; //不允许闪烁
keyprocess = 1; //进行键值处理
keycnt = 0; //按键年龄清零
task++; //按键状态转入重复阶段
}
break;
case 2: //重复阶段
if(keycnt == MinRate) //重复时间到
{
enflash = 0; //不允许闪烁
keyprocess=1; //进行按键值处理
keycnt=0; //按键年龄清零
}
break;
}
}
}
}
}
/***********************************************************************************
*函数原型:void key_handler()
*功能:按键1处理
*说明:正常工作模式下,按下按键1即进入设定状态,此时第一个数码管闪烁,同时对应LED1的指示灯亮。
* 设定模式下,按下按键1,在LED1和LED4之间循环切换选择被选中的数码管闪烁,相应的指示灯亮
************************************************************************************/
void key1_handler()
{
if(!keymark) //进入设定状态
{
led_buf[0] = 0xFE; //点亮第一个LED
pb=&led_buf[1]; //pb指向第一个数码管
blink=0x08; //第一位数码管闪烁
keymark=1;
enflash=1; //允许闪烁
}
else
{
pb++; //指向下一个数码管
blink>>=1; //该数码管闪烁
led_buf[0]=_crol_(led_buf[0],2); //调整指示灯
if(pb>=(uchar*)(led_buf+5))
{
pb=&led_buf[1];
blink=0x08; //第一个数码管闪烁
}
}
}
/***********************************************************************************
*函数原型:void key2_handler()
*功能:按键2处理
*说明:设定状态下,每执行一次选中的数码管的显示数值加1,
* 常按数值以一定速度连续递增,当数值大于9时又回到0;
* 正常状态下,按该键无效
************************************************************************************/
void key2_handler()
{
if(keymark)
{
*pb+=1;
if(*pb==0x0A)
*pb=0x00;
}
}
/***********************************************************************************
*函数原型:void key3_handler()
*功能:按键3处理
*说明:设定状态下,每执行一次选中的数码管的显示数值减1,
常按数值以一定速度连续递减,当数值等于0时又回到9;
正常状态下,按该键无效
************************************************************************************/
void key3_handler()
{
if(keymark)
{
if(*pb==0) *pb=9;
else *pb-=1;
}
}
/***********************************************************************************
*函数原型:void key4_handler()
*功能:按键4处理
*说明:该键为确定键,按下后熄灭指示灯,不闪烁,进入工作状态
************************************************************************************/
void key4_handler()
{
blink=0x00;
led_buf[0]=0xFF;
keymark=0;
}
/***********************************************************************************
*函数原型:void keymix_handler()
*功能:复合键(上档键5+功能键8)处理
*说明:执行复位功能。4个数码管全显0,不闪烁。8个指示灯全灭,进入正常工作方式
************************************************************************************/
void keymix_handler()
{
led_buf[0]=0xFF;
led_buf[1]=0x00;
led_buf[2]=0x00;
led_buf[3]=0x00;
led_buf[4]=0x00;
keymark=0;
blink=0x00;
}
/***********************************************************************************
*函数原型:void key_processing()
*功能:键值处理
*说明:根据键值执行相应按键功能
*参数:keyprocess keypre[1] keypre[0]
************************************************************************************/
void key_processing()
{
if(keyprocess) //keyprocess为1时,函数实体才被执行
{
keydone=0;
keyprocess=0;
switch(keypre[1])
{
case 0x00:
switch(keypre[0])
{
case 0x01:key1_handler();break;
case 0x02:key2_handler();break;
case 0x03:key3_handler();break;
case 0x04:key4_handler();break;
}
break;
case 0x05:
if(keypre[0]==8)
keymix_handler();
break;
}
keydone = 1;
}
}
/***********************************************************************************
*函数原型:void timer0() interrupt 1
*功能:定时器0中断服务程序
*说明:键盘和LED一起构成1/6扫描,每6次中断进行一次键盘处理
************************************************************************************/
void timer0() interrupt 1
{
TH0=V_TH0;
TL0=V_TL0; //时间常数重载
if(state<=4)
{
lflash();
display(state);
state++;
}
else
{
key();
state=0;
}
}
/***********************************************************************************
*函数原型:void main()
*功能:主程序,执行初始化操作,循环等待按键事件
*说明:无
************************************************************************************/
void main()
{
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0; //定时器T0初始化
TR0=1;
ET0=1;
EA=1;
task=0x00;
state=0x00; //标量和变量初始化
keyprocess=0;
keydone=1;
ledtime=ledshow;
ledtask=0;
keymark=0;
while(1)
{
key_processing();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -