【问题标题】:How to fix a flickering led Matrix and lcd menu screen如何修复闪烁的 LED 矩阵和液晶菜单屏幕
【发布时间】:2019-04-12 19:25:55
【问题描述】:

我正在制作一个项目,其中有一个 LED 矩阵、LCD 和 7 个不同的传感器。每个传感器将向矩阵显示不同的消息,并在 LCD 上有自己的子菜单。

我创建了一个用于在传感器之间切换的菜单。旋转编码器用于在菜单中导航。 (当引脚发生变化时,引脚具有更改中断,仅执行 void 循环)此外,选择按钮用于运行菜单项的程序。(传感器程序,如 prg_Pong()、prg_Flame());

我想在 LCD 上显示菜单项(无 I2C)。现在我的问题是我的主菜单项显示正确(由于旋转编码器引脚上的中断而没有闪烁) 但是当我按下按钮运行 ex prg_Pong() 时,lcd 打印消息 running pong 但消息闪烁并且 LED 矩阵上的消息很好(静态)。

我通过添加延迟(300)找到了解决方案;在 drawMenu 之后的循环中,但是当我这样做并输入 prg_Pong(); LED矩阵上的信息在延迟时间开始闪烁,菜单项“running pong”不再闪烁。

函数 displayData(),mtx_clear() 用于 LED 矩阵并且它们正在工作。因为当我移除 LCD 的功能时,消息会正确显示。

void loop() {
  drawMenu(RotaryEncoder());
  delay(300);
}


void drawMenu(byte rotaryPosition) {
  stateBtnSelect = digitalRead(BTN_SELECT);
  if (stateBtnSelect == HIGH && previousBtnState == LOW && millis() - time > debounce) {
    if (state == HIGH)
      state = LOW;
    else
      state = HIGH;
    time = millis();
  }
  previousBtnState = stateBtnSelect;

  //Switch the value of the rotary encoder
  switch (rotaryPosition) {
    case 0:
      displayMenuItem(0);
      if (state == HIGH) {
        prg_Pong();
      }
      break;
    case 1:
      displayMenuItem(1);
      if (state == HIGH) {
        prg_Ascroll();
      }
      break;
    case 2:
      displayMenuItem(2);
      if (state == HIGH) {
        prg_Clock();
      }
      break;
    case 3:
      displayMenuItem(3);
      if (state == HIGH) {
        prg_Flame();
      }
      break;
    case 4:
      displayMenuItem(4);
      if (state == HIGH) {
        prg_Heartbeat();
      }
      break;
    default:
      break;
  }
}

//Display a menu item
void displayMenuItem(byte item)
{
  //menu strings (mai n categories)
    String menuItems[MAX_MENU_ITEMS] = {"Pong game", "A. Scroller", "Clock", "Flame/temp", "Heartbeat"};
    lcd.clear();
    lcd.setCursor(6, 0);
    lcd.print("Menu");
    lcd.setCursor(0, 1);
    lcd.write(byte(0));
    lcd.print(menuItems[item]);
}


void prg_Pong()
{
  lcd.clear();
  delay(100);
  lcd.print("run pong");
  mtx_clear();

  //print cirlce once
  MessageEncoder(ReturnLetter(24), BitStream);
  for (int j = 0; j < 8; j++)
  {
    displayData(~BitStream[j] & Kolommen[j]);
  }
}

【问题讨论】:

  • 1.如果不需要,请不要清除显示,即当没有任何变化时,不要清除,2. 考虑使用一种帧缓冲区,即您维护和修改完整显示内容的数组等,然后将整个缓冲区传输到显示器(不清除)覆盖以前的内容。

标签: c++ c arduino lcd


【解决方案1】:

您经常清除液晶显示屏,所以它看起来会闪烁。

我用了另外两个变量来查找,是否需要更新显示?仅在需要时更改显示内容,我没有编译代码但希望这能解决您的问题,我在我的项目中使用了类似的技术。

prev_menu=-1;
update_display=true;

void loop() {
  drawMenu(RotaryEncoder());
  delay(300);
}


void drawMenu(byte rotaryPosition) {
  stateBtnSelect = digitalRead(BTN_SELECT);
  if (stateBtnSelect == HIGH && previousBtnState == LOW && millis() - time > debounce) {
    if (state == HIGH)
        state = LOW;
    else
      state = HIGH;
    time = millis();
    update_display=true;
  }
  previousBtnState = stateBtnSelect;

    if(prev_menu != rotaryPosition)
            update_display=true;
    else
        update_display=false;

  //Switch the value of the rotary encoder
  switch (rotaryPosition) {
    case 0:
      displayMenuItem(0);
      if (state == HIGH) {
        prg_Pong();
      }
      break;
    case 1:
      displayMenuItem(1);
      if (state == HIGH) {
        prg_Ascroll();
      }
      break;
    case 2:
      displayMenuItem(2);
      if (state == HIGH) {
        prg_Clock();
      }
      break;
    case 3:
      displayMenuItem(3);
      if (state == HIGH) {
        prg_Flame();
      }
      break;
    case 4:
      displayMenuItem(4);
      if (state == HIGH) {
        prg_Heartbeat();
      }
      break;
    default:
      break;
  }
}

//Display a menu item
void displayMenuItem(byte item)
{
  //menu strings (mai n categories)
    if(  update_display){

    String menuItems[MAX_MENU_ITEMS] = {"Pong game", "A. Scroller", "Clock", "Flame/temp", "Heartbeat"};
    lcd.clear();
    lcd.setCursor(6, 0);
    lcd.print("Menu");
    lcd.setCursor(0, 1);
    lcd.write(byte(0));
    lcd.print(menuItems[item]);
    prev_menu=item;

    }
}


void prg_Pong()
{
if(update_display){
  lcd.clear();
  delay(100);
  lcd.print("run pong");
    update_display=false;

  }
  mtx_clear();

  //print cirlce once
  MessageEncoder(ReturnLetter(24), BitStream);
  for (int j = 0; j < 8; j++)
  {
    displayData(~BitStream[j] & Kolommen[j]);
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2013-05-02
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多