一是GPIO口直接检测单个按键,如图1.1所示; 二是按键较多则使用矩阵键盘,如图1.2所示; 三是将按键接到外部中断引脚上,利用按键按下产生的边沿信号进行按键检测,如图1.3所示;
在以上三种设计上,各有优点和不足。
第二种,优点是能够在有限的GPIO情况下,扩展尽可能多的按键。但缺点同上,需要不停检测按键是否按下。
改进一:在原方案一的基础上,加上与门电路,使得任何一个按键按下,都能产生中断,然后在中断里面识别是哪个按键被按下。因此不需要循环扫描,大大提高了效率。方案如图1.5所示。 只需要每个按键对应地增加一个二极管,利用二极管的线与特性,可以实现按下任何按键,都能产生中断信号,但是按键之间互不影响。二极管选用普通整流二极管即可,本人亲测可行。
图1.6 改进二
改进三:因为按键不可避免的有抖动,因此按键消抖可以通过硬件消抖和软件消抖。现在分享一个十分简单且有效的硬件消抖方法:给按键并联一个104左右的电容。软件上基本不用处理即可避免抖动。
但需注意两点,一是定时器的定时时间,不可过长也不可过短,过长容易检测不到按下,过短会占用大量时间资源。二是中断服务程序需简单明了,只做检测用,通过全局变量传递,在主循环内完成按键响应,中断服务函数内尽量不要占用太多时间。
|