Chinaunix首页 | 论坛 | 博客
  • 博客访问: 601849
  • 博文数量: 165
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1554
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 22:57
个人简介

我本仁慈,奈何苍天不许

文章分类

全部博文(165)

文章存档

2018年(1)

2016年(33)

2015年(5)

2014年(34)

2013年(92)

分类: 嵌入式

2014-08-05 17:02:35

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


阅读(3917) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~