一,若判断有按键按下,延迟10ms,延迟过后若按键还是按下,则判定为“按下”;[/mw_shl_code]
一,若判断有按键松开,延迟10ms,延迟过后若按键还是松开,则判定为“松开”。[/mw_shl_code]
原程序只判断了一次。
详见见流程图。[/mw_shl_code]
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按松开标志
static u8 oldkey=1;//老按键:松开
u8 newkey;//新按键
u8 fangdou; //防抖
if(KEY1==0||KEY2==0||KEY3==0) //有键按下
newkey=0; //新按键:按下
else newkey=1; //新按键:松开
if(newkey==oldkey) //新按键=老按键?
fangdou=1; //防抖成功
else fangdou=0; //防抖失败
oldkey=newkey; //更新老按键
if(mode)key_up=1; //支持连按
if(key_up&&fangdou&&(KEY1==0||KEY2==0||KEY3==0)) //加入了fangdou防抖成功
{
delay_ms(10);//去抖动
key_up=0;
if(KEY1==0)return K1;
else if(KEY2==0)return K2;
else if(KEY3==0)return K3;
}else if(fangdou&&(KEY1==1&&KEY2==1&&KEY3==1)) //加入了fangdou防抖成功
key_up=1;
return 0;// 无按键按下[/mw_shl_code]
}
[/mw_shl_code]