【软件模块】适用于所有单片机的按键扫描算法
单片机按键扫描是指利用微控制器(MCU)的数字输入口,定期检测按键的电平状态并进行去抖动处理(防止误操作),判断按键是否被按下或松开。
常用的按键有两种:自复式按键和自锁式按键。自复式按键按下就通,松开就断,不会锁住。自锁式按键按下一次就通并锁住,再按一次就断并弹回,需要两次操作。
本文介绍一种用于自复式按键的扫描算法,它有软件消抖功能,可以检测按键的短按和长按检测。
针对每一个独立按键,使用三个bits来标志按键的各个状态的转换:
- TrigFlag:按键被按下的触发标志,仅在按键被第一次检测到按下时置位为1,其它状态保持为0
- IdleFlag:按键被松开的触发标志,仅在按键被第一次检测到松开时置位为1,其它状态保持为0
- ContFlag:按键实时的状态标志,按键被检测到按下时为1,被检测到松开时为0
- ReadBit:扫描检测到的按键状态,按下时为1,松开时为0
以下一次按键过程中,这三个标志的状态变化情况:
过程分析:
- 初始状态下,扫描按键状态,状态标志,,;
- 按下按键后,扫描按键状态,经计算处理,,;
- 再次扫描按键状态(消抖),经计算处理,,,
标志由,,变到,,可以判断按键被按下; - 保持按键按下,扫描按键状态,状态标志也将保持,,不再变化;
- 状态标志将保持为,,的时间达到设置的按键长按时间,可以判断按键被长按;
- 当松开按键后,扫描按键状态,经计算处理,,;
- 再次扫描按键状态(消抖),经计算处理,,,
标志由,,变到,,可以判断按键被松开; - 最后,按键状态将回到初始的松开状态,状态标志,,.
根据上述过程的第3,5,7步的状态变化,就确定出按键的真实工作状态。
根据上述原理,使用C语言实现了该按键扫描算法,完整代码如下:
头文件:bsp_key.h
源文件:bsp_key.c
注意:如果只使能按键短按检测,按键短按的回调函数将在按键被按下时调用;如果只使能按键长按检测,按键长按的回调函数将在按键被按下到达设定的时间后调用;如果同时使能按键短按和长按检测,按键短按的回调函数将在按键被松开时调用,按键长按的回调函数将在按键被按下到达设定的时间后调用。
使用方法
- 将代码文件拷贝到工程目录,并包含bsp_key.h头文件。
- 先实现自己的按键状态检测函数, 按键短按回调函数和按键长按回调函数,然后定义一个按键配置的结构体,结构体中为使能按键短按检测控制位,为使能按键长按检测控制位,为设置按键长按检测时间(实际时间 = 函数调用间隔时间 * ),,和分别为注册自己实现的三个接口函数。
- 在函数中定时调用函数,注意具体间隔时间可能需要按照使用按键的类型做一定调整。
1.新型的按键扫描程序,仅三行程序:https://www.amobbs.com/thread-4308630-1-1.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权本站发表,未经许可,不得转载。