在一些特殊场景十八届智能车比赛中,不允许反复烧录程序以更改代码中的参数,故人机交互界面变得十分重要,在这里,我们通过按键输入以更改参数,避免了反复编译,烧录程序这一繁琐的过程。尤其是编译贼慢,插线贼麻烦的单片机
按键消抖指的是xxxxx(自行百度)
常用的方法是判断按键按下的时候进行一定的延时,代码如下:
if(gpio_get(KEY)==0){
delay_ms(20);//按下抖动
while(gpio_get(KEY)==0);//如果一直按下就一直循环
delay_ms(20);//松手抖动
beep();//蜂鸣器提示音
}
这种方法简单易懂,但是在人机交互界面的时候会有些许延迟,特别是有些队伍在智能车比赛过程中需要通过按键来修改阈值。一直点击按钮实现增减阈值,40ms的延时显得既不优雅又不顺畅。由于代码中有循环的部分,如果按键一直按下,其他程序就会收到影响,如果想做动态的界面,这种情况就会使得界面不那么丝滑。
数电中提到一种方法,运用基本SR锁存器消除机械开关触点抖动引起的脉冲输出,如下图
SR锁存器
Q为输出
事实上,软件上也可以使用这种“锁存”的思想
这里假设高电平输出有效,status是当前按键状态,last_status是上一次的按键状态
当status=1同时last_status=0时,输出有效值
具体代码如下:
int status=1;
int last_status=0;
last_status = status;//获取上一次的按键状态
status = gpio_get(KEY);//获取目前的按键状态
if(status && !last_status){
beep();//蜂鸣器提示音
}
delay_ms(10);//延迟10ms
分析过程如下:
按键逻辑图
如图所示,当按键没按下时,last_status 和 status都是高电平,在①处按键按下时,由于按键抖动,status在高低电平状态反复横跳,last_status跟着跳变,此时无法满足判断条件status && !last_status,此时就算一直按住按键,也不会输出有效值,并且代码中没有使用while循环,不会影响原来的程序运行。在②处按键松开的时候满足了条件status && !last_status,这个时候由于按键的抖动,可能会多次判断到松开,所以需要延时10ms。相对于上面那种方法,延时只需要进行一次。只要按键不放开,输出值就一直“锁存”在次态,即无效输出的状态,只有改变了按键状态(即松开按键),才改变输出值。
|