Управление
Вообще, данная задача сводится к организации обмена данными между подключаемым контроллером и встроенным контроллером ЖКИ, потому что самой матрицей управляет именно встроенный контроллер. В дальнейшем, когда мы будем говорить о подключении к ЖКИ, следует понимать, что речь идет о подключении к встроенному контроллеру. Перечисленные выше контроллеры ЖКИ имеют аналогичные интерфейсы, наборы команд и распределение памяти, хотя размер встроенной ROM-памяти, последовательность команд инициализации, время выполнения команд и некоторые другие параметры могут несколько отличаться.
Итак, для начала, давайте разберемся с работой ЖКИ.
1) Интерфейс.
Обычно ЖКИ имеет 14 или 16 выводов, назначение которых представлено в таблице 1:
ТАБЛИЦА 1
номер контакта | наименование | описание |
Vss | GND - общий провод (земля) | |
Vdd | Power supply - питание +5В | |
Vo | контраст | |
RS | Register select - выбор регистра | |
R/W | Read/write - чтение/запись | |
E | Enable - вкл/выкл передачи | |
DB0 | Data bit 0 | |
DB1 | Data bit 1 | |
DB2 | Data bit 2 | |
DB3 | Data bit 3 | |
DB4 | Data bit 4 | |
DB5 | Data bit 5 | |
DB6 | Data bit 6 | |
DB7 | Data bit 7 | |
BL+ | питание подсветки | |
BL- | общий провод подсветки |
Таким образом, интерфейс имеет восемь информационных линий: DB7..DB0 и три управляющих: RS, R/W, E.
· Линия RS определяет к какому регистру контроллера ЖКИ мы хотим обратиться, то есть какую информацию мы передаем - данные или команды.
· Линия R/W определяет направление передачи данных - запись в ЖКИ или чтение из ЖКИ.
· Линия E включает (когда на линии высокий уровень) или выключает (когда на линии низкий уровень) передачу информации, сформированной на остальных интерфейсных линиях.
Интерфейс работает следующим образом: сначала на интерфейсных линиях DB7...DB0, RS, R/W формируется информация, которую нужно передать, потом на некоторое время (>500 нс для f0=270 кГц) подается высокий уровень на линию E (в это время ЖКИ считывает информацию), после чего сигнал E переводится опять в состояние низкого уровня. f0 - частота, на которой работает контроллер ЖКИ. Вообще, контроллеры ЖКИ могут работать на разных частотах (у них есть выводы для подключения внешнего резонатора), но обычно используется внутренний генератор на 270 кГц.
После получения каждой порции информации контроллеру ЖКИ требуется некоторое время для ее обработки, поэтому передавать информацию подряд нельзя. После каждой посылки требуется подождать некоторое время, чтобы контроллер ЖКИ освободился. Обычно в даташите указано, какой команде сколько времени требуется для выполнения. Также, в контроллере ЖКИ предусмотрена возможность сообщить внешнему устройству о своем состоянии (BUSY/READY). То есть, при передаче данных, можно либо анализировать состояние контроллера ЖКИ и посылать следующую порцию данных, как только контроллер ЖКИ освободится, либо просто выждать время, большее, чем время выполнения операции по даташиту, после чего посылать следующую порцию данных.
Для уменьшения количества проводов от ЖКИ к внешнему устройству можно использовать не 8, а 4 информационных сигнала (DB7...DB4). Все рассматриваемые контроллеры ЖКИ допускают такую возможность. В этом случае данные передаются в два этапа (кроме первой команды инициализации): 1) передаются управляющие биты и старший полубайт посылки 2) передаются управляющие биты и младший полубайт посылки.
Первое, что нужно сделать после включения ЖКИ - это провести инициализацию. Инициализация заключается в посылке нескольких команд в определенной последовательности. Количество команд инициализации может несколько отличаться у разных контроллеров, но все же базовый набор команд для восьми- и четырехбитного интерфейсов, подходящий для большинства контроллеров, приведен ниже.
Во время инициализации лучше не анализировать флаг BUSY, а тупо ждать положенное время перед посылкой следующей команды, так как флаг начинает выставляться не сразу, а после какой-то команды (смотрите даташит).
Инициализация для восьмибитного интерфейса (f0=270 кГц)
1) включение питания
2) пауза >30 мс
3) FUNCTION SET
RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
N | F | X | X |
N=0 - однострочный дисплей, N=1 - двустрочный дисплей
F=0 - шрифт 5х8, F=1 - шрифт 5х11
4) пауза >39 мкс
5) DISPLAY ON/OFF CONTROL
RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
D | C | B |
D=0 - дисплей выключен, D=1 - дисплей включен
C=0 - курсор выключен, C=1 - курсор включен
B=0 - мерцание выключено, B=1 - мерцание включено
6) пауза >39 мкс
7) DISPLAY CLEAR
RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
8) Пауза >1.53 мс
9) ENTRY MODE SET
RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
I/D | SH |
I/D=0 - уменьшение указателя при операции с памятью, I/D=1 - увеличение указателя при операции с памятью
SH=0 - сдвигание дисплея выключено, SH=1 - сдвигание дисплея включено
Инициализация для четырехбитного интерфейса (f0=270 кГц)
1) включение питания
2) пауза >30 мс
3) FUNCTION SET
RS | R/W | DB7 | DB6 | DB5 | DB4 |
N | F | X | X |
N=0 - однострочный дисплей, N=1 - двустрочный дисплей
F=0 - шрифт 5х8, F=1 - шрифт 5х11
4) пауза >39 мкс
5) DISPLAY ON/OFF CONTROL
RS | R/W | DB7 | DB6 | DB5 | DB4 |
D | C | B |
D=0 - дисплей выключен, D=1 - дисплей включен
C=0 - курсор выключен, C=1 - курсор включен
B=0 - мерцание выключено, B=1 - мерцание включено
6) пауза >39 мкс
7) DISPLAY CLEAR
RS | R/W | DB7 | DB6 | DB5 | DB4 |
8) Пауза >1.53 мс
9) ENTRY MODE SET
RS | R/W | DB7 | DB6 | DB5 | DB4 |
I/D | SH |
I/D=0 - уменьшение указателя при операции с памятью, I/D=1 - увеличение указателя при операции с памятью
SH=0 - сдвигание дисплея выключено, SH=1 - сдвигание дисплея включено
Память
В ЖКИ есть 2 вида памяти: DDRAM, CGRAM (CGROM).
DDRAM - display data RAM (память дисплея) - то, что записано в этой памяти, - непосредственно отображается на дисплее. Эта память имеет следующее адресное пространство и соответственное отображение на дисплее (для дисплея 24х2):
Первая строка
Display position | ||||||||||||||||||||||||
DDRAM address | 00h | 01h | 02h | 03h | 04h | 05h | 06h | 07h | 08h | 09h | 0Ah | 0Bh | 0Ch | 0Dh | 0Eh | 0Fh | 10h | 11h | 12h | 13h | 14h | 15h | 16h | 17h |
Вторая строка
Display position | ||||||||||||||||||||||||
DDRAM address | 40h | 41h | 42h | 43h | 44h | 45h | 46h | 47h | 48h | 49h | 4Ah | 4Bh | 4Ch | 4Dh | 4Eh | 4Fh | 50h | 51h | 52h | 53h | 54h | 55h | 56h | 57h |
То есть, то, что записано в DDRAM по адресу, например, 42h, будет отображаться в третьей позиции на второй строке дисплея. Для дисплеев других размеров доступное адресное пространство DDRAM будет другим (обычно первые 40h адресов - первая строка, вторые 40h адресов - вторая строка и т.д.)
CGRAM (CGROM) - character generator RAM (ROM) - память знакогенератора. Память знакогенератора разделена на CGRAM - доступна для записи/чтения, сюда можно залить 8 своих собственных символов и CGROM - доступна только для чтения, заранее прошитые шрифты. В разных ЖКИ могут быть прошиты разные шрифты, это надо смотреть по доке или можно определить самому, организовав вывод на дисплей последовательно всех прошитых символов.
При обращении к первым шестнадцати символам знакогенератора происходит обращение к CGRAM, при обращении к символам, с номерами старше шестнадцатого - обращение к CGROM. Причем, пользовательских символов ведь всего 8, поэтому первые восемь символов знакогенератора указывают на те же области CGRAM, что и вторые восемь символов.
Иногда, в CGROM могут быть прошиты не все символы, начиная с семнадцатого, а, например, начиная с номера 21h, а при обращении к символам от 10h до 21h на дисплей выводится всякий мусор. Это зависит от прошивки.
Для вывода на экран какого-либо символа, необходимо выполнить следующие действия:
1) установить курсор командой "set DDRAM address" в ту позицию, куда мы хотели бы вывести символ (информационные биты указывают адрес DDRAM, соответствующий выбранной позиции)
SET DDRAM ADDRESS (AC6...AC0 - адрес устанавливаемой позиции курсора в памяти дисплея)
RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
AC6 | AC5 | AC4 | AC3 | AC2 | AC1 | AC0 |
2) вывести символ на экран командой "write data to RAM", при этом информационные биты указывают на номер символа, выводимого из CGRAM/CGROM.
WRITE DATA TO RAM (A7..A0 - номер символа, выводимого из памяти знакогенератора)
RS | R/W | DB7 | DB6 | DB5 | DB4 | DB3 | DB2 | DB1 | DB0 |
A7 | A6 | A5 | A4 | A3 | A2 | A1 | A0 |
Полный список команд для работы с ЖКИ и время их выполнения можно узнать, скачав даташит на любой из рассматриваемых ЖКИ-контроллеров (все они имеют одинаковые наборы команд).
Разобравшись с работой ЖКИ, вернемся к вопросу его подключения к микроконтроллеру. В качестве примера возьмем контроллер PIC16F628A. Ниже показаны примеры схем подключения для восьмибитного и четырехбитного интерфейсов. Подключение подсветки на схемах не показано, поскольку полярность подключения подсветки, иногда, определяется перемычками на плате ЖКИ.