我正在使用带有 Nucleo G071RB 的 mbed 操作系统来发送有关按钮按下事件的数据。我的问题是数据要么在按下按钮时连续发送,要么在按下和释放事件时连续发送。据我所知,当按钮值从 0 变为 1 时,程序应该发送数据,但它的行为并非如此。
#include "mbed.h"
DigitalIn buttons[2]{{D6,PullUp},{D7,PullUp}};
bool lastButtons[2]{0,0};
void buttonFn()
{
for(int i=0;i<2;i++)
{
if(!buttons[i] && lastButtons[i])
{
printf("%c",i);
lastButtons[i] = !buttons[i];
}
}
}
buttons[i] 对象是反转的,因为它们是 PullUp 按钮。
我尝试过使用不同的逻辑组合,例如,如果按钮状态是 !0 或 1,并且最后一个状态是 0,则它应该评估为 true 并发送语句。在任何其他状态下都不应该这样做。
首先,
lastButtons
被初始化为false
。在 if
为 true 之前,无法输入 lastButtons[i]
块,但除了 lastButtons[i]
块内之外,if
不会在任何地方被修改。所以这些事情都不会发生。
但也许代码的其他部分将
lastButtons[i]
初始化为 true
。当 buttons[i]
第一次变成 false
时,您进入 if
块,它将 lastButtons[i]
设置回 false
。现在你和以前一样,再也无法进入该区块了。
每次阅读
lastButtons[i]
时,您都需要更新 buttons[i]
,即使这不是您想要采取行动的边缘。我会写:
if (!buttons[i] && lastButtons[i])
{
printf("%c",i);
}
lastButtons[i] = buttons[i];
请注意,对于真实的应用程序,您可能需要进一步的逻辑来消除按钮的抖动,否则每次实际按下按钮时您都会收到几个额外的按下事件。
(另一个好主意是找到一种方法使按钮中断驱动而不是轮询它。)