Перемещение символа по LCD-экрану - есть ли лучший способ?

lcd

У меня есть некоторый базовый опыт программирования, но я новичок как в C, так и в Arduino.

Я повозился с примером ЖК-кода, чтобы попытаться переместить символ с помощью встроенной клавиатуры. Я также хотел, чтобы фактическое перемещение происходило только после того, как кнопка будет отпущена, как и следовало ожидать от клавиатуры.

Код работает, но у меня такое чувство, что все пустые циклы внутри функции main loop (), которые я использовал, не являются лучшей практикой.. :)

Как я это сделал? Есть ли более удобное/элегантное решение, которое я пропустил и на котором могу учиться?

Спасибо и извините за беспорядочный код!

void loop()
{
  lcd.clear();
  lcd.setCursor(posCol,posRow);      //initialized beforehand
  lcd.print("O");                    //random char to move
  lcdOld = btnNONE;

  while (read_LCD_buttons() == btnNONE)     //do nothing while nothing is pressed
  {
  }

  lcdOld = read_LCD_buttons();

  while (read_LCD_buttons() == lcdOld)     //do nothing while button is down
  {
  }

  switch (lcdOld)               // depending on which button was pushed, we perform an action
   {
   case btnRIGHT:
     {
     posCol++;
     break;
     }
   case btnLEFT:
     {
     posCol--;
     break;
     }
   case btnUP:
     {
     if (posRow == 1)
     {
        posRow = 0;
        break;
     }
     else
     {
     break;
     }
     }
   case btnDOWN:
     {
     if (posRow == 0)
     {
        posRow = 1;
        break;
     }
     else
     {
     break;
     }
     }
   case btnSELECT:
     {
     break;
     }
     case btnNONE:
     {
     break;
     }
 }  
}

, 👍0

Обсуждение

Это нормально, если вы не хотите, чтобы ваша программа делала что-то еще одновременно (например, мигала светодиодом). Если вы хотите этого, вы можете просто заставить код запомнить последние состояния кнопки и запускать часть кода переключателя только тогда, когда какая-либо кнопка переходит от не нажатой к нажатой. (PS не забудьте принять во внимание отскок кнопки, так как это может все испортить. Не уверен, что "read_LCD_buttons ()" уже позаботится об этом), @Gerben

Я знаю, что прошло много времени с тех пор, как вы опубликовали этот пост, но есть ли какой-нибудь способ опубликовать весь исходный код?, @Duchyas Yesgat


1 ответ


3

Вы могли бы инкапсулировать логику обнаружения нажатия кнопки в ее собственную функцию:

// Вернуть только что отпущенную кнопку или btnNONE.
int releasedButton()
{
    static int last_button = btnNONE;
    int previous_button = last_button;
    last_button = read_LCD_buttons();
    if (last_button == btnNONE)
        return previous_button;
    else
        return btnNONE;
}

Затем логика в туалете упрощается:

void loop()
{
    switch (releasedButton()) {
        ...
    }
}
,