找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1995|回复: 4
收起左侧

关于STM32用定时器配合做按键消抖的程序,请大神们看看我写的有啥毛病没,恳请指导

[复制链接]
ID:929847 发表于 2021-6-21 08:53 | 显示全部楼层 |阅读模式
思路是这样的,通过定时器TIM5,其实哪个定时器都行,5毫秒进入中断一次,然后创建个函数检测IO口的状态,每次进入中断执行一下函数体的变量左移一位,变量声明是char型,5*8=40毫秒来进行消抖,这样不需要Delay这样的函数来占用系统的运行时间,这个函数已经通过测试能用,但不知道这样的方法有啥好处,有啥不好处,还有函数体有没有什么再优化的地方。请大神们过目

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

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

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

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

按键没按下时候LED1不亮

按键没按下时候LED1不亮

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

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

使用道具 举报

ID:517951 发表于 2021-6-21 09:23 | 显示全部楼层
好处就是,按键扫描期间,CPU不用死等可以干别的事务,不好的地方需要:占用一个定时器硬件资源来完成扫描动作,延时等待是纯软件方式完成的,各有优点,自己按项目做好规划取舍。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:592807 发表于 2021-6-21 09:42 | 显示全部楼层
好处。
1. 可以进行多个按键测检测,即组合按键检测
2.按键检测函数不会占用太多CPU时间

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

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:592807 发表于 2021-6-21 09:58 来自手机 | 显示全部楼层
黄youhui 发表于 2021-6-21 09:42
好处。
1. 可以进行多个按键测检测,即组合按键检测
2.按键检测函数不会占用太多CPU时间

这里的坏处2解释一下,就是正常的软件延时消抖会在消斗完成后如果是短按的话用while(1)等待按键弹起,确保每个按键效果只触发一次。长按的话才会用楼主那种方法使用标志位,但是哪怕是长按不会在处理函数里面刷新标志位的,毕竟长按1秒会被触发1000/40=25次函数(LED闪烁太快肉眼看不见,可以用串口打印试试)
回复

使用道具 举报

ID:929847 发表于 2021-6-21 10:05 | 显示全部楼层
谢谢大神们的指导,这个函数最初我是在51单片机上做过单个按键和多个按键的实验,单片机实现的功能可能单一,没与出现多个中断源抢占的情况,可能没发现一些问题,但感觉32的单片机这样做按键消抖有点多余。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表