Помимо стандартных символов (буквы, цифры, знаки пунктуации) на обычные ЖК-дисплеи можно выводить любые произвольные символы, например, сердечки, стрелки, смайлики и т.д. Для каждого такого символа выделяется область размером 5x8 пикселей. Эти фигуры сначала сохраняются в специальной памяти модуля дисплея, а затем отображаются на экране.

В создании таких символов нет ничего сложного, и в данном материале будет продемонстрирован этот процесс с использованием микроконтроллера PIC18F4550 и среды разработки mikroC.
Все дело в том, что mikroC представляет собой настолько удобный инструмент разработки, что даже имеет в своем составе модуль создания произвольных символов для вывода на LCD-дисплей. Чтобы воспользоваться им, необходимо перейти в Tools - LCD Custom Character.

Далее в секции Font следует выбрать опцию 5x7 + cursor line. После этого в зеленом окошке слева можно с помощью мыши рисовать желаемый символ.

После создания символа нужно нажать на кнопку GENERATE. В итоге появится текст с кодом данного символа. Значения этого кода можно использовать в основном коде программы.


Как было упомянуто выше, модуль ЖК-дисплея хранит специальные символы в особой области памяти, называемой CGRAM. В этой памяти одновременно может храниться до восьми символов. В коде программы обязательно нужно указывать место в CGRAM, куда нужно сохранять символ. Ниже приведены схема подключения микроконтроллера PIC18F4550 к LCD-дисплею и код программы для отображения спецсимволов.

// линии управления дисплеем
#define rs LATA.F0
#define rw LATA.F1
#define en LATA.F2
// линии данных дисплея
#define lcdport LATB
void lcd_ini();
void lcdcmd(unsigned char);
void lcddata(unsigned char);
void special_char(unsigned char, unsigned char, unsigned char *);
unsigned char data1[]={10,21,17,17,17,10,4,0}; // Код символа сердечко
unsigned char data2[]={12,18,1,2,4,8,0,8};
unsigned char data3[]={1,3,5,9,9,11,27,24};
unsigned int i=0;
void main(void)
{
TRISA=0; // Настраиваем порт A на выход
LATA=0;
TRISB=0; // Настраиваем порт B на выход
LATB=0;
lcd_ini(); // Инициализация модуля ЖК-дисплея
special_char(64,0x82,data1); // Вызов функции для сохранения спецсимвола в 64-ой ячейки памяти
// и печать в локации 0x82 дисплея
Delay_ms(1000);
special_char(72,0x84,data2);
Delay_ms(1000);
special_char(80,0x86,data3);
}
void special_char(unsigned char cgram_loc, unsigned char lcd_loc, unsigned char *data)
{
unsigned int j=0;
lcdcmd(cgram_loc); // Отправляем локацию CGRAM
while(j<8)
{
lcddata(data[j]); // Отправляем значения спецсимвола
j++;
}
lcdcmd(lcd_loc); // Отправляем локацию дисплея, по которой будет отображаться спецсимвол
lcddata((cgram_loc-64)/8); // ASCII-значение соответствующего базового адреса
}
void lcd_ini()
{
lcdcmd(0x38); // Настройка дисплея на 8-битный режим, 2 линии и шрифт 5x7
lcdcmd(0x0C); // Дисплей включен, курсор выключен
lcdcmd(0x01); // Очистка экрана
lcdcmd(0x06); // Инкрементирование курсора
lcdcmd(0x80); // Курсор в позицию 1 строки 1 столбца
}
void lcdcmd(unsigned char cmdout)
{
lcdport=cmdout; // Отправка команды в lcdport=PORTB
rs=0;
rw=0;
en=1;
Delay_ms(10);
en=0;
}
void lcddata(unsigned char dataout)
{
lcdport=dataout; // Отправка данных в lcdport=PORTB
rs=1;
rw=0;
en=1;
Delay_ms(10);
en=0;
}
© digitrode.ru