为什么 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.
}
备注:虽然这在概念上可行,但您应该考虑改用事件。忙等待是一种反模式。
我正在尝试编写一个 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.
}
备注:虽然这在概念上可行,但您应该考虑改用事件。忙等待是一种反模式。