В этой статье мы рассмотрим тему, которую уже мусолили очень много. А именно как сделать для LCD1602 свои символы для отображения.
Была у меня задумка, автоматически наблюдать за температурой в парной бани, когда она нагревается.
Я её реализовал, но была она на Arduino Uno. Понятно, захотелось её поместить в корпус, однако засовывать целую плату не было никакого желания, с этого и началось изучение AVR.
К ATMEGA16 был подключен экран LCD1602, программирование осуществляется в CVAVR (CodeVision AVR), моделирование в Proteus.
При подключении LCD1602 часто бывает отсутствие русского языка и дополнительных символов. Мне для моего проекта нужны были значок градуса и некоторые символы русского алфавита.
Для этого для начала нужно за пределами функций, после объявления констант и подключения библиотек, объявить свой тип данных и создать переменную этого типа соответствующую одному символу экрана (обычно это 7х5 пикселей).
typedef unsigned char byte; flash byte smile[8] = { B00010, B00001, B11001, B00001, B11001, B00001, B00010, B00000, };
для экономии места символы можно писать в 16-ричном виде
flash byte smile[8]={0x2,0x1,0x19,0x1,0x19,0x1,0x2,0x0,};
Далее необходимо описать функцию, которая сохранит наш символ в память экранчика
void define_char(byte flash *pc, byte char_code) { byte i,a; a=(char_code<<3)|0x40; for (i=0;i<8;i++){ lcd_write_byte(a++,*pc++); } }
заключительным этапом нужно определить символ. Это необходимо делать строго после инициализации lcd, т.е. строго после lcd_init(); вставить define_char(gradus,0); для всех символов. Символы будут храниться по адресу 0x00, 0x01 и т.д. Надо сказать, что количество символов ограничено.
Для отображения символов на экране необходимо в цикле подставлять с помощью команды
lcd_putchar(0);
где 0 ничто иное как адрес, который был указан при определении символа.
Чтобы нарисовать символ, можно воспользоваться кодом, написанным одним энтузиастом
http://codepen.io/nardist01/pen/RPPvMg?editors=101
в своей версии добавил отображение hex
https://jsfiddle.net/Ristee/gxbgfLc6/3/