为什么 C 程序会跳过我的 if 循环来编程 raspberrypi?

Why does C program skip my if loop for programming raspberrypi?

我正在尝试编写一个 c 程序,该程序对 raspberrypi 进行编程以打开 on/off/blink 面包板中的 LED 二极管。面包板上有一个按钮,我使用 digitalread 功能“单击”它。理想情况下,程序应通过单击一次按钮来运行,LED 将亮起。再次单击,它将关闭灯。再点击一次,它会闪烁几次,然后循环重复。但是,当我使用这个程序时,似乎跳过了前 2 个 if 语句。当我点击按钮时,它只会闪烁。有人知道为什么吗?

int main (int argc, char **argv){

wiringPiSetupGpio();
int counter=1;
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BUTTON, INPUT);
printf("LED and button pins have beens setup.\n");

while (1)
{   
    if ((counter==1) && (digitalRead(PIN_BUTTON))) {
        digitalWrite(PIN_LED, HIGH);
        counter++;
    }
    if ((counter==2) && (digitalRead(PIN_BUTTON))){
        digitalWrite(PIN_LED, LOW);
        counter++;
    }
    if ((counter==3) && (digitalRead(PIN_BUTTON))){
        digitalWrite(PIN_LED, HIGH);
        delay(500);
        digitalWrite(PIN_LED, LOW);
        delay(500);
        digitalWrite(PIN_LED, HIGH);
        delay(500);
        digitalWrite(PIN_LED, LOW);
        delay(500);
        digitalWrite(PIN_LED, HIGH);
        delay(500);
        digitalWrite(PIN_LED, LOW);
        delay(500);
        counter=1;
    }
}

让我们逐步查看您的 while 循环:

if ((counter==1) && (digitalRead(PIN_BUTTON))) {
        digitalWrite(PIN_LED, HIGH);
        counter++;
    }

最初,counter 为 1,但是没有按下 pin,所以这不会做任何事情。

    if ((counter==2) && (digitalRead(PIN_BUTTON))){
        // ...
    }

计数器不是 2,所以这也不会做任何事情。

    if ((counter==3) && (digitalRead(PIN_BUTTON))){
        // ...
    }

这里也一样。所以只要不按下按钮就不会发生任何事情。

现在当你按下按钮时,它会变得有趣:

if ((counter==1) && (digitalRead(PIN_BUTTON))) {
        digitalWrite(PIN_LED, HIGH);
        counter++;
    }

现在满足这个条件。 LED 打开,计数器递增。

    if ((counter==2) && (digitalRead(PIN_BUTTON))){
        // ...
    }

现在……这也是真的。由于按钮仍处于按下状态(您不能那么快释放它),这也立即成立。现在计数器增加到 3。

    if ((counter==3) && (digitalRead(PIN_BUTTON))){
        // ...
    }

现在……?是的。这现在 正确。所以它立即开始闪烁。

你必须做的(例如)是在每个条件之后等待按钮不被按下:

if ((counter==1) && (digitalRead(PIN_BUTTON))) {
        digitalWrite(PIN_LED, HIGH);
        counter++;
        while (digitalRead(PIN_BUTTON)); // Wait until button depressed.
    }

备注:虽然这在概念上可行,但您应该考虑改用事件。忙等待是一种反模式。