【软件模块】适用于所有单片机的按键扫描算法

佚名 2025-02-15

适用于所有单片机的按键扫描算法


单片机按键扫描是指利用微控制器(MCU)的数字输入口,定期检测按键的电平状态并进行去抖动处理(防止误操作),判断按键是否被按下或松开。

常用的按键有两种:自复式按键和自锁式按键。自复式按键按下就通,松开就断,不会锁住。自锁式按键按下一次就通并锁住,再按一次就断并弹回,需要两次操作。

本文介绍一种用于自复式按键的扫描算法,它有软件消抖功能,可以检测按键的短按和长按检测。


针对每一个独立按键,使用三个bits来标志按键的各个状态的转换:

  1. TrigFlag:按键被按下的触发标志,仅在按键被第一次检测到按下时置位为1,其它状态保持为0
  2. IdleFlag:按键被松开的触发标志,仅在按键被第一次检测到松开时置位为1,其它状态保持为0
  3. ContFlag:按键实时的状态标志,按键被检测到按下时为1,被检测到松开时为0
  4. ReadBit:扫描检测到的按键状态,按下时为1,松开时为0

以下一次按键过程中,这三个标志的状态变化情况:
按键状态变化
过程分析:

  1. 初始状态下,扫描按键状态,状态标志,,;
  2. 按下按键后,扫描按键状态,经计算处理,,;
  3. 再次扫描按键状态(消抖),经计算处理,,,
    标志由,,变到,,可以判断按键被按下;
  4. 保持按键按下,扫描按键状态,状态标志也将保持,,不再变化;
  5. 状态标志将保持为,,的时间达到设置的按键长按时间,可以判断按键被长按;
  6. 当松开按键后,扫描按键状态,经计算处理,,;
  7. 再次扫描按键状态(消抖),经计算处理,,,
    标志由,,变到,,可以判断按键被松开;
  8. 最后,按键状态将回到初始的松开状态,状态标志,,.

根据上述过程的第3,5,7步的状态变化,就确定出按键的真实工作状态。

根据上述原理,使用C语言实现了该按键扫描算法,完整代码如下:

头文件:bsp_key.h

 

源文件:bsp_key.c

 

注意:如果只使能按键短按检测,按键短按的回调函数将在按键被按下时调用;如果只使能按键长按检测,按键长按的回调函数将在按键被按下到达设定的时间后调用;如果同时使能按键短按和长按检测,按键短按的回调函数将在按键被松开时调用,按键长按的回调函数将在按键被按下到达设定的时间后调用。

使用方法

  1. 将代码文件拷贝到工程目录,并包含bsp_key.h头文件。
 
  1. 先实现自己的按键状态检测函数, 按键短按回调函数和按键长按回调函数,然后定义一个按键配置的结构体,结构体中为使能按键短按检测控制位,为使能按键长按检测控制位,为设置按键长按检测时间(实际时间 = 函数调用间隔时间 * ),,和分别为注册自己实现的三个接口函数。
 
  1. 在函数中定时调用函数,注意具体间隔时间可能需要按照使用按键的类型做一定调整。
 

1.新型的按键扫描程序,仅三行程序:https://www.amobbs.com/thread-4308630-1-1.html

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。

分享:

扫一扫在手机阅读、分享本文

平台注册入口