Этюд: 2 строки по 40 символов на LCD 1602

arduinec
Offline
Зарегистрирован: 01.09.2015

Решил тоже небольшой этюд написать.
При разборке одного большого проекта, освоил работу с дисплеем LCD 1602 на контроллере HD44780 и выяснил интересную вещь. Хотя LCD 1602 может отображать только 2 строки по 16 символов, но в контроллере HD44780 память заложена на 2 строки по 40 символов. И в эту память можно выводить символы. А отобразить выведенные данные можно с помощью команд сдвига экрана (в библиотеке LiquidCrystal они называются scrollDisplayLeft и scrollDisplayRight). При этом сдвигаются обе строки экрана.
Для демонстрации решил вывести большие двухстрочные цифры. Так и появился нижеприведенный скетч.

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
char number[10][2][4] = {
  "\1\2\1", "\1\3\1",
  "\2\1 ",  "\3\1\3",
  "\2\4\1", "\1\5\3",
  "\2\4\1", "\3\5\1",
  "\1 \1",  "\2\2\1",
  "\1\4\2", "\3\5\1",
  "\1\4\2", "\1\5\1",
  "\2\4\1", " \1 ",
  "\1\4\1", "\1\5\1",
  "\1\4\1", "\3\5\1"  };
byte i;

void setup()
{
  byte pillar[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F };
  byte upper1[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 };
  byte lower1[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F };
  byte upper2[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F };
  byte lower2[8] = { 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F };

  lcd.begin(16, 2);
  lcd.noCursor();

  lcd.createChar(1, pillar);
  lcd.createChar(2, upper1);
  lcd.createChar(3, lower1);
  lcd.createChar(4, upper2);
  lcd.createChar(5, lower2);

  for (i=0; i<=9; i++) {
    numprint(i, 4*i);
  }
  delay(2000);
}
 
void loop()
{
  for (i=0; i<40; i++) {
    lcd.scrollDisplayLeft();
    delay(1000);
  }

  for (i=0; i<16; i++) {
    lcd.scrollDisplayLeft();
  }
  delay(5000);

  for (i=0; i<8; i++) {
    lcd.scrollDisplayLeft();
  }
  delay(5000);

  for (i=0; i<16; i++) {
    lcd.scrollDisplayRight();
  }
  delay(5000);

  for (i=0; i<8; i++) {
    lcd.scrollDisplayRight();
  }
  delay(5000);
}

void numprint(byte num, byte poz)
{
  lcd.setCursor(poz, 0);
  lcd.print(number[num][0]);
  lcd.setCursor(poz, 1);
  lcd.print(number[num][1]);
}

Успехов в использовании данной возможности!
 

yarus
Offline
Зарегистрирован: 17.06.2017

Вот интересно, откуда взялась функция "numprint" в 36й строке?!

Компилятор матерится, что таковой не существует...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

yarus пишет:

Вот интересно, откуда взялась функция "numprint" в 36й строке?!

Компилятор матерится, что таковой не существует...

Она находится ниже. Если матерится, то пернесите выше использования.

kalapanga
Offline
Зарегистрирован: 23.10.2016

yarus пишет:

Вот интересно, откуда взялась функция "numprint" в 36й строке?!

А скетч до строки 69 дочитать?

yarus пишет:

Компилятор матерится, что таковой не существует...

К сожалению, некоторые версии IDE позволяли подобную вольность. Переставьте функцию в начало скетча, до её вызова. 

yarus
Offline
Зарегистрирован: 17.06.2017

Спасибо, так и сделал уже... Компилка в норме, пробую залить...

pacha74
Offline
Зарегистрирован: 12.07.2016

У меня побежали очень большие цыфры

 

__Alexander
Offline
Зарегистрирован: 24.10.2012

Чтобы функции не переносить, их достаточно объявить.

zubok
Offline
Зарегистрирован: 15.02.2019

Здравствуйте! Помогите с пониманием кода!
1. Символ '0' в массиве не получается использовать из-за особенностей char \0 это символ конца строки?

2. Именно поэтому размер массива объявлена 10-2-4 на конце четыре, а не три?

3. Но теперь пользовательских символов можно создать только семь, а не 8?

4. Составляя цифру, байт 0х1F имеет 8 знаков, а символ только 5 в ширину. Первые три просто отбрасываются?

Код мне очень понравился краткость и простым наглядным конструктором цифр, легко модернизируется шрифт. Огромная благодарность автору !

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

Вместо кода "нулевого символа" можно отправлять \10 будет показан нулевой пользовательский символ. 

arduinec
Offline
Зарегистрирован: 01.09.2015

zubok пишет:
Здравствуйте! Помогите с пониманием кода!
1. Символ '0' в массиве не получается использовать из-за особенностей char \0 это символ конца строки?
2. Именно поэтому размер массива объявлена 10-2-4 на конце четыре, а не три?
3. Но теперь пользовательских символов можно создать только семь, а не 8?
4. Составляя цифру, байт 0х1F имеет 8 знаков, а символ только 5 в ширину. Первые три просто отбрасываются?

1. Да.    2. Да.
3. Для отображения нулевого пользовательского символа можно использовать: lcd.write(byte(0));
Пример есть здесь: http://arduino.ru/forum/programmirovanie/etyud-multik-na-lcd-1602
4. Да отбрасываются, это особенность контроллера дисплея.