下面两段代码是STM32按键实验的按键扫描代码(两段代码标红的地方不同),但是却有两种不同的现象
1、u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按下松开标志
if(mode)key_up=1; //支持连续按下
if(key_up&&(KEY0==0||KEY1==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(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;//无按键按下
}
用假设法来推理这段代码:
当按下某个按键时,第一个if条件为真,程序往下执行,所以key_up=0,return某个对应值.
若此时按键没抬起,主程序再次执行按键扫描程序时第一个if条件不再满足,else也不在执行,直接执行return 0,执行完后仍然有key_up=0
按键抬起后第一个条件仍不满足,但满足最后一个判断所有键都松开的else if条件,因此key_up=1,从而可以响应下一次按键!!
所以这段代码执行的现象:当按键时LED灯是不会连续闪烁的
2、u8 KEY_Scan(u8 mode)
{
static u8 key_up=1;//按键按下松开标志
if(mode)key_up=1; //支持连续按下
if(key_up&&(KEY0==0||KEY1==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(WK_UP==1)return WKUP_PRES;
}else if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}
用假设法来推理这段代码:
当按下某个按键时,第一个if条件为真,程序往下执行,所以key_up=0,return某个对应值.
若此时按键没抬起,主程序再次执行按键扫描程序时第一个if条件不再满足,但是else执行,导致key_up = 1了,若按键还没有抬起,
第三次再进入key_scan函数时,又会进入if条件中去执行,然后return某个对应值,所以之前的LED状态会改变。。。
所以这段代码执行的现象:当按键时LED灯是会连续闪烁的。
至于说的支持连续按下,其实就是通过调用key_scan函数,传过来的参数,然后来改变key_up的值,道理类似上面的第二种情况,
这里是巧妙的利用了传参和变量来实现的。
随便提一句的是,这里按键响应是有一个优先级的,
if(KEY0==0)return KEY0_PRES;
else if(KEY1==0)return KEY1_PRES;
else if(WK_UP==1)return WKUP_PRES;
从这段代码不难看出,在前面的优先级高,如果前面的满足条件,后面的就不会响应。
阅读(3947) | 评论(0) | 转发(1) |