Андрей Шишкин дата публикации 01-02-2006 06:36 Программирование LCD - дисплея, на основе микросхемы HD44780. Часть 2.
Рассмотрим конкретный пример подключения LCD: LE-1602T.
Выводы на индикаторе расположены в один ряд.
Назначение выводов:
- 1 - Vss - Минус питания 5В
- 2 - Vdd - Плюс питания 5В
- 3 - Vo - Контрастность
- 4 - RS (Вход выбора регистра : 1 - Регистр данных
- 0 - Регистр инструкций)
- 5- R/W -Чтение/Запись LCD : 1 - Чтение
- 0 - Запись
- 6 - E - Разрешение чтения/записи.
- 7 -14 - DB0 - DB7 - шина данных
- 15 - A - Плюс питания подсветки
- 16 - K - Минус питания подсветки
В качестве питания подсветки можно взять тоже питание (+5V), но последовательно в эту цепь желательно включить переменный резистор на 100 Ом. Чтобы ограничить ток подсветки, иначе светодиоды будут греться, и сгорят. Производитель рекомендует питание подсветки порядка 3 Вольт, но на практике делать отдельный источник питания не хочется.
Контрастность дисплея регулируется резистором на 20 кОм. После подачи питания на всю схему и не запустив программу, добейтесь этим резистором свечения первого ряда на индикаторе. Далее при работе настройте так, чтобы видно было только символы которые вы выводите.
Теперь поговорим об адресации памяти DDRAM и CGRAM. Соответственно при вызове процедуры _MoveCursor(Position:byte); мы и указываем адрес куда хотим поместить курсор.
0 |
1 |
2 |
3 |
... |
39 |
40 |
41 |
42 |
43 |
... |
79 |
В независимости от кол-ва символов в строке индикатора, адресация принята как 40 символов в строке. Например в нашем случае их всего 16.
У HD44780 есть встроенный знакогенератор, адресация его выглядит так:
В нашем случае доступны 2 языка: Английский и Китайский. Но микросхема позволяет определить 8 пользовательских символов начиная с адреса 0 в CGRAM.
Для этого нужно установить адрес CGRAM в 0.
_Control(64);
И произвести запись последовательно уложенных горизонтальных байтов.
То есть символ у нас 5х7, значит должны передать 8 строк, с кодами, посчитав в соответствии с весом бита сумму в строке. Обычно последнюю 8 строку выводят как 0, так как она используется для вывода курсора (подчеркивания).
Для примера мы опишем массив из 8 символов:
var Symbol_Array:array[1..64] of byte = (
0,21,21,21,21,21,21,0,
0,20,20,20,20,21,21,0,
0,16,16,16,16,21,21,0,
0,20,0,0,0,0,20,0,
0, 4, 6,31,31, 6, 4,0,
0, 4,12,31,31,12, 4,0,
0, 0,14,17,17,17, 14,0,
0, 0,14,15,15,15,14,0);
И теперь инициализируем память нашими символами:
for i:=1 to 64 do
_DigitData(symbol_array[i]);
Для вывода символа на экран будем использовать следующую процедуру:
procedure THD44780.PrintSymbol(Position: byte; Number_Symbol:byte);
begin
_Control(128+Position);
_DigitData(Number_Symbol);
end;
где:
- Position - позиция на экране для вывода символа,
- Number_Symbol - номер символа в нашем знакогенераторе (0 -7).
К материалу прилагаются файлы:
[LPT] [Подключение внешних устройств]
Обсуждение материала [ 25-06-2007 08:27 ] 10 сообщений |