Это старая версия документа!


Эксперимент 30. Пользовательские символы LCD

Иногда на дисплее требуется отобразить символы, которых нет в стандартном знакогенераторе. Для таких случаев дисплей поддерживает функцию пользовательских символов. В дисплей встроена память для размещения 8 пользовательских символов. Сначала пользователь записывает в дисплей информацию о дополнительных символах, а потом может использовать их для отображения. Попробуем создать пару своих символов. Вот таких:

Смайлик и буква Ж. На символе смайлика мы подписали цифры 0 и 1. 0 соответствует выключеному пикселю, а 1 - включенному. Теперь, когда мы знаем какими должны быть наши символы, мы можем запрограммировать их и отобразить.

Схема эксперимента

Рисунок 1. Монтажная схема эксперимента

Программный код эксперимента

Exp30.ino
  1. #include <LCDI2C_Multilingual.h>
  2.  
  3. #define DEFAULT_I2C_ADDR 0x3F // Или 0x27 в зависимости от твоей платы IoT
  4.  
  5. LCDI2C_Generic lcd(DEFAULT_I2C_ADDR, 16, 2);
  6.  
  7. byte char1[8] = {
  8. 0b00000,
  9. 0b00000,
  10. 0b01010,
  11. 0b01010,
  12. 0b00000,
  13. 0b10001,
  14. 0b01110,
  15. 0b00000
  16. };
  17.  
  18. byte char2[8] = {
  19. 0b10101,
  20. 0b10101,
  21. 0b10101,
  22. 0b01110,
  23. 0b10101,
  24. 0b10101,
  25. 0b10101,
  26. 0b00000
  27. };
  28.  
  29. void setup() {
  30. lcd.init();
  31. lcd.setBacklight(0);
  32. lcd.createChar(0, char1);
  33. lcd.createChar(1, char2);
  34. lcd.setCursor(0, 0);
  35. lcd.write(byte(0));
  36. lcd.write(byte(1));
  37. }
  38.  
  39. void loop() {
  40. }

В программе мы как обычно подключили библиотеки, задали адрес контроллера дисплея на шине I2C, настроили контроллер I2C и дисплей, включили подсветку. После этого мы объявляем массив char1:

  1. byte char1[8] = {
  2. 0b00000,
  3. 0b00000,
  4. 0b01010,
  5. 0b01010,
  6. 0b00000,
  7. 0b10001,
  8. 0b01110,
  9. 0b00000
  10. };

Массив состоит из чисел, записанных в двоичной системе счисления. В этой форме очень удобно записывать, ведь единице соответствует включенный пиксель на данном месте, нулю — выключенный. В массиве 8 чисел — по одному на строку. Чтобы интерпретатор Python понял, что числа записаны в двоичной системе счисления они начинаются со специальных символов 0b. Можно было бы записать эти данные и в обычной десятичной системе, но только это не было бы наглядно. Например 0b10001 это десятичное число 17.

Таким же образом мы создаем второй символ. Теперь, когда символы созданы, их нужно записать в память дисплея.

  1. lcd.custom_char(0, char1)
  2. lcd.custom_char(1, char2)

Символ из переменной char1 записываем в память дисплея по адресу 0, а символ char2 по адресу 1.

Ставим курсор в левый верхний угол, на место первого символа. Это нулевое место нулевой строки так как нумерация мест и строк ведется от нуля:

  1. lcd.move_to(0,0)

Печатаем на дисплее символы. Они выводятся туда, куда мы поставили курсор:

  1. lcd.putchar(chr(0))
  2. lcd.putchar(chr(1))

Первый символ появился на первой строке в первом знакоместе, а второй на втором знакоместе благодаря тому, что курсор автоматически переместился на второе знакоместа после печати первого символа.

Дополнительное задание

  • Создай свой символ, например, подмигивающий или грустный смайлик
  • Отобрази его на второй строке по середине