如何避免在while循环状态变化时导致led闪烁?

时间:2018-10-24 14:09:23

标签: c++ arm

我有一个L476vg开发板,正在运行以下代码。我的目标是检测按钮的状态变化,但如果按住按钮,也不会导致LED闪烁。我下载了一些代码变体,但它们似乎都无法正常工作。有人可以指出如何修改以下代码,以便led可以在按下按钮时更改状态,而不会由于按住按钮而更改状态

#include "mbed.h"

DigitalOut myLed(LED1);                 //initializing the needed variable 
                                          and pins
DigitalIn myButton(USER_BUTTON);



int main() {

int myState = 0;
int count = 0;
int toggle = 0;


 while (1){

    if (myState != myButton){   //detect change of state
         count ++;              // if state has changed increment the count
         myState != myState;   // record the state change
        toggle = count % 2;    // determin the toggle direction
         if (toggle != 0){     //read the toggle 
           myLed != myLed;}     // if odd toggle the led
         if (toggle = 0){
           myLed = myLed; }    // if even keep same state 

   else
      myLed = myLed;


   }
 } 

}

1 个答案:

答案 0 :(得分:0)

我认为有关此代码有几点要指出:

  • 诸如myLed=myLed之类的作业根本没有任何作用。如果不为变量分配新值,则它将保留其现有值。删除它们以使代码更清晰。
  • 尽管存在bool类型,但在C或C ++中没有真正的“布尔”(真/假)数据类型。一切都是数字。除非文档另有说明,否则无法保证myButton输入可以采用的两个值与您要设置的myState的两个值相同。与其将myState切换为myState=!myState,还不如将其设置为使用例如来镜像输入变量的值,这样会更安全。 myState=myButton
  • 不清楚您的count变量在做什么。您是否要仅检测按钮按下而不释放?如果是这样,最可靠的方法就是检查myButton的值。
  • 为回应@Some programmer dude的评论,您已将问题中的所有=!更改为!=,但这是不正确的。 a=!b赋予a值为'not b'(如果b为true,则a为false,反之亦然); a!=b是一个比较,如果ab不相等,则评估为true。如果您犯了这种错误,那么最好阅读更多有关基本C语法的信息。

如果我正确理解了代码的意图,那么我的建议是:

DigitalOut myLed(LED1);
DigitalIn myButton(USER_BUTTON);

int main() {

    int myState = 0;

    while (1) {
        if (myState != myButton) {   // detect change of state
        myState = myButton;          // record the state change
        if (myButton) {              // if the button is down,
            myLed = !myLed;          // toggle the led
        }
    }

}

(尽管由于您在这方面的问题不清楚,我可能误解了您的要求。)