Мы научились: управлять микроконтроллером и управлять чем то, при помощи микроконтроллера. Теперь, чтобы сделать наше устройство более дружелюбным, будем к нему подключать дисплей.
Сразу оговорюсь дисплей — символьный. Это значит что внутри у него, в памяти, уже есть алфавит. Все что нам нужно — дать команду вывести строку.
Дисплеи бывают разные: разный цвет подсветки экрана, разное количество строк, разное количество символов в строке. Поэтому, здесь рассматривается дисплей WH0802A-YGK-CT, 2 строки по 8 символов, подсветка желтая светодиодная.
Создадим проект в CodeVision. На вкладке LCD укажем порт, к которому будет подключен наш дисплей (PORTD). В строке Char/Line указываем количество символов нашего ЖК дисплея (8).
Генерируем, сохраняем проект. Приводим код к следующему виду:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <mega8.h> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd.h> void main(void) { PORTD=0x00; DDRD=0x00; lcd_init(8); while (1) { }; } |
Добавились новые строчки
#asm .equ __lcd_port=0x12 #endasm |
Дисплей подключен к PORTD |
#include <lcd.h> | Библиотека для работы с LCD дисплеями |
Немного изменим код нашей программы:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | #include <mega8.h> #asm .equ __lcd_port=0x12 #endasm #include <lcd.h> void main(void) { PORTD=0x00; DDRD=0x00; lcd_init(8); lcd_gotoxy(0,0); lcd_putsf("lesson3"); #pragma rl+ lcd_gotoxy(0,1); lcd_putsf("Урок3"); #pragma rl- while (1) { }; } |
lcd_gotoxy(0,0); | Переставить курсор в координату ХУ,х – позиция по горизонтали,у – по вертикали |
lcd_putsf(«lesson3»); | Вывести слово lesson3 на LCD дисплей |
#pragma rl+ lcd_putsf(«Урок3»); #pragma rl- |
Данная директива позволяет вывести на экран русский алфавит, при условии что дисплей его поддерживает |
Запустим получившийся код на симуляцию в ISIS Proteus. Как видно первая строчка отображается правильно, а вот вторая кракозябами. Дело в том, что протеус не распознает русский алфавит и если ваш дисплей не будет поддерживать его, то на реальном дисплее тоже будут непонятные символы.
Теперь нужно опробовать все это на настоящем дисплее. Тут есть свои нюансы. Открываем даташит на наш дисплейчик и видим такую вот таблицу с распиновкой:
Наверное, тут все очевидно, но все же:
1 — Земля 0В.
2 — Питание +5В.
3 — Управление контрастностью. Подключается через переменный резистор.
Светодиодная подсветка. Подключаем как обычный светодиод.
А — подключаем к «+» через токоограничивающий резистор, К — подключаем к «земле» (GND).
Еще один важный момент — микроконтроллер должен тактироваться от кварцевого резонатора, в противном случае корректная работа не гарантируется.
Внешний вид прошитого устройства
Файл прошивки и протеуса доступны тут
Просьба четко прояснить строку .equ __lcd_port=0x12. Почему именно 0х12? А если будет порт C, или D? Просто пытаюсь понять суть…
Вопрос отпал… Залез в заголовочник, PortВ — 0х12, PortC — 0x15, PortD — 0x18… Я всё правильно понял?
Извиняюсь, наоборот: PortD — 0x12, PortC — 0x15, PortB — 0x18
правильно
Пытаюсь подключить дисплей к Mega328P в протеус, выдаёт ошибку «[HD44780] Attempted to read after writing a single nibble [LCD2]» Код полностью ваш скопировал, порт правильно прописал 0x0B — PORTD В чём может быть проблема?
сгенерите заново код, там в разных версиях cavr немного отличалось.