Методические указания по выполнению работы. Алфавитно-цифровые жидкокристаллические индикаторы (ЖКИ) представляют собой недорогое и удобное решение

Алфавитно-цифровые жидкокристаллические индикаторы (ЖКИ) представляют собой недорогое и удобное решение, позволяющее обеспечить отображение большого объема информации при хорошей различимости и низком энергопотреблении.

Управление ЖКИ требует выполнения целого ряда весьма специфических действий, таких, например, как генерация управляющих напряжений для адресации множества ячеек, формирование символов и курсора, и т. п. Для аппаратной реализации таких действий выпускаются специализированные микросхемы – контроллеры ЖКИ, которые берут на себя всю низкоуровневую часть реализации индикатора. Промышленным стандартом такой микросхемы, применяемой для построения большинства матричных знакосинтезирующих ЖКИ, является контроллер HD44780 фирмы Hitachi. Этот встроенный непосредственно в ЖКИ контроллер подключается к целевому МК через параллельный интерфейс и предоставляет программисту ряд высокоуровневых команд (например, вывод символа в указанной позиции экрана, сдвиг информации на экране или отображение мигающего курсора). Контроллер также содержит встроенный знакогенератор и экранную память, избавляя разработчика от необходимости рисовать собственные шрифты.

Основными элементами контроллера ЖКИ, с которыми приходится взаимодействовать пользователю при программном управлении, являются регистр данных DR (Data Register), регистр команд IR (Instruction Register), видеопамять DDRAM (Display Data RAM), оперативное запоминающее устройство знакогенератора CGRAM (Сharacter Generator RAM), счетчик адреса памяти АС (Address Counter) и флаг занятости контроллера BF (Busy Flag).

ASCII-коды отображаемых символов через регистр данных DR помещаются в видеопамять DDRAM по текущему адресу, указываемому счетчиком адреса АС. Видеопамять, имеющая общий объем 80 байт, предназначена для хранения кодов символов, отображаемых на экране ЖКИ. Видеопамять организована в виде двух буферов по 40 символов в каждом, и чаще всего длина буфера превышает число символов, выводимых в строке индикатора. В этом случае отображаются только те символы из DDRAM, которые попадают в окно индикатора, как это показано на рис. 3.17.

Рис. 3.17. Отображение символов из DDRAM в окне индикатора

В системе команд ЖКИ имеются команды, задающие смещение окна и направление этого смещения. Смещая окно индикатора относительно буфера данных, можно отображать в окне различные области буфера. Сдвиг окна индикатора относительно буфера данных для верхней и нижней строк происходит синхронно. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости DDRAM.

При внимательном рассмотрении рисунка можно заметить важную особенность. Первая строка DDRAM содержит 40 ячеек, которые адресуется от 0 до 39 (0x27), а вот 40 ячеек второй строки заданы адресами от 64 (0x40) до 103 (0x67). Значения адресов DDRAM в диапазоне 40…63 (0x28...0x3F) являются неопределенными и результаты работы с ними могут быть непредсказуемыми.

Информация, попадающая в регистр команд IR, интерпретируется контроллером ЖКИ как управляющая последовательность. Чтение регистра IR возвращает в семи младших разрядах текущее значение счетчика АС, а в старшем разряде – флаг занятости BF.

Необходимо учитывать, что большинство операций, выполняемых контроллером, занимают время около 40 мкс, а время выполнения некоторых доходит до единиц миллисекунд. Индикатором окончания любой операции служит сброс флага занятости BF, поэтому для определения момента окончания операции программа может опрашивать флаг BF. Второй, более простой и чаще используемый способ заключается в том, что программист, зная, сколько времени требуется на обработку той или иной команды, просто выполняет в программе заведомо достаточную для выполнения команды временную задержку после каждой передачи информации в ЖКИ.

Для реализации интерфейса МК с контроллером HD44780 используется 11 информационных линий, из которых восемь (DB0…DB7) служат шиной для передачи кодов отображаемых символов или команд, а на три линии (RS, R/W, E) подаются управляющие сигналы.

При помощи сигнала на линии RS (Register Select) МК сообщает контроллеру индикатора, какой регистр – IR или DR, должен быть выбран и что будет передаваться по шине – команда или данные. Потенциал на управляющем выводе R/W задает направление передачи данных: запись в память индикатора (R/W = 0) или считывание из памяти (R/W = 1). Сигнал на линии Е (Enable) является стробом, сопровождающим передачу команд и данных. Запись информации в ЖКИ происходит по переходу этого сигнала из 1 в 0.

Список всех управляющих комбинаций сигналов RS, R/W и разрядов регистра IR, а также выполняемые по ним команды приведены в табл. 3.8.

 

Таблица 3.8

RS R/W D7 D6 D5 D4 D3 D2 D1 D0 Назначение команды
Очистить дисплей и установить курсор в нулевую позицию (адрес 0)
* Установить курсор в нулевую позицию (адрес 0). Установить дисплей относительно буфера DDRAM в начальную позицию.
I/D S Установить направление сдвига курсора влево или вправо (I/D = 0/1) при записи очередного кода в DDRAM. Разрешить (S = 1) сдвиг окна вместе со сдвигом курсора
D C B Включить-выключить (D = 1/0) индикатор. Зажечь-погасить (C = 1/0) курсор. Сделать курсор в виде мигающего знакоместа (B = 1)
S/C R/L * * Переместить курсор (S/C = 0) или сдвинуть дисплей (S/C = 1) вправо (R/L = 1) или влево (R/L = 0)
DL N F * * Установить разрядность шины данных 4 или 8 бит (DL = 0/1), количество строк – одна или две (N = 0/1), шрифт – 5 × 7 или 5 × 10 точек (F = 0/1)
AG AG AG AG AG AG Установка адреса CGRAM.
AD AD AD AD AD AD AD Установка адреса DDRAM.
BF AC AC AC AC AC AC AC Чтение busy-флага BF и счетчика адреса AC
Данные Запись данных в DDRAM или CGRAM
Данные Чтение данных из DDRAM или CGRAM

 

В лабораторном стенде используется ЖКИ WH1602C-YGH фирмы Winstar, имеющий две строки по 16 символов в каждой. Схема подключения ЖКИ к МК показана на рис. 3.18.

 

Рис. 3.18. Схема подключения ЖКИ к МК

После включения питания контроллер ЖКИ осуществляет начальную инициализацию индикатора, во время которой по умолчанию производится очистка окна и установка следующих параметров (см. табл. 3.8):

· DL = 1 – разрядность шины данных равна 8;

· N = 0 – однострочный дисплей;

· F = 0 – размер знакоместа 5 × 7 точек;

· B = 0 – мерцание курсора отключено;

· C = 0 – курсор выключен;

· D = 0 – индикатор выключен;

· I/D = 1 – сдвиг курсора вправо;

· S = 0 – сдвиг окна отключен.

Естественно, что такой набор параметров в редком случае может быть признан подходящим (например, в нашем случае используется двустрочный дисплей). Кроме того, инициализация будет выполнена корректно, если напряжение источника питания устанавливает номинальное напряжение менее, чем за 10 мс. Поэтому перед использованием рекомендуется провести повторную программную инициализацию индикатора с установкой необходимых параметров.

При программной инициализации индикатора для работы с 8-разрядной шиной производителем контроллера дисплея рекомендуется выполнять следующую последовательность действий.

После подачи напряжения питания необходимо выдержать паузу более 15 мс для установления номинального напряжения, но из-за различий характеристик используемых источников питания лучше задать длительность паузы в 0.1…0.2 с. Первой операцией задать RS = 0, R/W = 0 и послать команду 0x30, затем сделать задержку не менее 4.1 мс и повторить выполнение команды 0x30. На следующем шаге необходимо вновь выдержать паузу, на этот раз более 100 мкс, и в третий раз повторить команду 0x30. Эти три операции являются инициализирующими, и следом за ними выполняются команды задания режимов работы. После выполнения этих команд необходимо проверять состояние флага занятости BF, но проще выдержать паузу в 100…200 мкс и затем выдавать следующую инструкцию.

Дальнейшая последовательность команд задания режимов для индикатора лабораторного стенда такова:

 

1. Пауза 100…200 мкс и передача кода 0x38

RS R/W   DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
  DL N F

 

DL = 1 (8-битный интерфейс); N = 1 (2 строки); F = 0 (символы 5 × 7 точек).

2. Пауза 100…200 мкс и передача кода 0x0E

RS R/W   DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
  D C B

 

D = 1 (дисплей вкл.); C = 1 (курсор вкл.); B = 0 (мерцание выкл.).

3. Пауза 100…200 мкс и передача кода 0x06

RS R/W   DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
  I/D S

 

I/D = 1 (сдвиг курсора вправо); S = 0 (нет сдвига дисплея).

Поскольку процедура инициализации ЖКИ представляет собой последовательность команд, то полезным будет предварительное создание функции записи команды в регистр команд ЖКИ

#define RS 7 // выбор регистра

#define E 6 // строб передачи

void LCD_cmd(unsigned char cmd) {

//[]--------------------------------------------------[]

//| Назначение: запись кодов в регистр команд ЖКИ |

//| Входные параметры: cmd - код команды |

//[]--------------------------------------------------[]

DDRC = 0xFF; // все разряды PORTC на выход

DDRD |= ((1<<E)|(1<<RS));// разряды PORTD на выход

PORTD &= ~(1<<RS); // выбор регистра команд RS=0

PORTC = cmd; // записать команду в порт PORTC

PORTD |= (1<<E); // \ сформировать на

delay_us(5); // | выводе E строб 1-0

PORTD &= ~(1<<E); // / передачи команды

delay_ms(100); // задержка для завершения записи

}

С учетом этого можно реализовать процедуру инициализации ЖКИ в виде функции.

void LCD_init(void) {

//[]--------------------------------------------------[]

//| Назначение: инициализация ЖКИ |

//[]--------------------------------------------------[]

DDRC = 0xFF; // все разряды PORTC на выход

DDRD |= ((1<<E)|(1<<RS)); // разряды PORTD на выход

delay_ms (100); // задержка для установления

// напряжения питания

LCD_cmd(0x30); // \ вывод

LCD_cmd(0x30); // | трех

LCD_cmd(0x30); // / команд 0x30

LCD_cmd(0x38); // 8 разр.шина, 2 строки, 5 × 7 точек

LCD_cmd(0x0E); // включить ЖКИ и курсор, без мерцания

LCD_cmd(0x06); // инкремент курсора, без сдвига экрана

LCD_cmd(0x01); // очистить экран, курсор в начало

}

Используемый в лабораторном стенде индикатор русифицирован, однако коды символов кириллицы в ЖКИ не совпадают со стандартными кодами из таблицы символов ASCII и перед выводом на ЖКИ символов кириллицы необходимо производить их перекодировку. Не вдаваясь в подробности этой операции, представим функцию, реализующую процедуру такой перекодировки.

unsigned char TabCon[] =

{0x41,0xA0,0x42,0xA1,0xE0,0x45,0xA3,0xA4,0xA5,0xA6,0x4B, 0xA7,0x4D,0x48,0x4F,0xA8,0x50,0x43,0x54,0xA9,0xAA,0x58,