最近要写一个按键扫描函数,想起之前使用战舰开发板的时候,原子的按键扫描函数可以实现支持连按和不支持连按,但是当时没看懂它是怎么是实现的,今天拿出来细看了一下,终于有点思路了,在这里分享出。来以下是原子哥例程里面 的按键扫描函数:
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,WKUP按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
u8 KEY_Scan(u8 mode)
{
static u8 key_up=1; //按键松开标志
if(mode==1)key_up=1; //支持连按
if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
{
delay_ms(10);
key_up=0;
if(KEY0==0) return KEY0_PRES;
else if(KEY1==0) return KEY1_PRES;
else if(KEY2==0) return KEY2_PRES;
else if(WK_UP==1) return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0; //无按键按下
}
当 mode=1的时候,任意按键按下就会进入 if ,然后执行key_up=0,返回对应的按键,松手以后进入else if,执行key_up=0,当下一次有按键按下(或者没有松手),又能成功触发if条件。
当mode=0时,任意按键按下,进入if,执行key_up=0,返回对应按键。注意,如果此时我们不松手它无法进入else if ,也就是key_up一直等于0,所以,如果我们不松手,第一次返回对应按键后,再一次进入函数时,它不能进去if,也不能进入else ,就只能直接return 0 了。不能返回我们长按的按键。原子哥还是有大智慧的。