Термометр-приборка на LCD 1602 выглядела бедно: температура печаталась как «24.6C», пункт меню не отличался от значения, а статус «OK» словами съедал треть второй строки. Три своих глифа исправили всё за один вечер: колечко градуса после числа, стрелка-курсор слева от активного пункта и смайлик на месте статуса. Экран тот же, а приборка стала выглядеть так, будто её делал завод, а не макетка в четверг вечером.
Механику createChar мы уже разбирали: решётка 5x8, массив byte[8], комплект глифов для термометра — в уроке про свои символы, перезаливка слотов на лету и типы глифов — в уроке про типы и перезапись. Здесь мой угол — три глифа-рабочих лошадки, которые я переношу из проекта в проект: их байты, дизайн в пять столбцов и приёмы вывода без ловушек.
Слоты CGRAM и байты глифа
Знакогенератор HD44780 держит восемь своих глифов в слотах 0-7. Каждый — массив из восьми байт: байт с индексом 0 — верхняя строка, в каждом байте значимы пять младших бит, где бит 0b10000 — левый столбец. Заливаете массив через lcd.createChar(n, massiv), выводите lcd.write(byte(n)). Про cast я напомню в заметке ниже — без него нулевой слот превращается в цифру ноль, и это классика первых сессий.
Дизайн я веду на бумажке в клетку: пять столбцов на восемь строк, и правило экономии — глиф на экране мелкий, жирные формы читаются лучше тонких. Градус — колечко из четырёх байтов, а не «звёздочка с ножкой»: на расстоянии метра колечко читается однозначно. Стрелка — хвост из трёх пикселей и нос на сплошной строке 0b11111: она заметнее треугольника и не путается с буквой. Смайлик — два глаза и рот; хмурый вариант получится, если рот развернуть — тот же слот, те же байты, другой символ.
#include <Wire.h>#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27, 16, 2); byte strelka[8] = { // стрелка вправо: хвост и нос 0b00000, 0b00100, 0b00110, 0b11111, 0b00110, 0b00100, 0b00000, 0b00000};byte gradus[8] = { // знак градуса: колечко сверху 0b00110, 0b01001, 0b01001, 0b00110, 0b00000, 0b00000, 0b00000, 0b00000};byte smile[8] = { // смайлик "всё в норме" 0b00000, 0b10001, 0b00000, 0b00000, 0b10001, 0b01110, 0b00000, 0b00000}; void setup() { lcd.init(); lcd.backlight(); lcd.createChar(0, strelka); lcd.createChar(1, gradus); lcd.createChar(2, smile); lcd.setCursor(0, 0); lcd.write(byte(0)); // стрелка у активного пункта lcd.print(" T=24.6"); lcd.write(byte(1)); // градус lcd.print("C"); lcd.setCursor(0, 1); lcd.write(byte(2)); // статус: всё в норме lcd.print(" norma");} void loop() {}Разбор. Стрелка занимает колонку 0, данные начинаются с колонки 1 — курсор больше не путается с текстом, а листание меню превращается в перерисовку одной колонки. Градус стоит сразу после числа, до «C»: связка 24.6°C читается как единый токен, глаз не спотыкается. Смайлик в начале второй строки работает как индикатор: один символ вместо слова «OK», и рядом остаётся место под любые данные.
Обратите внимание: глифы — не картинки и не шрифт целиком, это восемь ячеек CGRAM, общих для всего экрана. Напечатали стрелку в десяти местах — все десять живут одним слотом 0. Перезалили массив через createChar — поменялись все десять сразу; свойство удобное, но и ловушка: глиф «для этого места» на HD44780 не существует, слот один на всех.
| Глиф | Слот | Ключевые байты | Где живёт |
|---|---|---|---|
| Стрелка вправо | 0 | нос 0b00100/0b00110, вал 0b11111 | курсор меню, колонка 0 |
| Градус | 1 | колечко 0b00110-0b01001-0b01001-0b00110 | термометры, давление, влажность |
| Смайлик | 2 | глаза 0b10001, рот 0b01110 | статус OK; рот 0b00000 внизу — вариант «ошибка» |
- 1. Сколько своих глифов держит CGRAM HD44780 без перезаливки?
- 2. Как правильно вывести глиф из слота 0?
- Восемь слотов CGRAM (0-7), глиф 5x8 — массив из восьми байт
- Байт 0 — верхняя строка, бит 0b10000 — левый столбец
- Вывод lcd.write(byte(n)); без cast ноль печатается цифрой
- Градус — колечко из четырёх байтов; стрелка — хвост и вал 0b11111; смайлик — глаза и рот
- Слот один на весь экран: перезаливка меняет глиф во всех напечатанных местах
Частые вопросы по теме урока
- Сколько своих глифов держит CGRAM HD44780 без перезаливки?
- Восемь слотов, 0-7, по восемь байт на глиф. Девятый глиф — это либо перезаливка слота на лету, либо обмен глифа на что-то менее важное. 8
- Как правильно вывести глиф из слота 0?
- Без cast ноль принимается за число и печатается как цифра «0». lcd.write(byte(0)) снимает двусмысленность и выводит символ из CGRAM. lcd.write(byte(0))