搜索
bottom↓
回复: 84

基于stm32的4X4矩阵键盘定时器扫描消抖法,彻底告别delay函...

  [复制链接]

出0入0汤圆

发表于 2014-7-23 11:23:48 | 显示全部楼层 |阅读模式
以前的消抖总是采用delay延时约10到20ms的时间,但这样会导致MCU在延时里空跑而造成主程序被搁置,显然,程序的实时性大打折扣。矩阵键盘定时器扫描消抖法。感谢CSDN的可爱虎朋友。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-7-23 11:33:52 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-7-23 11:45:08 来自手机 | 显示全部楼层
正需要,看看移植下。

出0入0汤圆

发表于 2014-7-24 06:52:56 来自手机 | 显示全部楼层
验证一下。谢谢

出0入0汤圆

发表于 2014-7-24 08:10:26 | 显示全部楼层
关注下                                 

出0入20汤圆

发表于 2014-7-24 08:14:25 | 显示全部楼层
用DELAY(),是90年代的教科书带来的后果。里面还有许多好笑的BUG。键译,用状态机是最好的选择。

出0入0汤圆

 楼主| 发表于 2014-7-24 20:16:06 | 显示全部楼层
mon51 发表于 2014-7-24 08:14
用DELAY(),是90年代的教科书带来的后果。里面还有许多好笑的BUG。键译,用状态机是最好的选择。 ...

我是看郭天祥的书学的,感觉太不方便了,

出0入0汤圆

发表于 2014-7-24 20:22:56 | 显示全部楼层
矩阵键盘上加个电容就好了,不用delay

出0入0汤圆

发表于 2014-7-24 20:41:53 | 显示全部楼层
mark!!!!!!!!!!!!!

出0入0汤圆

发表于 2014-7-24 20:46:47 | 显示全部楼层
本帖最后由 afeionline 于 2014-7-24 20:56 编辑

从来都不用delay的飘过。定时扫描+状态机最有效,也很方便

出0入0汤圆

 楼主| 发表于 2014-7-25 21:04:58 | 显示全部楼层
afeionline 发表于 2014-7-24 20:46
从来都不用delay的飘过。定时扫描+状态机最有效,也很方便

来一个定时扫描+状态机的例程呗,我不太懂状态机

出0入0汤圆

发表于 2014-7-25 22:51:36 | 显示全部楼层
本帖最后由 afeionline 于 2014-7-25 22:53 编辑

好久不写代码了,之前最完整的程序找不到了,只找到了简单的,供参考。
说一下思路吧,这个倒是记得。
先说矩阵扫描的思路,也就是状态机转换。
按键分为未按下,按下一次(不确认按下是否有效,需消抖),按下(有效按下),持续按下,抬起一次(需消抖),抬起(也就是未按下),总共5种有效状态,分别标记为状态0~4,状态转移图如下图。

对绝大多数矩阵键盘来说,只允许同时按下一个按键,如果同时按下多个键,则以扫描到的第一个键为准,这个是前提。
由于人按键的速度是有限的,即使狂按同一个按键,每秒按键次数通常也不超过10次,因此只要在100ms内完成5次完整的矩阵扫描就保证不会有漏检的情况。比如4*4矩阵键盘,5ms扫描一列,20ms刚好扫描完一个状态,100ms可以扫描5次。
定时扫描有两种方式,一种是每隔固定时间在timer中断里直接扫描矩阵键盘的其中一行;另一种是在timer中断里定时打开一个信号量,在主函数while(1)循环中检查信号量,有效则扫描一行。
需要调用键盘的函数只需要检查按键值即可,在有效值范围内则认为按键有效,执行相应操作。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-7-26 14:13:11 | 显示全部楼层
好的,谢谢了,一会儿研究研究

出0入13汤圆

发表于 2014-7-26 17:45:07 | 显示全部楼层
用论坛里的状态机可以做到更多的按键功能,当然这个很实用,在不需要太多功能的时候很好

出0入0汤圆

发表于 2014-7-26 18:04:10 | 显示全部楼层
mon51 发表于 2014-7-24 08:14
用DELAY(),是90年代的教科书带来的后果。里面还有许多好笑的BUG。键译,用状态机是最好的选择。 ...

当初我也是被delay 误导,不过现在都是用状态加定时器实现功能

出0入0汤圆

发表于 2014-7-26 18:22:19 | 显示全部楼层
MARK一下,基于stm32的4X4矩阵键盘定时器扫描消抖法

出0入0汤圆

发表于 2014-7-26 19:05:16 | 显示全部楼层
afeionline 发表于 2014-7-25 22:51
好久不写代码了,之前最完整的程序找不到了,只找到了简单的,供参考。
说一下思路吧,这个倒是记得。
先说 ...

学习

出0入20汤圆

发表于 2014-7-26 19:44:39 | 显示全部楼层
duxingkei 发表于 2014-7-26 18:04
当初我也是被delay 误导,不过现在都是用状态加定时器实现功能

最好连定时器都不要用。

出0入0汤圆

发表于 2014-7-26 20:47:10 | 显示全部楼层
mon51 发表于 2014-7-26 19:44
最好连定时器都不要用。

不用定时器的话,每次采集的时间间隔不固定,可能会出现漏采的情况。
最节省定时器资源的方法就像我说的后面一种,定时器只打开信号量,在主循环里采集。

出0入0汤圆

发表于 2014-7-27 01:03:43 | 显示全部楼层
afeionline 发表于 2014-7-26 20:47
不用定时器的话,每次采集的时间间隔不固定,可能会出现漏采的情况。
最节省定时器资源的方法就像我说的 ...

是啊,定时采集按键好点

出0入0汤圆

发表于 2014-7-27 10:57:52 | 显示全部楼层
是楼主自己悟的吗?真有心

出0入0汤圆

发表于 2014-7-27 14:18:03 | 显示全部楼层
标记啦,下载看看

出0入0汤圆

发表于 2014-7-27 17:17:02 来自手机 | 显示全部楼层
标记学习一下

出0入0汤圆

发表于 2014-7-27 19:26:53 | 显示全部楼层
好贴子啊,stm32的4X4矩阵键盘定时器扫描消抖法。自己一直不满意等待扫描的方法,却没能自己想出一个更好的办法

出10入0汤圆

发表于 2014-7-27 19:52:06 来自手机 | 显示全部楼层
mark一下!谢谢!

出0入0汤圆

 楼主| 发表于 2014-7-27 20:18:10 | 显示全部楼层
陶新成 发表于 2014-7-27 10:57
是楼主自己悟的吗?真有心

没有啦,自己感觉延时消抖太~~~,在网上看的别人写的定时消抖函数,调试成功可以用

出0入0汤圆

发表于 2014-7-27 20:28:41 | 显示全部楼层
用操作系统的飘过。。。

出0入0汤圆

发表于 2014-7-28 08:58:54 | 显示全部楼层
学习,谢谢!!!

出0入0汤圆

发表于 2014-7-29 18:46:49 | 显示全部楼层
消抖不应该放在键盘程序里面(影响可移植性),个人愚见。
键盘扫描应与消抖分开

出0入0汤圆

发表于 2014-7-30 11:20:15 | 显示全部楼层
不好用啊                    

出0入0汤圆

发表于 2014-7-30 11:31:19 | 显示全部楼层

出0入0汤圆

发表于 2014-7-31 09:56:47 | 显示全部楼层
  mark 谢谢分享

出0入0汤圆

发表于 2014-8-6 14:04:43 | 显示全部楼层
正在做方案,参考一下,谢谢了。

出0入0汤圆

发表于 2014-9-5 14:44:58 | 显示全部楼层
mark ,正好在做项目,参考下

出0入0汤圆

发表于 2014-9-5 23:05:43 | 显示全部楼层
正需要呢,谢谢楼主

出0入0汤圆

发表于 2014-9-6 00:50:40 来自手机 | 显示全部楼层
好方法,一定要学。

出0入0汤圆

发表于 2014-9-6 02:21:36 | 显示全部楼层
本帖最后由 bli19 于 2014-9-6 02:27 编辑

有没有人加外部中断的,我都无语了,用一个counter在中断里数,按键按一次闪一个等,counter=1,按键按第二次闪两个灯,counter=2,按第三次闪第三个灯,counter=3,
但是有时候复位就是一下子闪了三个灯。
-------

定时器大家有没有做轮询的?我觉得中断不一定好。

出0入0汤圆

发表于 2014-9-6 13:13:43 | 显示全部楼层
楼主的,代码结构需要加强,中断扫描,以后会让你死的难看。。中断最好做标记,,,看楼主在中断使用printf调试。。这是最大的缺点,按键扫描放在主函数

出0入0汤圆

发表于 2014-9-6 13:21:55 | 显示全部楼层
正需要啊,谢谢

出0入0汤圆

发表于 2014-9-10 14:55:38 | 显示全部楼层
学习一下,这个可以研究研究,挺有用的

出0入0汤圆

发表于 2014-9-10 15:36:07 | 显示全部楼层
基础但很有用的资料

出0入0汤圆

发表于 2014-9-17 11:56:54 | 显示全部楼层
刚弄了矩阵键盘,借鉴一下

出0入0汤圆

发表于 2014-9-17 15:18:49 | 显示全部楼层
MARK。。。。。。。。。。。

出0入0汤圆

发表于 2014-9-17 15:27:34 | 显示全部楼层
mark            

出0入0汤圆

发表于 2014-9-17 15:46:20 | 显示全部楼层
mark                              

出0入0汤圆

发表于 2014-9-18 21:53:19 | 显示全部楼层
看来用delay在实际中不长用

出0入0汤圆

发表于 2014-9-18 23:16:58 来自手机 | 显示全部楼层
搞得这么复杂,每5ms扫描键值一次,连续5次扫到同一个键值,则认为按下有效。

出0入0汤圆

发表于 2014-11-26 09:57:16 | 显示全部楼层
重新mark,谢谢楼主!

出0入0汤圆

发表于 2014-11-26 11:40:58 | 显示全部楼层
标记一下~~~以后备用~~~

出0入0汤圆

发表于 2014-11-26 12:15:30 | 显示全部楼层
资料已下 ,学习中。。。谢谢楼主分享

出0入0汤圆

发表于 2014-11-26 12:32:05 | 显示全部楼层
关注下  

出0入0汤圆

发表于 2014-11-26 12:33:04 | 显示全部楼层
谢谢分享,mark

出0入0汤圆

发表于 2014-11-26 12:42:35 | 显示全部楼层
来学习,多谢楼主分享。

出0入0汤圆

发表于 2014-11-26 13:05:04 | 显示全部楼层
已下载,测试

出0入0汤圆

发表于 2014-11-26 13:58:42 | 显示全部楼层
键盘消抖 谢谢

出0入0汤圆

发表于 2015-4-18 11:20:49 | 显示全部楼层
#在这里快速回复#谢谢分享

出0入0汤圆

发表于 2015-4-18 11:32:04 | 显示全部楼层
多谢楼主分享。

出0入0汤圆

发表于 2015-4-18 14:35:39 | 显示全部楼层
你去书店看单片机相关书籍吧,几乎按键扫描全是delay延时消抖。
可能我读书少,我看的第一本采用状态机思想的按键扫描的书是马潮老师的书

出0入0汤圆

发表于 2015-4-21 15:12:31 | 显示全部楼层
mark一下

出0入0汤圆

发表于 2015-5-18 21:16:06 | 显示全部楼层
mark               

出0入0汤圆

发表于 2015-6-19 20:46:07 | 显示全部楼层
最近用到这方面的资料,感谢发布。

出0入0汤圆

发表于 2015-6-19 21:08:42 | 显示全部楼层
几号.........

出0入0汤圆

发表于 2015-6-19 21:25:00 | 显示全部楼层
mark            

出0入0汤圆

发表于 2015-7-6 20:04:33 | 显示全部楼层
下载 学习学习

出0入0汤圆

发表于 2015-7-7 07:22:35 | 显示全部楼层
谢谢楼主, 学习了.

出0入0汤圆

发表于 2015-7-16 22:44:59 | 显示全部楼层
MARK 一下

出0入0汤圆

发表于 2015-8-15 21:45:45 | 显示全部楼层
MARK,矩阵键盘状态机。谢谢前辈们

出0入0汤圆

发表于 2015-8-16 00:38:49 | 显示全部楼层
我以前用的消抖,都是才用延时的方法做的,赶紧mark

出0入0汤圆

发表于 2015-8-16 14:43:56 | 显示全部楼层
谢谢分享,Mark

出0入0汤圆

发表于 2015-8-19 23:58:57 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2015-8-20 09:17:52 | 显示全部楼层
正在做这样的项目 ,谢谢楼主

出0入0汤圆

发表于 2015-8-20 13:14:02 | 显示全部楼层
小豆 mark....................

出0入0汤圆

发表于 2017-12-30 12:39:15 | 显示全部楼层
STM32的矩阵键盘状态机扫描,有用,谢放分亨!

出0入0汤圆

发表于 2018-1-2 11:09:05 | 显示全部楼层
哎,我好像还在用delay() 函数呢

出0入0汤圆

发表于 2018-9-29 17:53:05 | 显示全部楼层
谢谢!

出0入0汤圆

发表于 2018-9-29 18:25:31 来自手机 | 显示全部楼层
搞个天微tm16系列的片子更省事了还能省io口

出0入0汤圆

发表于 2018-9-30 10:57:00 | 显示全部楼层
状态机+定时器

出0入0汤圆

发表于 2018-10-2 11:40:29 | 显示全部楼层
希望各位大神多普及一下基础知识。有了基础其他都是小case

出0入0汤圆

发表于 2018-10-2 15:01:10 | 显示全部楼层
用状态机是最好的选择。

出0入0汤圆

发表于 2018-10-10 15:38:27 | 显示全部楼层
用定时中断或者操作系统下的延时比较方便高效

出0入0汤圆

发表于 2019-5-31 09:13:06 | 显示全部楼层
正需要,看看移植下。

出0入0汤圆

发表于 2019-5-31 14:27:10 | 显示全部楼层
下载研究一下,STM32学到什么程度才叫真正的入门?

出0入0汤圆

 楼主| 发表于 2019-5-31 16:17:57 | 显示全部楼层
我觉得你想实现什么功能,知道用单片机的什么资源去实现,并且可以通过单片机输出正确的结果。这样应该就算入门了吧。个人看法,仅供参考。

出0入0汤圆

发表于 2019-6-1 23:37:57 | 显示全部楼层
感恩~~~~~~~~~~~~~~~~~~~~~~~~`

出0入0汤圆

发表于 2019-6-2 08:24:44 | 显示全部楼层
好贴子,学习一下
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 23:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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