Подключение и программирование LCD на основе HD44780U — Архив WASM.RU

Все статьи

Подключение и программирование LCD на основе HD44780U — Архив WASM.RU

знакосинтезирующего

Многие хотят выделить корпус своего ПК из общей массы либо повысить удобство пользования им. В данной статье я расскажу о подключении ЖК модуля к компьютеру и соответственно о его программировании.

Как правило существует несколько видов таких дисплеев – сегментные, знакосинтезирующие, графические. Мы рассмотрим знакосинтезирующие модули на HD44780U совместимом контроллере.

С чего начать

Для начала стоит определиться и купить нужный вам дисплей знакосинтезирующие как правило представлены 1, 2, 4, 8 строчными по 8, 16, 20, 24, 40 символов, могут иметь светодиодную подсветку. Далее нужен плоский кабель (шлейф) и разъём DB-25M. Припаиваем шлейф к контактной гребёнке на дисплее, и к разъёму согласно разводке и схеме, также советую для надёжности залить контактную гребёнку термоклеем. Для питания дисплею нужно 5 в. – можно подключить к USB или через molex, при этом подсветку следует подключить через токоограничительный резистор на 5-10 Ом. Сразу после включения питания на дисплее должна появиться тестовая строка свидетельствующая о его исправности.

Разводка LPT порта

Назначение

Регистр

Биты

Выводы

Данные (вход/выход)

378h

0:7

2:9


Управление (выход)

37Ah


0

1 (strobe) инвертирующий

1

14 (lf/cr)

2

16 (init)

3

17 (slin)

Состояние (вход)



379h

3

15 (err) инвертирующий

4

13 (slct)

5

12 (pe)

6

10 (ack)

инвертирующий

7

11 (busy)

Разводка знакосинтезирующего LCD-дисплея

Назначение

Вывод

Земля

1 GND

Питание

2 VCC 5+

Контраст ЖКИ

3 VSS

Выбор регистра (команда/данные)

4 RS

Чтение/запись

5 R/W

Синхронизация (по спаду)

6 E

Шина данных

7:14 data bus

Подсветка -

15

Подсветка +

16

Соответствие линий порта и дисплея

LCD

LPT

4 RS

16 init

6 E

1 /strobe

7:14 data bus

2:9 data

Дисплеи поддерживают два типа интерфейса – 8 и 4 бита, то есть в случае использования 4 битной шины можно использовать старшие 4 линии шины т. е. припаять к линиям 6:9 порта линии 11:14 дисплея.

Теперь коротко рассмотрим структуру дисплея. На входе дисплея стоят два регистра-защёлки – инструкций и данных, выбор нужного регистра осуществляется установкой/сбросом линии RS (Register Select) в случае низкого уровня байт помещается в регистр команд, если уровень высокий соответственно регистр данных. Защёлкивание байта/полу-байта происходит по спаду линии E (Enable). Далее инструкции идут на обработку в декодер команд, данные в память дисплея, а на выходе если установлена линия RW (переключает направление интерфейса) контроллер устанавливает флаг занятости подробнее см. систему команд дисплея, эту фичу для упрощения управляющей программы мы опускаем потому, что дисплею как правило на обработку команд хватает 1-2 мс. то есть делаем небольшую задержку. Затем данные поступают в знакогенератор, откуда уже микросхема-драйвер дисплея выводит их непосредственно на ЖКИ. Знакогенератор дисплея кстати поддерживает определение восьми пользовательских символов с номерами от 0 до 7. Более подробно о структурной схеме дисплея можно узнать из даташита на HD44780U.

Важно отметить, что дисплеи как правило не поддерживают русский язык, но в таблице есть некоторые русские символы так что можно спокойно сделать перекодировку и тех символов которых не хватает, заменять похожими латинскими к примеру «Х» рус. на «X» (икс) и т. п.

Программирование

Писать управляющую программу будем на Delphi, если кто-то в силу религиозных убеждений его не использует, то думаю не составит труда перевести программу на нужный язык.

Для начала нам надо получить доступ к портам ввода/вывода, я для этого использую простой драйвер (спасибо Four-F за статьи) через который собственно и обращаемся к LPT порту. Код драйвера, написан под масм.

Управляющие диаграммы

Система команд HD44780U

Команда


Сигналы

Описание


RW

RS

7

6

5

4

3

2

1

0

Clear

0

0

0

0

0

0

0

0

0

1

Очистка дисплея

Return

0

0

0

0

0

0

0

0

1

0

Установка курсора в начало

Mode

0

0

0

0

0

0

0

1

I

S

Выбор режима, I – движение курсора вперёд, S – сдвиг символов

Control

0

0

0

0

0

0

1

D

C

B

Управление, D – дисплей включён, C – курсор влючён, B – курсор мигает.

Cursor


0

0


0


0

0


1

SS

SR





Курсор, SS - сдвиг строки символов, SR – сдвиг вправо

Set

0

0

0

0

1

IT

F

S

-

-

Установка, IT – 8 бит интерфейс, F – шрифт 5х10, S – 2 строки

Set CGRAM

0

0

0

1

Address

Установка адреса ячейки знакогенератора для записи/чтения

Set DDRAM

0

0

1

Address

Установка адреса ячейки ОЗУ для записи/чтения

Data write

0

1

Data

Запись данных

Data read

1

0

B

Data

Чтение данных, B - флаг занятости

Как уже сказано на входе дисплея стоит регистр-защёлка, байт/полу-байт защёлкивается по спаду E, соответственно линия RS переключает регистр команды/данные. Вот код для вывода команд и данных в дисплей. Для краткости рассмотрим работу по 8 битному интерфейсу, замечу что при 4х битном обмене сначала выводится старший полу-байт, затем младший, подробнее см. исходник в аттаче.

Procedure OutCmd(cmd: byte);
Begin
	OutPort($37A, 0); // Устанавливаем линию /strobe - E – высокий уровень
	OutPort($378, cmd); // Выводим команду дисплею
	OutPort($37A, 1); // Сбрасываем /strobe - E низкий уровень – дисплей начинает обрабатывать команду
End;

Procedure OutData(data: byte);
Begin
	OutPort($37A, 0 or 4); // Устанавливаем линию /strobe E – высокий уровень и устанавливаем init - RS так как выводим данные.
	OutPort($378, data); // Выводим данные дисплею
	OutPort($37A, 1 or 4); // Сбрасываем /strobe на E низкий уровень – дисплей начинает обрабатывать команду
End;

Отлично теперь мы можем говорить дисплею, что делать, но чтобы хоть что-то на него вывести надо проинициализировать. Определим команды дисплея и напишем процедуру инициализации.

const
LCD_CLR=1; // очистка
LCD_RET=2; // возврат курсора
LCD_MODE=4; // режим
 cur_ahead=2; // курсор движется вперёд
 shift_lcd=1; // сдвиг дисплея
LCD_CONTROL=8; // управление ЖКИ
 display_on=4; // вкл. ЖКИ
 cur_on=2; // вкл. курсор
 blink_on=1; // мигающий курсор
LCD_CUR=$10; // режим курсора
 displ_shift=8; // сдвинуть дисплей на один символ
 shift_2_right=4; // сдвиг вправо
LCD_SET=$20; // установка
 i8bit=$10; // 8 битный интерфейс
 strnum2=8; // 2 строки
 font5x10=4; // шрифт 5х10

procedure InitLCD();
begin
	Outcmd(LCD_SET or i8bit or strnum2); // установка, интерфейс 8 бит, 2 строки
	sleep(10);
	Outcmd(LCD_SET or i8bit or strnum2);
	sleep(10);
	Outcmd(LCD_SET or i8bit or strnum2);
	sleep(10);
	Outcmd(LCD_MODE or cur_ahead); // режим, смещение курсора вперёд
	sleep(10);
	Outcmd(LCD_CONTROL or display_on {or cur_on or blink_on}); // дисплей включён, курсор отключен и не мигает.
	sleep(10);
	Outcmd(LCD_CLR); // очистка
	sleep(10);
	Outcmd(LCD_RET); // возврат курсора
	sleep(10);
end;

Теперь можем, можем что-нибудь и вывести. Этот код рассчитан на дисплей с двумя строками.

procedure OutStr2line(Line1, Line2: string);
var l1, l2: array [0..40] of char; i: dword; d: dword;
begin
	FillChar(l1, 40, ' ');
	FillChar(l2, 40, ' ');
	CopyMemory(@l1, @line1[1], length(line1));
	CopyMemory(@l2, @line2[1], length(line2));
	
	OutCmd(LCD_RET);
	sleep(1);
	for i:=0 to 39 do
 begin
	OutData(byte(l1[i]));
	for d:=0 to 10000 do asm nop end; // задержка
 end;

 for i:=0 to 39 do
 begin
	OutData(byte(l2[i]));
	for d:=0 to 10000 do asm nop end; // задержка
 end;
end;

На каждую строку дисплей отводит 40 символов, разумеется если ваш дисплей имеет меньше 40 символов в строке выведется только часть.

Вот собственно и всё что касается основ программирования дисплеев на основе HD 44780. В следующей статье рассмотрим программирование графического ЖКИ. Полный исходный текст драйвера, программы в аттаче.

Замечания, предложения, критику на exp10der[AT]mail.ru, ICQ: 555-869-5;

2002-2013 (c) wasm.ru