Главная » Микроконтроллеры
Призовой фонд
на октябрь 2020 г.
1. 1500 руб
Сайт Паяльник
2. Тестер компонентов MG328
Сайт Паяльник
3. 150 руб.
От пользователей

Похожие статьи:



Модуль усилителя звука PAM8403

Символьный ЖКИ на базе контроллера HD44780

ЖКИ на базе контроллера HD44780
Рис.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 мА. Для работы некоторых типов ЖКИ может потребоваться дополнительный источник напряжения отрицательной полярности. Технология производства модулей подобного рода непрерывно совершенствуется, что, в целом, положительно сказывается на их размерах и электрических характеристиках.  

Таблица символов CGRAM
Рис.2 Таблица символов CGRAM

Изначально HD44780 имеет предопределенную таблицу символов, размещенную в ОЗУ знакогенератора CGRAM (Character Generator RAM). Для отображения любого из них программа микроконтроллера должна передать координаты позиции и, непосредственно за ними, сам адрес символа из CGRAM. Пример таблицы CGRAM приведен на рис.2. Заглавные и прописные буквы латинского алфавита, числовые знаки, а также большинство знаков препинания совпадают в ней с кодами ASCII. Набор символов, размещенных по адресам 0xA0…0xFF, содержит национальный алфавит (в данном случае кириллицу) того региона, где предполагается его использование. Первые 16 ячеек CGRAM имеют особое значение. При желании, в них могут быть записаны любые пользовательские символы, которых нет таблице (сразу после включения модуля в них находится случайная информация). Упростить преобразование строки, состоящей из букв русского и английского алфавитов, в набор кодов HD44780, можно с помощью утилиты "HD44780" (внешний вид на рис.3). Все, что делает эта программа – приводит в соответствие набор введенных символов с их отображением в таблице CGRAM. Результатом преобразования является набор байтов (с нулевым значением в конце), начинающихся с директивы резервирования FLASH-памяти программ .db.

Утилита HD44780
Рис.3 Утилита HD44780

Нумерация и Функциональное назначение выводов ЖКИ приведены в табл.1. Кроме напряжения питания контроллера VCC, модуль имеет вход регулировки контрастности изображения V0. Питание подсветки (если таковая имеется) подается на выводы A и K.

Последовательность передачи данных в HD44780
Рис.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.

Адреса ячеек видеопамяти DDRAM
Рис.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 точек).

Пользовательские символы в таблице CGRAM
Рис.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, которая должна быть вызвана после подачи напряжения питания на модуль. Только в ней могут возникнуть некоторые проблемы. Последовательность команд в ходе этой процедуры может иметь небольшие различия у индикаторов разных типов. Поэтому необходимо обращаться к технической документации на конкретную модель. Неправильная инициализация, обычно, приводит к полной неработоспособности исправного экземпляра.

Перейти к следующей части:

Теги:

Котов Игорь Юрьевич Опубликована: 2012 г. 0 0
Я собрал 0 0
x

Оценить статью

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография
0

Средний балл статьи: 0 Проголосовало: 0 чел.

Комментарии (2) | Я собрал (0) | Подписаться

0
Сергей #
А что означает одинарная точка? Например строка 14
Ответить
0
Баязет Искаков #
В статье есть ошибка: своих символом в CGRAM можно создать только 8! С адреса &h00 по &h07(1), адреса же &h08 по &h0F(2) являются дубликатами адресов (1). Даже если записать разные значения в (1) и в (2), то в (2) будут все те же значения, что и в (1) !! Учтите при разработке устройств !
Ответить
Добавить комментарий
Имя:
E-mail:
не публикуется
Текст:
Защита от спама:
В чем измеряется напряжение?
Файлы:
 
Для выбора нескольких файлов использйте CTRL

AVR-программатор USB ASP
AVR-программатор USB ASP
Модуль радиореле на 4 канала Конструктор для сборки: предусилитель на лампе 6N3
вверх