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