STM32按键实验--连续闪烁的问题

发布者:自由探索最新更新时间:2024-09-29 来源: cnblogs关键字:STM32  按键实验 手机看文章 扫描二维码
随时随地手机看文章

下面两段代码是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; 
从这段代码不难看出,在前面的优先级高,如果前面的满足条件,后面的就不会响应。

关键字:STM32  按键实验 引用地址:STM32按键实验--连续闪烁的问题

上一篇:.\Obj\STM32-LD3320.axf: Error: L6200E: Symbol sRecog multiply defined
下一篇:STM32驱动5线4相步进电机部分代码(STM32F103RC+步进电机28BYJ-48)

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved