Съществуват няколко варианта на HD44780.
- HD44780UA00 – стандартна (японска) версия, в която има интегрирани символи от катакана и някои гръцки букви и математически символи.
- HD44780UA02 – е европейска версия, в която има гръцки, кирилица и западноевропейски символи (с диакритици).
За съжаление най-евтини и най-разпространени по нашите ширини са чистокръвните китайчета, които за кирилица не са чували.
От друга страна HD44780 ни позволява да създадем до 8 растерни изображения (bitmap). На https://omerk.github.io/lcdchargen/ ще намерите опростен генератор, с който може да добиете представа как да създавате вашите персонализирани изображения.

Ако типично българските символи, които трябва да изобразяваме едновременно са 8 или по-малко, то може да се справим и с микс между латински букви и растерни изображения.
#include "LiquidCrystal_I2C.h"
int lcdColumns = 16;
int lcdRows = 2;
// Д
byte customCharD[8] = {
0b00011,
0b00101,
0b01001,
0b01001,
0b01001,
0b11111,
0b10001,
0b00000
};
// Ж
byte customCharZ[8] = {
0b10101,
0b10101,
0b10101,
0b01110,
0b10101,
0b10101,
0b10101,
0b00000
};
// Й
byte customCharJ[8] = {
0b10101,
0b10001,
0b10011,
0b10101,
0b11001,
0b11001,
0b10001,
0b00000
};
// И
byte customCharI[8] = {
0b10001,
0b10011,
0b10011,
0b10101,
0b11001,
0b11001,
0b10001,
0b00000
};
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);
void setup(){
// инициализираме LCD
lcd.init();
// включваме подсветката
lcd.backlight();
// Записваме до 8 персонализирани символа
// Д
lcd.createChar(0, customCharD);
// Ж
lcd.createChar(1, customCharZ);
// Й
lcd.createChar(2, customCharJ);
// И
lcd.createChar(3, customCharI);
// Изчистваме екрана
lcd.clear();
// задаваме позиция на курсора - първи ред, първи символ
lcd.setCursor(0, 0);
// извеждаме текст
lcd.print("TechPot.w-lab.win");
// задаваме позиция на курсора - втори ред, първи символ
lcd.setCursor(0, 1);
// извеждаме текст на латиница
lcd.print("CA");
// извеждаме персонализиран символ - Й
lcd.write(2);
// извеждаме текст на латиница
lcd.print("T 3A ");
// извеждаме персонализиран символ - Д
lcd.write(0);
// извеждаме персонализиран символ - Ж
lcd.write(1);
// извеждаме текст на латиница
lcd.print("A");
// извеждаме персонализиран символ - Д
lcd.write(0);
// извеждаме персонализиран символ - Ж
lcd.write(1);
// извеждаме персонализиран символ - И
lcd.write(3);
}
void loop(){
// Не правим нищо
}
Резултат:

Разбира се, ако имаме нужда от повече символи (но не едновременно) можем да извикаме lcd.createChar(0, ...); с ново растерно изображение и след това да го принтираме с lcd.write(0);
