有没有办法让这些 printf() 语句仅在按下按钮的上升沿执行?

问题描述 投票:0回答:1

我正在使用带有 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 并发送语句。在任何其他状态下都不应该这样做。

if-statement button arm mbed nucleo
1个回答
0
投票

首先,

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];

请注意,对于真实的应用程序,您可能需要进一步的逻辑来消除按钮的抖动,否则每次实际按下按钮时您都会收到几个额外的按下事件。

(另一个好主意是找到一种方法使按钮中断驱动而不是轮询它。)

© www.soinside.com 2019 - 2024. All rights reserved.