下面两段代码是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;
从这段代码不难看出,在前面的优先级高,如果前面的满足条件,后面的就不会响应。
上一篇:.\Obj\STM32-LD3320.axf: Error: L6200E: Symbol sRecog multiply defined
下一篇:STM32驱动5线4相步进电机部分代码(STM32F103RC+步进电机28BYJ-48)
- 热门资源推荐
- 热门放大器推荐
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用

非常经典的关于LLC的杨波博士论文
5962-89541022A

1-292148-8






京公网安备 11010802033920号