标题: 关于STM32用定时器配合做按键消抖的程序,请大神们看看我写的有啥毛病没,恳请指导 [打印本页]

作者: 27376054    时间: 2021-6-21 08:53
标题: 关于STM32用定时器配合做按键消抖的程序,请大神们看看我写的有啥毛病没,恳请指导
思路是这样的,通过定时器TIM5,其实哪个定时器都行,5毫秒进入中断一次,然后创建个函数检测IO口的状态,每次进入中断执行一下函数体的变量左移一位,变量声明是char型,5*8=40毫秒来进行消抖,这样不需要Delay这样的函数来占用系统的运行时间,这个函数已经通过测试能用,但不知道这样的方法有啥好处,有啥不好处,还有函数体有没有什么再优化的地方。请大神们过目

51hei图片_20210621084910.jpg (237.8 KB, 下载次数: 81)

按键检测的函数体,放在TIM5中断函数中每次调用

按键检测的函数体,放在TIM5中断函数中每次调用

51hei图片_20210621084918.jpg (221.44 KB, 下载次数: 74)

主程序中执行LED灯的亮与灭

主程序中执行LED灯的亮与灭

51hei图片_20210621084924.jpg (229.61 KB, 下载次数: 58)

按键没按下时候LED1不亮

按键没按下时候LED1不亮

51hei图片_20210621084930.jpg (228.76 KB, 下载次数: 63)

按下弹起LED1亮,一次重复,开关开关

按下弹起LED1亮,一次重复,开关开关

作者: rayin    时间: 2021-6-21 09:23
好处就是,按键扫描期间,CPU不用死等可以干别的事务,不好的地方需要:占用一个定时器硬件资源来完成扫描动作,延时等待是纯软件方式完成的,各有优点,自己按项目做好规划取舍。
作者: 黄youhui    时间: 2021-6-21 09:42
好处。
1. 可以进行多个按键测检测,即组合按键检测
2.按键检测函数不会占用太多CPU时间

坏处。
1必须确保按键时长大于40ms,且中断不会被其中断打断
2标志位刷新机制不合理,如标志位改变需要40ms,这40ms里面按键标志位被主函数调用多少次?

作者: 黄youhui    时间: 2021-6-21 09:58
黄youhui 发表于 2021-6-21 09:42
好处。
1. 可以进行多个按键测检测,即组合按键检测
2.按键检测函数不会占用太多CPU时间

这里的坏处2解释一下,就是正常的软件延时消抖会在消斗完成后如果是短按的话用while(1)等待按键弹起,确保每个按键效果只触发一次。长按的话才会用楼主那种方法使用标志位,但是哪怕是长按不会在处理函数里面刷新标志位的,毕竟长按1秒会被触发1000/40=25次函数(LED闪烁太快肉眼看不见,可以用串口打印试试)
作者: 27376054    时间: 2021-6-21 10:05
谢谢大神们的指导,这个函数最初我是在51单片机上做过单个按键和多个按键的实验,单片机实现的功能可能单一,没与出现多个中断源抢占的情况,可能没发现一些问题,但感觉32的单片机这样做按键消抖有点多余。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1