Рис.1 ЖКИ на базе контроллера HD44780
По отношению к обыкновенным 7-сегментным, ЖКИ модули на базе контроллера HD44780 обладают на порядок большими возможностями. Количество строк на экране у разных моделей - 1,2 или 4; число символов в строке: 8,10,16,20,24,30,32 или 40. Каждое знакоместо на дисплее представляет собой матрицу размером 5x8 точек. Индикатор может иметь светодиодную или люминесцентную подсветку практически любого цвета свечения. На рис.1 показан внешний вид модуля A162-D фирмы Ampire с разрешением 16 символов x 2 строки. Напряжение питания контроллера HD44780 5В (реже 3В). Ток потребления контроллера очень мал(100…200 мкА), чего не скажешь о светодиодной подсветке. В зависимости от производителя, его величина составляет 80…120 мА. Для работы некоторых типов ЖКИ может потребоваться дополнительный источник напряжения отрицательной полярности. Технология производства модулей подобного рода непрерывно совершенствуется, что, в целом, положительно сказывается на их размерах и электрических характеристиках.
Рис.2 Таблица символов CGRAM
Изначально HD44780 имеет предопределенную таблицу символов, размещенную в ОЗУ знакогенератора CGRAM (Character Generator RAM). Для отображения любого из них программа микроконтроллера должна передать координаты позиции и, непосредственно за ними, сам адрес символа из CGRAM. Пример таблицы CGRAM приведен на рис.2. Заглавные и прописные буквы латинского алфавита, числовые знаки, а также большинство знаков препинания совпадают в ней с кодами ASCII. Набор символов, размещенных по адресам 0xA0…0xFF, содержит национальный алфавит (в данном случае кириллицу) того региона, где предполагается его использование. Первые 16 ячеек CGRAM имеют особое значение. При желании, в них могут быть записаны любые пользовательские символы, которых нет таблице (сразу после включения модуля в них находится случайная информация). Упростить преобразование строки, состоящей из букв русского и английского алфавитов, в набор кодов HD44780, можно с помощью утилиты "HD44780" (внешний вид на рис.3). Все, что делает эта программа – приводит в соответствие набор введенных символов с их отображением в таблице CGRAM. Результатом преобразования является набор байтов (с нулевым значением в конце), начинающихся с директивы резервирования FLASH-памяти программ .db.
Рис.3 Утилита HD44780
Нумерация и Функциональное назначение выводов ЖКИ приведены в табл.1. Кроме напряжения питания контроллера VCC, модуль имеет вход регулировки контрастности изображения V0. Питание подсветки (если таковая имеется) подается на выводы A и K.
Рис.4 Последовательность передачи данных в HD44780
а - по 8-разрядной шине команд/данных
б - по 4-разрядной шине команд/данных
HD44780 взаимодействует с AVR через 8-битную двунаправленную шину команд/данных DB7:DB0. Временная диаграмма работы шины показана на рис.4а. В момент записи информации в ЖКИ ведущий микроконтроллер выставляет на линиях DB7…DB0 8-разрядный код, после чего формирует на выводе E стробирующий импульс (активный фронт – задний). По окончанию импульса должна быть выдержана пауза до начала новой транзакции. Признаком записи команды/ данных является состояние линии RS. При RS=0 происходит запись команды, при RS=1 – данных. Когда необходимо считать данные из индикатора, то выводы порта DB7:DB0 микроконтроллера настраиваются на ввод. Затем следует импульс подтверждения на линии E и байт данных переписывается во внутренний регистр для дальнейшей обработки. Направление передачи данных определяет уровень на линии R/W (R/W =1 – чтение из индикатора, R/W =0 – запись в индикатор). В реальных приложениях, как правило, нет необходимости в чтении данных. Поэтому вывод R/W всегда соединяют с общим проводом. Схема подключения AVR к A162-D приведена на рис.5a.
Рис.5 Схема подключения символьного ЖКИ к микроконтроллеру
а - при использовании 8-разрядной шины команд/данных
б - при использовании 4-разрядной шины команд/данных
Для управления ЖКИ может быть использован также 4-проводный интерфейс (см. схему подключения на рис.5б), что позволяет сэкономить 4 линии ввода-вывода, при незначительном усложнении программы.
Табл.1. Функциональное назначение выводов символьного ЖКИ на базе D44780:
Номер вывода |
Название выводов |
Функциональное назначение |
1 |
GND |
Общий вывод |
2 |
VCC |
Напряжение питания |
3 |
V0 |
Напряжение управления контрастностью |
4 |
RS |
Выбор записи команды/данные |
5 |
R/W |
Выбор направления передачи данных запись/чтение |
6 |
E |
Вход тактовых импульсов |
7-14 |
BD7-DB0 |
Шина данных |
15 |
A |
Анод светодиодной подсветки |
16 |
K |
Катод светодиодной подсветки |
Табл.2а. Команды записи в HD44780:
NN |
Состояние линий, при R/W=0 |
Команды |
Максимальное |
||||||||
RS |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
|||
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
Полная отчистка дисплея и установка курсора в нулевую позицию. |
1600 |
2 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
- |
Установка курсора в нулевую позицию. Установка дисплея в начальное положение. |
1600 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
I/D(Increment/Decrement) - направление сдвига курсора после записи (I/D=1 - сдвиг вправо, I/D=0 – сдвиг влево). S(Shift) – разрешение сдвига дисплея вместе с курсором (S=1 - сдвиг разрешен, S=0 - сдвиг запрещен). |
40 |
4 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
С |
B |
D(Display) – включение дисплея (D=1 - дисплей включен, D=0 - дисплей отключен). C(Cursor)- видимость курсора (C=1 – видимый курсор, C=0 – погашенный курсор). B(Blink) - мигание курсора (B=1 – курсор мигает, B=0 – курсор не мигает). |
40 |
5 |
0 |
0 |
0 |
0 |
1 |
S/C |
R/L |
- |
- |
S/C(Screen/Cursor) – перемещение дисплея/курсора (S/C=1 – перемещается дисплей, S/C=0 – перемещается курсор). R/L(Right/Left)- направление перемещения дисплея/курсора (R/L=1 – перемещение вправо, R/L=0 – перемещение влево). |
40 |
6 |
0 |
0 |
0 |
1 |
DL |
N |
F |
- |
- |
DL(Data Length) – разрядность шины данных (DL=1 – 8 бит, DL=0 – 4 бита). N(Number)- число строк дисплея (N=1 – 2 строки, N=0 – 1 строка). F(Font) – размер шрифта (F=1 – шрифт 5x10 точек, F=0 – шрифт 5x7 точек). |
40 |
7 |
0 |
0 |
1 |
ADRESS |
Установка адреса CGRAM (Character Generator RAM). После команды должны следовать данные для записи/чтения в/из CGRAM. |
40 |
|||||
8 |
0 |
1 |
ADRESS |
Установка адреса DDRAM (Display Data RAM). После команды должны следовать данные для записи/чтения в/из DDRAM. |
40 |
||||||
9 |
1 |
DATA |
Запись данных в DDRAM (Display Data RAM) или CGRAM (Character Generator RAM). |
40 |
Табл.2б. Команды чтения из HD44780:
NN |
Состояние линий, при R/W=1 |
Команды |
Максимальное время выполнения, мкс |
||||||||
RS |
DB7 |
DB6 |
DB5 |
DB4 |
DB3 |
DB2 |
DB1 |
DB0 |
|||
1 |
0 |
BF |
AC |
Чтение BF (Busy Flag) – флаг завершения операции (BF=1 – операция завершена, BF=0 – операция не завершена) и текущего состояния внутреннего счетчика адреса AC (Address Counter). |
1 |
||||||
2 |
1 |
DATA |
Чтение данных из DDRAM (Display Data RAM) или CGRAM (Character Generator RAM). |
40 |
В этом случае 4-разрядную шину команд/данных формируют линии DB7…DB4 (линии DB3…DB0 остаются незадействованными). Скорость записи снижается в 2 раза, но это, обычно, не вызывает ни каких проблем во время работы. Последовательность передачи данных показана на рис.4б. Команды/ данные передается за два такта. Первым следует старший полубайт, вторым – младший. Каждая тетрада, естественно, должна быть зафиксирована импульсом на линии E.
Рис.6 Адреса ячеек видеопамяти DDRAM
Контроллер HD44780 имеет буфер видеопамяти DDRAM (Display Data RAM), из которой символы переносятся на дисплей. Объем DDRAM зависит от числа строк и позиций на экране. Для индикатора с разрешением 16 символов x 2 строки он составляет 40 б на каждую строку (см.рис.6). Адреса ячеек видеопамяти первой строки 0x80…0xA8, второй 0xC0…0xE8. В текущий момент времени в окно дисплея попадают только 16 символов из DDRAM (положение окна можно изменять программно).
Управляющие команды записи сведены в табл.2а. Запись команды с кодом 0x01 приводит к полной отчистки DDRAM и установке окна дисплея и курсора в начальные позиции. Команда 0x02 заставляет проделать те же самые действия, но при этом оставляет содержимое видеопамяти неизменным. Биты команды под номером 3 задают направление смещение курсора (I/D=1 - сдвиг вправо, I/D=0 – сдвиг влево) и разрешение сдвига дисплея (S=1 - сдвиг разрешен, S=0 - сдвиг запрещен) при вводе очередного символа. Биты команды 4 отвечают за режим отображения курсора (B=1 – курсор мигает, B=0 – курсор не мигает; C=1 – видимый курсор, C=0 – погашенный курсор) и работу экрана (D=1 - дисплей включен, D=0 - дисплей отключен). Команду 5 удобно использовать для реализации бегущей строки. С ее помощью можно принудительно перемещать дисплей или курсор (S/C=1 – перемещается дисплей, S/C=0 – перемещается курсор), в произвольном направлении (R/L=1 – перемещение вправо, R/L=0 – перемещение влево). Содержимое DDRAM, в этом случае, остается неизменным. Команда 6 используется только во время начальной инициализации модуля. Она задает тип интерфейса (DL=1 – 8-проводной, DL=0 – 4-проводной), число строк дисплея (N=1 – 2 строки, N=0 – 1 строка) и размер шрифта (F=1 – шрифт 5x10 точек(не используется), F=0 – 5x7 точек).
Рис.7 Пользовательские символы в таблице CGRAM
Команды 7 и 8 предназначены для установки текущего адреса в CGRAM и DDRAM, соответственно, и могут быть использованы только совместно с командой записи данных 9 (либо с командой чтения 2, из табл.2б, о чем будет сказано ниже). После установки курсора в памяти DDRAM, команда 9 должна передавать адрес символа(0…0xFF) из таблицы CGRAM для его отображения в соответствующей позиции.
Комбинация команд 7 и 9 необходима при программирования пользовательских символов в CGRAM по адресам 0…0x0F. Для записи каждого символа потребуется 8 б памяти микроконтроллера. Полезную информацию будут нести в себе только 5 младших разрядов, соответствующих 5-ти столбцам матрицы (см. рис.7). Логической единице соответствует видимая точка на дисплее.
После установки адреса в ОЗУ знакогенератора, должен следовать 8-байтовый блок данных. Возможна запись нескольких символов подряд. Так, например, чтобы запрограммировать все 16 символов, нужно передать команду 0x40 (установить нулевой адрес в CGRAM), а за ней 16*8 = 128 б данных.
Команды чтения из индикатора приведены в табл.2б. С помощью первой команды может быть считано текущее содержимое счетчика адреса AC в DDRAM и состояние флага завершения операции BF (при BF=1 операция чтения/записи завершена). Команда 2 должна следовать после команды записи 7 или 8 из табл.2а и позволяет считать символы размещенные в CGRAM либо DDRAM.
Как уже говорилось выше, команды чтения не имеют никакой практической ценности. Интерес может представлять только флаг BF. Однако намного удобней программно формировать задержки времени, гарантирующие завершение операций чтения/записи, чем постоянно опрашивать состояние флага окончания операции. Необходимость использования линии R/W при этом также отпадает.
.def data = R16 ;регистр для передачи команд и данных .def row = R17 ;регистр с номером строки .def col = R18 ;регистр с номером позиции на индикатор .def temp = R19 ;регистр для промежуточных операций .equ DELAY = 500 ;задержка времени на частоте 1 МГЦ .equ RS = PC0 .equ EN = PC1 ldi temp,high(RAMEND) ;инициализация стека out SPH,temp ldi temp,low(RAMEND) out SPL,temp . clr temp ;обнуляем регистры PORTD, PORTC out PORTD,temp out PORTC,temp ldi temp,0b11110000;для шины 4 бита настраиваем PD7…PD4 на вывод ;ldi temp,0b11111111;для шины 8 бит настраиваем PD7…PD0 на вывод out DDRD,temp ldi temp,0b00000011 ;настраиваем линии PC1,PC0 на вывод out DDRC,temp rcall hd44780_init;инициализируем модуль перед началом работы . ldi row,1 ;выводим надпись "Hello World !" ldi col,3 ;в строку 1 начиная с позиции 3 ldi ZH,high(2*first_string) ldi ZL,low(2*first_string) rcall show_string ldi row,2 ;выводим надпись "Я люблю AVR” ldi col,4 ;в строку 2 начиная с позиции 4 ldi ZH,high(2*second_string) ldi ZL,low(2*second_string) rcall show_string . first_string: ; строка 13 символов "Hello World !" .db "Hello World !",0 second_string: ; строка 11 символов "Я люблю AVR” .db 0x20,0xB1,0x20,0xBB,0xC6,0xB2,0xBB,0xC6 .db 0x20,0x41,0x56,0x52,0x20,0x20,0x20,0x20,0 ; Набор подпрограмм для работы с HD44780(16 символов x 2 строки) ; R16 – регистр для передачи команд и данных ; R17,R18 – счетчики циклов, регистры для задания номеров строки ; и позиции в видеопамяти индикатора ; XH:XL – используется как 2-байтовый регистр для задержки ; времени ; ZH:ZL – указатель на строку символов, хранящуюся во ; FLASH-памяти программ ; DELAY – постоянная для задержка времени (500…10000) ; Вспомогательная подпрограмма записи байта при использовании ; 4-проводного интерфейса ; В R16 в подпрограмму передается байт для записи write_byte: push R16 ;сохраняем регистр с байтом данных andi R16,0xF0 ;выделяем старший полубайт в регистре in R17,PORTD ;копируем содержимое порта во временный andi R17,0x0F ;регистр для модификации or R16,R17;оставляем неизменным состояние младших 4-х линий sbi PORTC,EN ;устанавливаем на линии EN лог.1 out PORTD,R16 ;выводим новое значение в порт ldi XH,high(DELAY) ;формируем задержку времени ldi XL,low(DELAY) rcall pause cbi PORTC,EN ;устанавливаем на линии EN лог.0 pop R16 ;восстанавливаем регистр с байтом данных swap R16;обмениваем полубайты для выделения младших 4-х бит andi R16,0xF0 ;выделяем старший полубайт в регистре in R17,PORTD ;копируем содержимое порта во временный andi R17,0x0F ;регистр для модификации or R16,R17;оставляем неизменным состояние младших 4-х линий sbi PORTC,EN ;устанавливаем на линии EN лог.1 out PORTD,R16 ;выводим новое значение в порт ldi XH,high(DELAY) ;формируем задержку времени ldi XL,low(DELAY) rcall pause cbi PORTC,EN ;устанавливаем на линии EN лог.0 ldi XH,high(DELAY) ;формируем задержку времени ldi XL,low(DELAY) rcall pause ret ; Вспомогательная подпрограмма записи байта при использовании ; 8-проводного интерфейса ; В R16 в подпрограмму передается байт для записи ;write_byte: ; sbi PORTC,EN ;устанавливаем на линии EN лог.1 ; out PORTD,R16 ;выводим байт информации в порт ; ldi XH,high(DELAY) ;формируем задержку времени ; ldi XL,low(DELAY) ; rcall pause ; cbi PORTC,EN ;устанавливаем на линии EN лог.0 ; ldi XH,high(DELAY) ;формируем задержку времени ; ldi XL,low(DELAY) ; rcall pause ; ret ; Вспомогательная подпрограмма задержки времени pause: sbiw XH:XL,1 brne pause ret ; Подпрограмма записи команды ; В R16 передается код команды перед вызовом подпрограммы. write_com: cbi PORTC,RS ;устанавливаем на линии RS лог.0 rjmp write_byte ;записываем команду ret ; Подпрограмма записи данных ; В R16 передается байт данных перед вызовом подпрограммы. write_dat: sbi PORTC,RS ;устанавливаем на линии RS лог.1 rjmp write_byte ;записываем данные ret ; Подпрограмма записи символа ; В R16 передается код символа(0…255), в R17 номер строки ; (1,2), в R18 номер символа в строке (1…40) при входе в ; подпрограмму. show_char: push R16 ;сохраняем регистр с символом subi R18,-0x7F ;если запись идет в строку 1, для получения sbrc R17,1 ;адреса в DDRAM к номеру символа в строке subi R18,-0x40 ;добавляется 0x7F, если в строку 2, mov R16,R18 ;то добавляется 0xBF rcall write_com ;задаем адрес символа в видеопамяти pop R16 ;восстанавливаем регистр с символом rcall write_dat ;записываем символ по текущему адресу ret ; Подпрограмма записи строки символов из FLASH-памяти ; В указателе Z передается адрес строки из FLASH-памяти (стока ; должна заканчиваться нулем), в R17 номер строки (1,2), в R18 ; начальный номер позиции, с которой должна начинаться строка ; (1…40) при входе в подпрограмму. show_string: lpm R16,Z+ ;загружаем код символ из строки tst R16 ;если код 0 (NUL), то строка закончена brne ss1 ret ;и выход из подпрограммы ss1: push R17 ;сохраняем регистр с номер строки push R18 ;сохраняем регистр с начальный номером позиции rcall show_char ;записываем символ pop R18;восстанавливаем регистр с начальным номером позиции pop R17 ;восстанавливаем регистр с номер строки inc R18 ;увеличиваем на 1 номер позиции rjmp show_string ; Подпрограмма инициализации hd44780_init: ldi XH,high(5*DELAY) ;формируем задержку времени ldi XL,low(5*DELAY) rcall pause ldi R16,0x33 ;записываем необходимую для инициализации rcall write_com ;холостую команду ldi XH,high(5*DELAY) ;формируем задержку времени ldi XL,low(5*DELAY) rcall pause ldi R16,0x32 ;записываем необходимую для инициализации rcall write_com ;холостую команду ldi R16,0x28 ;выбираем разрядность шины 4 бита и 2 строки ; ldi R16,0x38;выбираем разрядность шины 8 бит и 2 строки rcall write_com ;на дисплее ldi XH,high(5*DELAY) ;формируем задержку времени ldi XL,low(5*DELAY) rcall pause ldi R16,0x08 ;записываем команду выключения дисплея rcall write_com ldi R16,0x01 ;записываем команду начального сброса rcall write_com ldi XH,high(5*DELAY) ;формируем задержку времени ldi XL,low(5*DELAY) rcall pause ldi R16,0x06 ;записываем команду, задающую направление rcall write_com ;сдвига курсора вправо ldi R16,0x0C ;записываем команду включения дисплея rcall write_com ret
Набор подпрограмм для работы с символьным ЖКИ приведен выше. Подпрограммы write_com, write_dat производят запись команд и данных соответственно. Подпрограмма show_char выводит символ на экран дисплея; show_string переписывает строку, хранящуюся во FLASH-памяти программ, в DDRAM индикатора. Обе подпрограммы в качестве параметров принимаю начальные координаты записи - строку и столбец. В show_string, кроме этого необходимо передать еще и указатель на строку в регистре ZH:ZL.
Отдельно следует сказать о подпрограмме инициализации hd44780_init, которая должна быть вызвана после подачи напряжения питания на модуль. Только в ней могут возникнуть некоторые проблемы. Последовательность команд в ходе этой процедуры может иметь небольшие различия у индикаторов разных типов. Поэтому необходимо обращаться к технической документации на конкретную модель. Неправильная инициализация, обычно, приводит к полной неработоспособности исправного экземпляра.
Перейти к следующей части: Аналоговый вывод
Комментарии (2) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация