Многие фирмы (Optrex Corporation, Powertip, Seiko Instruments, Batron и др.) выпускают жидкокристаллические индикаторы (ЖКИ) со встроенными контроллерами, облегчающими реализацию интерфейса ЖКИ и микроконтроллера. В данном разделе рассматриваются вопросы аппаратного и программного сопряжения микроконтроллеров AVR и символьных ЖКИ, построенных на базе контроллера HD44780, например, DV0802 [14].
Архитектура и система команд контроллера ЖКИ. Рассматриваемый ЖКИ при помощи стандартного 14-контактного разъема (табл. 2.34) обменивается информацией с управляющим микроконтроллером (в данном случае с AVR). AVR-микроконтроллер посылает в ЖКИ команды (табл. 2.35), управляющие режимами его работы и ASCII-коды выводимых символов. В свою очередь, ЖКИ может посылать AVR-микроконтроллеру по его запросу информацию о своем состоянии и данные из своих внутренних блоков памяти.
Таблица 2.34. Описание выводов стандартного разъема ЖКИ на базе HD44780
№пп | Название вывода | Описание |
VSS | Питание. 0 V. | |
VDD | Питание.+5V. | |
V0 | Напряжение смещения, управляющее контрастностью | |
RS | Вход. Высокий уровень - Данные; Низкий - Команды | |
R/-W | Вход. Высокий-Чтение, Низкий-Запись | |
E | Вход. Строб, сопровождающий сигналы на шине «команды/данные» | |
7-14 | DB0- DB7 | Шина «команды/данные» |
Три вывода 14-контактного разъема предназначены для подачи питающего напряжения и напряжения смещения, которое управляет контрастностью дисплея.
На рис. 2.17 показана рекомендуемая схема подключения этих выводов. Из оставшихся 11 выводов 8 (DB0 - DB7) используются для организации мультиплексированной шины «команды / данные», и на 3 вывода (RS, R/W, E) AVR-микроконтроллер выставляет управляющие сигналы.
На рис. 2.18 изображены временные диаграммы этих сигналов при записи команд/данных в контроллер ЖКИ.
При помощи сигнала на линии RS микропроцессор сообщает контроллеру индикатора о том, что именно передается по шине: команда или данные (высокий уровень – данные, низкий – команды). Cигнал на линии Е является стробом, сопровождающим сигналы на шине «команды / данные». Запись информации в ЖКИ происходит по спаду сигнала E. Потенциал на управляющем выводе R/W задает направление передачи данных: запись в RAM индикатора (R/-W=0) или считывание из RAM (R/W=1).
Контроллер ЖКИ после приема байта команды или байта данных требует некоторого времени (табл. 2.18) для обработки полученной информации, в течение которого AVR-микроконтроллер не должен выполнять новых передач.
Для того, чтобы определить, когда контроллер ЖКИ закончит свои внутренние операции, AVR может опрашивать BUSY-флаг индикатора (команда «чтение busy-флага»), который сбросится только тогда, когда контроллер ЖКИ освободится. Второй, более простой способ заключается в том, что управляющий микроконтроллер, зная, сколько времени требуется ЖКИ на обработку той или иной команды, просто выполняет временную задержку после каждой передачи информации.
Если во время цикла записи AVR-микроконтроллер передает в контроллер индикатора код команды, то этот код записывается в регистр команд контроллера ЖКИ, и команда сразу же начинает выполняться. Если AVR-микроконтроллер передает в контроллер ЖКИ данные, которые представляют собой ASCII-коды отображаемых символов, то они записываются в буфер данных (DDRAM), который обычно содержит 80 ячеек. При записи или считывании буфера данных обращение осуществляется к ячейке, на которую в данный момент указывает курсор.
Таблица 2.35. Система команд контроллера НD4478
Код | Описание команды | Время исполнения команды (fosc=250кГц) |
RS R/W DB7-DB0 | ||
0 0 0 0 0 0 0 0 0 1 | Очистить дисплей и установить курсор в нулевую позицию (адрес 0) | 82 мкс до 1.64мс |
0 0 0 0 0 0 0 0 1* | Установить курсор в нулевую позицию (адрес 0). Установить дисплей относительно буфера DDRAM в начальную позицию. Содержимое DDRAM при этом не меняется. | 40 мкс до 1.6мс |
0 0 0 0 0 0 0 1 I/D S | Установить направление сдвига курсора вправо (I/D=1) или влево (I/D=0) при записи/чтении очередного кода в DDRAM. Разрешить (S=1) сдвиг дисплея вместе со сдвигом курсора. | 40мкс |
0 0 0 0 0 0 1 D C B | Включить(D=1)/выключить(D=0) дисплей. Зажечь (C=1)/погасить (C=0) курсор. Изображение курсора сделать мигающим (B=1). | 40мкс |
0 0 0 0 0 1 S/C R/L * * | Переместить курсор (S/C=0) или сдвинуть дисплей (S/C=1) вправо (R/L=1) или влево(R/L=0). | 40мкс |
0 0 0 0 1 DL N F * * | Установить разрядность шины данных 4 бита (DL=0) или 8 бит (DL=1), количество строк дисплея - одна (N=0) или две (N=1), шрифт - 5х7 точек (F=0) или 5х10 точек (F=1). | 40мкс |
0 0 0 1 ACG | Установка адреса CGRAM. После этой команды данные будут записываться/считываться в/из CGRAM. | 40мкс |
0 0 1 ADD | Установка адреса DDRAM. После этой команды данные будут записываться/считываться в/из DDRAM | . 40мкс |
0 1 B F AC | Чтение состояния busy-флага (BF) и счетчика адреса. | 1мкс |
1 0 | Данные. Запись данных в DDRAM или CGRAM. | 40мкс |
1 1 | Данные. Чтение данных из DDRAM или CGRAM. | 40мкс |
Примечание. DDRAM- Display data RAM - ОЗУ ASCII-кодов, отображаемых символов. CGRAM-Сharacter generator RAM - ОЗУ знакогенератора.
Буфер данных имеет больше ячеек, чем число знакомест дисплея. Смещая окно индикатора относительно буфера данных (см. систему команд), можно отображать на дисплее различные области буфера. У двустрочных индикаторов первые 40 ячеек буфера данных, обычно, отображаются на верхней строке дисплея, а вторые 40 ячеек - на нижней строке. Сдвиг окна дисплея относительно буфера данных для верхней и нижней строк происходит синхронно. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости дисплея (и если предварительно была подана команда отображать курсор).
Интерфейс ЖКИ с AVR-микроконтроллером. На рис. 2.19 приведена принципиальная электрическая схема сопряжения ЖКИ и микроконтроллера ATmega 128. В этой схеме управляющие сигналы R/-W, E и RS формируются программно на обычных линиях ввода/вывода МК. Для записи данных в контроллер ЖКИ используется порт А (PA0-P7), а для формирования управляющих сигналов порт С (PC0 – R/-W; PC1- RS и PC2 - E).
На схеме также показан порт SPI, предназначенный для программирования МК.
Рис. 2.19. Схема подключения жидкокристаллического индикатора и матрицы кнопок
Подключения матрицы кнопок. Во многих приложениях требуется подключения к микроконтроллеру определенного количества дискретных датчиков для определения состояния объекта, а также кнопок для выбора различных программ и/или ввода команд. Проще всего это делать посредством обычных кнопок, повешенных на порт (рис. 2.20). Но, одно дело, когда кнопок две-три, и другое – когда их много. Решение проблемы заключается в подключении кнопок организованных в виде матрицы, т.е. кнопки группируются в строки и столбцы, а полученная матрица последовательно опрашивается микроконтроллером, что позволяет резко снизить количество нужных выводов микроконтроллера ценой усложнения алгоритма опроса (рис. 2.19). На рисунке кружочками обозначены кнопки, включенные так, что при нажатии кнопка замыкает строку на столбец.
Считывающие разряды PD3-PD0 порта D включаются в режиме Pull-up входа, то есть вход с подтягивающими.
Рис. 2.20. Схема подключения кнопок к параллельному порту МК
(Для подключения 8 кнопок используется целиком порт D)
Сканирующие разряды PD7-PD4 порта D работают в режиме выхода, он подключен к столбцам. Столбцы должны быть подтянуты резисторами к питанию (на рис. 2.19 резисторы R1, R3-R5).
Работает следующим образом. В сканирующие разряды выводится значение, состоящее из одного нуля и единицы на всех остальных выводах. Пусть, например, ноль будет на выводе PD4. При считывании порта D (считывающие разряды PD3-PD0) в столбце PD4 будут все единички, если не нажата ни одна кнопка и 0 в одном или более разрядах, если нажата одна или более кнопок. Например, если нажата кнопка на пересечении столбца PD4 и строки PD2, то считывающие разряды PD3-PD0 имеют значения 1011.
Затем число в сканирующем порту сдвигается на один бит влево (или вправо) и сканируется второй столбец и так по кругу. В итоге, зная какой столбец в данный момент времени сканируется и получив значения считывающих разрядов, можно определить координаты нажатой кнопки. В нашем примере PD3-PD0 =1011, а PD7-PD4=1110, т.е. нажатой кнопке соответствует код 11101011. Функциональное назначение каждой кнопки из матрицы определяется программно.При одновременном нажатии более одной кнопки необходимо проводить проверку не по байту, а побитно.
На схеме (рис. 2.19) диоды обеспечивают защиту от замыкания между собой сканирующих линий в случае одновременного нажатия более чем одной клавиши.
Контрольные вопросы
1. Параллельные порты ввода-вывода. Назначение. Примеры использования.
2. Регистры параллельных портов.Настройка выводов.
3. Привести настройки портов на ввод и/или вывод данных. Приведите команды обращения к портам.
4. В чем отличие регистров PORTx и PINx.
5. Приведите фрагмент программы настройки порта А на ввод, порта В на вывод, а порта С на ввод (четные разряды) и вывод (нечетные разряды).
6. Как производится считывание состояний выводов порта?
7. Альтернативные функции портов.
8. Приведите сравнительный анализ схем подключения кнопок к МК (рис. 2.19 и 2.20).
9. Приведите программу опроса и определения номера нажатой кнопки (рис. 2.20)
10. Разработайте другие варианты подключения клавиш к МК
11. Приведите программу формирования временных диаграмм, приведенных на рис. 2.18.