[РЕШЕНО] Не могу разобраться с LCD дисплеем MT-16S2H

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем Dfyz13, 28 май 2015.

  1. Dfyz13

    Dfyz13 Нуб

    В общем задумка такая:
    Один LCD дисплей MT-16S2H, три тактовые кнопки и один светодиод. Двумя кнопками (+ и -) задаём уровень ШИМ в приделах 0 - 255. При этом на дисплее отображается этот самый уровень.
    Когда нужный уровень выбран, нажимаем на третью кнопку (старт) и светодиод зажигается (повторное нажатие гасит светодиод).
    Собрал схемку, написал код. Всё работает, но есть один косяк:
    При запуске программы у меня на дисплее высвечивается: "Уровень:0", первое нажатие + "Уровень: 35", далее "Уровень:70", далее "Уровень:105" если дальше нажать + то будет 140, а вот если нажать - то получается "Уровень:705", а дальше "Уровень:355".
    В общем, эта скотина не хочет удалять старые символы, а новые печатает сразу после двоеточия((
    Как с этим бороться?
     
  2. Dfyz13

    Dfyz13 Нуб

    P.S: Вот мой скетч

    Код (Text):
    #include <LiquidCrystal.h>
    #define KEY_UP 7
    #define KEY_DOWN 6
    #define KEY_SET 5
    #define LED_PIN 3
    LiquidCrystal lcd(13, 12, 11, 10, 9, 8);

    int brightness = 0;
    boolean keyUp = true;
    boolean keyDown = true;
    boolean keySet = true;
    boolean lcdPrint = false;

    void setup()
    {
      lcd.begin(16, 2);
      pinMode(LED_PIN, OUTPUT);
    }

    void loop()
    {
      lcd.setCursor(0, 0);
      lcd.print("\xA9po\xB3""e\xBD\xC4"":");
      lcd.print(brightness); \\вот тут я пропечатываю уровень ШИМ на дисплей
      if (lcdPrint){
        lcd.setCursor(0, 1);
        lcd.print("\xA2\xBBo\xC0\xBA""a""  \xA1OP\xA5");
        analogWrite(LED_PIN, brightness);
      } else {
        lcd.setCursor(0, 1);
        lcd.print("PAC"" \xE0""BA TP""\xA5: ");
        analogWrite(LED_PIN, 0);
      }
      boolean setIsUp = digitalRead(KEY_SET);
      if (keySet &&!setIsUp){
        delay(10);
        setIsUp =digitalRead(KEY_SET);
        if (!setIsUp){
          lcdPrint = !lcdPrint;
        }
      }
      keySet = setIsUp;
      keyUp = handleClick(KEY_UP, keyUp, +35);
      keyDown = handleClick(KEY_DOWN, keyDown, -35);
    }
    boolean handleClick(int keyPin, boolean wasUp, int delta)
    {
      boolean isUp = digitalRead(keyPin);
      if (wasUp && !isUp){
        delay(10);
        isUp = digitalRead(keyPin);
        if (!isUp)
        brightness = constrain (brightness + delta, 0, 255);
      }
      return isUp;
    }
     
  3. geher

    geher Гуру

    1. Выравнивать вывод пробелами слева
    что-то вроде
    Код (Text):
    if (brightness<100) lcd.print(" ");
    if (brightness<10) lcd.print(" ");
    lcd.print(brightness,DEC);
    2. Дополнительно после числа выводить некоторое количество пробелов, которые гарантированно забьют остатки старого:
    Код (Text):
    lcd.print(brightness,DEC);
    lcd.print("      ");
    3. Перед выводом числа на том месте, где оно должно выводиться выводить пробельную строку с длиной, соответствующей максимальной длине символьного представления числа.
    Код (Text):
    lcd.setCursor(x,y)
    lcd.print("      ");
    lcd.setCursor(x,y)
    lcd.print(brightness,DEC);
    Весь экран лучше не очищать, моргать будет неприятно.
     
  4. Dfyz13

    Dfyz13 Нуб

    Блин... Текст при нажатии "старт" пробелами чистил, а тут что то затупил))
    Большое спасибо.