Arduino со странным поведением кнопок adafruit RGBLCDShield

У меня есть Arduino uno с жк-экраном rgb. очень странное поведение кнопок в одной конкретной функции.

Функция называется да / нет. Он отображает сообщение на экране (работает), пользователь может выбрать ответ да / нет с помощью кнопок вверх / вниз / влево / вправо и подтвердить ответ, нажав кнопку выбора.

Функция следующая:

bool yesno(String message)
{
  //Serial.println("asking yesno question " + message);
  bool answer = false;
  bool answerSelected = false;
  setColor('r');
  setText(message+'?', "no");
  while (!answerSelected)
  {
    uint8_t buttons = lcd.readButtons();
    if (buttons){
      if (buttons &(BUTTON_UP || BUTTON_DOWN || BUTTON_RIGHT || BUTTON_LEFT)) {
        if (answer) {
          answer = false;
          setColor('r');
          setText(message+'?', "no");
          Serial.println(answer);
        }
        else {
         answer = true;
         setColor('g');
         setText(message+'?', "yes");
         Serial.println(answer);
        }
      }
      else if (buttons & BUTTON_SELECT) {
        setColor('w');
        answerSelected = true;
        Serial.println("selected ");
        Serial.println(answer);
        return answer;
      }
    }
    delay(50);
  }
}

почему-то при нажатии влево / вправо / вверх / вниз ничего не происходит. При нажатии select вместо этого выполняется функция вверх / вниз / влево / вправо.

с помощью if (buttons &&(BUTTON_UP || BUTTON_DOWN || BUTTON_RIGHT || BUTTON_LEFT)) вместо этого кнопки влево / вправо / вверх / вниз работают так, как задумано, но выбор кнопки по-прежнему действует как другие кнопки

аналогичный код для меню работает по назначению:

void InitializeMenu()
{
  // initialize
  Serial.println("entering menu");
  setColor('w');
  while (!exitMenu)
  {
    if (menuItem != selectedItem)
    {
      Serial.println("switching menu to: "+menuItems[menuItem]);
      setText("Menue", menuItems[menuItem]);
      selectedItem = menuItem;
    }
    uint8_t buttons = lcd.readButtons();
    if (buttons & BUTTON_UP) {
      menuItem--;
      Serial.println("menu up");
      Serial.println(menuItem);
      Serial.println(menuSize);
      if (menuItem < 0) 
      {
        menuItem = menuSize;
        Serial.println("start of menu going to end");
      } 
    }
    if (buttons & BUTTON_DOWN) {
      menuItem++;
      Serial.println("menu down");
      Serial.println(menuItem);
      Serial.println(menuSize);
      if (menuItem > menuSize) {
        menuItem = 0;
        Serial.println("end of menu going to start");
       }
     }
     if (buttons & BUTTON_SELECT) {
      Serial.println("enter");
       if (menuItem == menuSize) exitMenu = true;
     }
     delay(50);
  }
}

Я хочу, чтобы код был как можно короче и проще из-за очень ограниченного места на arduino uno.

1 ответ

BUTTON_UP || BUTTON_DOWN || BUTTON_RIGHT || BUTTON_LEFT

не делает то, что вы ожидаете от него. ||это логично or, и все выражение оценивается как true. Чтобы получить битовую маску, измените ее на побитовую or (|):

BUTTON_UP | BUTTON_DOWN | BUTTON_RIGHT | BUTTON_LEFT
Другие вопросы по тегам