В этой статье мы рассмотрим тему, которую уже мусолили очень много. А именно как сделать для 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/