簡體   English   中英

帶有 adafruit RGBLCDShield 按鈕的 Arduino 怪異行為

[英]Arduino with adafruit RGBLCDShield Buttons weird behavior

我有帶 rgb lcd 屏蔽的 Arduino uno。 一個特定功能中的按鈕有一種非常奇怪的行為。

該函數稱為是/否。 它在屏幕上顯示一條消息(工作),用戶可以使用向上/向下/向左/向右按鈕選擇回答是/否,並通過按下選擇按鈕批准答案。

功能如下:

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);
  }
}

出於某種原因,當按下左/右/上/下時,什么也沒有發生。 當按下選擇時,它會執行上/下/左/右功能

使用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 上的空間非常有限,我希望代碼盡可能簡短。

BUTTON_UP || BUTTON_DOWN || BUTTON_RIGHT || BUTTON_LEFT

不會做你期望它做的事情。 || 邏輯or ,並且整個表達式的計算結果為true 要獲取位掩碼,請將其更改為按位or ( | ):

BUTTON_UP | BUTTON_DOWN | BUTTON_RIGHT | BUTTON_LEFT

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM