野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 15659|回复: 7

【状态机按键检测】代替延时消抖,欢迎指正!另外有个问题向各位请教

[复制链接]
发表于 2014-12-5 22:50:33 | 显示全部楼层 |阅读模式
刚刚试了下,使用状态机进行按键检测,效果还是挺好的,这样一来就不再需要延时消抖了。
主要代码如下:
(由于中文部分会出现乱码,所以只能截图了)
main函数部分
main函数部分.png
KeyRead()函数部分
KeyRead部分.png
宏定义部分函数部分
【宏定义部分】2014_12_5[22.40.56].png


发现个问题,就是别人使用状态机时只用了三个状态而已,为什么我得使用四个状态才成功???
这个有点不太理解,还望各位高手不吝赐教!



回复

使用道具 举报

 楼主| 发表于 2014-12-6 11:37:48 | 显示全部楼层
自己顶一个。因为我对状态机现在处于一知半解状态,不知道状态设置的依据是什么?
为什么是3种状态或者4种状态,而不是5种或者6种?所以还望各位高手指教。
回复 支持 反对

使用道具 举报

发表于 2014-12-8 00:21:16 | 显示全部楼层
问一下,PA0问什么是高电平表示按下呢,我做了好久的实验发现PA0高电平才有效,但是不知道为什么,能否解释一下
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-8 06:45:30 | 显示全部楼层
mapsteve 发表于 2014-12-8 00:21
问一下,PA0问什么是高电平表示按下呢,我做了好久的实验发现PA0高电平才有效,但是不知道为什么,能否解释 ...

原理图上画着的 啊
回复 支持 反对

使用道具 举报

发表于 2014-12-8 09:23:03 | 显示全部楼层
无按键状态时若发现有按键则进入有按键状态,有按键状态下若发现无按键则进入释放状态,释放状态下若发现无按键则进入无按键状态且返回对应键值(释放状态若发现有按键则一直等待)。
若出现一次抖动,即按键后出现一次无按键状态随后又恢复有按键,则从按键状态变成释放状态,但是在释放状态里又检测到有按键,所以停在释放状态里并没有真正释放,等待下一次无按键状态。如果是这样的话只需要三个状态。为何需要四个状态呢?第一种可能是,一次按键出现2个抖动,所以需要第四个状态来消除第二个抖动。抖动几下又按键的物理特性决定。第二种可能是,抖动持续时间比较长,即按下按键后又变为无按键状态的时间比较长然后才恢复有按键状态,这样,在按键状态下遇到抖动则进入释放状态,在释放状态的那一次扫描函数中,抖动仍然存在,则过了释放状态了,所以3个状态不够,还需要第四个状态。所以得看抖动持续时间和你扫描函数循环一次时间比较咯~这还是跟按键的物理特性有关,所以别人的程序在自己的开发板上不一定适用哦~
一般我用状态机还是配合计时来做,弄一个1ms的时基一直在运行着,有一个时基计数器在累加。有按键时,进入按键状态并且记录计数器值,在按键状态扫描如果遇到无按键了则比较时基计数器与按下按键时记录的计数器值,如果时间小于50ms判断为抖动,否则为真的释放变回无按键状态并返还键值。这样只需要2个状态。当然,如果考虑组合键和按键长按连续响应等等效果,状态机要再复杂一点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-8 11:22:15 | 显示全部楼层
yinhao 发表于 2014-12-8 09:23
无按键状态时若发现有按键则进入有按键状态,有按键状态下若发现无按键则进入释放状态,释放状态下若发现无 ...

嗯,受教了!
但是发现我们的思路好像不太一样。
1.你的是在有按键状态下发现无按键时进入的是释放状态,而我的是在有按键状态下发现无按键时进入的是查询状态(也就是你说的无按键状态)。我的想法是,如果在有按键状态下发现按键没有被按下,那就意味着之前的“情报”是误报,所以重新回到查询状态继续搜集情报,而不是进入下一状态——释放状态。不知在这一点上你是怎么看的?
2.在释放状态,你说的是,若发现有按键按下,则一直等待。我觉得,从另一个角度看,这不就相当于延时吗?那我直接延时不就完了,还搞那么多个状态干什么?也很有可能是我哪地方理解错了
回复 支持 反对

使用道具 举报

发表于 2014-12-8 13:08:55 | 显示全部楼层
我的原理图pc13和pa0画的都一样啊,下载了最新的原理图也是一样的,你那的原理图pc13和pa0连接方式不一样吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-12-8 15:55:47 | 显示全部楼层
mapsteve 发表于 2014-12-8 13:08
我的原理图pc13和pa0画的都一样啊,下载了最新的原理图也是一样的,你那的原理图pc13和pa0连接方式不一样吗

是的,确实不一样的啊。但是这个好像不重要吧,不管什么电平点亮,你照着原理图设置就可以了,不是吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-6-1 17:36 , Processed in 0.040962 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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