需求描述
描述:实现按键长按和短按的共同识别,兼容识别。使用轮询扫描法;当时间低于1s的按键松开就是短按,长按3秒之后松开就是长按;
使用轮询模式累加;不能使用阻塞等待;
程序
#define key_long_key_max_time 300
uint8_t long_key_mode_counter(uint8_t mode,uint16_t *key_cnt );
u8 KEY_Scan(u8 mode)
{
static uint16_t k1,k2,k3,k4;
static u8 key_up=1,key_old;//按键按松开标志
uint8_t key=0;
uint16_t *p;
if(mode)key_up=1; //支持连按 ,如果是支持连按,每次扫描到都松开了
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_Ms_Block(10);//去抖动
key_up=0;
if(KEY0==0) { key =1; key_old=key;}
else if(KEY1==0){key =2;key_old=key ;}
else if(KEY2==0){ key =3;key_old=key;}
else if(WK_UP==1){key = 4;key_old=key;}
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; //松开了 松开了再去判断长还是短按
if(mode)
{
if(key_up!=1 )//没松开
{ switch(key)
{
case 1:p=&k1;break;
case 2:p=&k2;break;
case 3:p=&k3;break;
case 4:p=&k4;break;
default : break;
}
long_key_mode_counter( mode, p);
if(k1>299)
{
k1=k1;
}
//return key=0;//只要没松开就返回0
}else//松开了
{ if(k1>key_long_key_max_time||k2>key_long_key_max_time||k3>key_long_key_max_time||k4>key_long_key_max_time)
{
if(k1>key_long_key_max_time) key=5;
if(k2>key_long_key_max_time) key=6;
if(k3>key_long_key_max_time) key=7;
if(k4>key_long_key_max_time) key=8;
}
else
{
key=key_old;
}
{k1=0;k2=0;k3=0;k4=0;key_old=0;}
return key;// 支持连按,这是返回
}
}
else{
return key;//不支持连按下,用这个返回
}
}
uint8_t long_key_mode_counter(uint8_t mode,uint16_t *key_cnt )
{
if(mode)
{
(*key_cnt)++;
if(*key_cnt>30000)
{ *key_cnt=30000;}
}
else
{
*key_cnt=0;
}
}