参考:2-5 按键进阶——独立按键的单击与双击(或多击)的编程实现_哔哩哔哩_bilibili
uchar KeyNum;
uchar key_lock_flag;
uint key_cnt;
uint key_cnt2;
uchar key_timers;
#define KEY_DELAY_TIME 20
#define KEY_LONG_TIME 1000
#define KEY_DOUBLE_TIME 500
void Key_Scan()
{
if(!KEY1) //如果按键没有被按下
{
key_lock_flag=0; //清零自锁标志
key_cnt=0; //清零计数标志
if(key_times > 0)
{
key_cnt2++;
if(key_cnt2 > KEY_DOUBLE_TIME) //按下松开时间较长
{
if(key_times == 1)
{
KeyNum=1; //按键单击
}
key_cnt2=0; //清除双击时间间隔
key_times=0; //清除按键次数
}
}
}
else if(!key_lock_flag)
{
key_cnt++;
if(key_cnt > KEY_DELAY_TIME)
{
key_cnt=0;
key_cnt2=0;
key_times++;
key_lock_flag=1;
if(key_times == 2)
{
KeyNum=11; //按键双击
}
if(key_times == 2)
{
KeyNum=111; //按键三连击
}
}
}
else if(key_cnt < KEY_LONG_TIME)
{
key_cnt++;
}
}
//定时器0中断服务函数(启动后每1MS进入一次)
void Timer0_ISR() interrupt 1 using 1
{
Key_Scan();
}
void Key_Service()
{
switch(KeyNum)
{
case 1:
BUZZER_ON(); //单击 蜂鸣器响
break;
case 11:
BUZZER_OFF();LED2_ON(); //双击 关闭蜂鸣器 LED2亮
break;
case 111:
LED2_OFF(); //三击 LED2灯关
break;
default:break;
}
}
void main(void)
{
//初始化....
while(1)
{
Key_Service();
}
}