按钮触发太多事件


12

我正在编写一个将信息写入LCD显示器的mp3播放器,我想将其从使用键盘转换为使用按钮,但是我一直在获得太多按键。我已经尝试过拉升和下降/上升边缘,但仍然得到相同的结果。有人知道这是一个已知问题,还是我做错了什么?哦,我也正在使用connectionPi在C中完全这样做。


1
仅添加到软件解决方案中,请查看我们的微控制器朋友。arduino.cc/en/Tutorial/Debounce
Cammy_the_block 2014年

这是我前一段时间写的内容的摘录。if(digitalRead(data) && millis()-startTime > 10){并在每次进入循环时设置startTime。
Cammy_the_block 2014年

就是想; 我究竟将startTime设置为什么?
linuxgnuru 2014年

一些sorta时间计数器。Arduino具有millis函数,该函数可自启动以来提供时间。
Cammy_the_block

啊,好的,connectionPicturepi.com / reference / timing
linuxgnuru 2014年

Answers:


12

机械按钮和开关会遭受开关弹跳的影响,在这种情况下,它们会在打开和关闭之间快速切换几毫秒。

您可以尝试在软件或硬件中弹跳按钮/开关。

可能是最简单的软件。

如果级别更改(从开到关或从关到开),请等待x毫秒,然后再次读取gpio。如果它仍处于新状态,则假定它是真正的过渡。x的值可能约为20。

对于硬件解决方案,请参阅此类文章


8

花时间阅读Jack Ganssle的反跳指南。第一页详细说明了该问题,第二页以硬件或软件方式处理了该问题。没有“完美”的反跳方法,但是有很多不好的方法!

如果将软件与开关连接起来,将会反复遇到这个问题,因此值得花些时间来理解它,而Jack的文章是我见过的最简洁的方法。


2

在具有系统代码的应用程序中,我通常实现一个移位寄存器。

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

当然,您应该仅在上升沿执行按钮按下事件。


1
那是一个有趣的方法。易于定制(通过屏蔽button_checker的最高有效位),以需要不同数量的连续读取。
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.