Работаем с ЖКИ. Часть 2

В первой части мы рассмотрели теоретический аспект работы с символьными ЖКИ на базе контроллера HD44780. Сейчас посмотрим на практическую сторону вопроса:

СОДЕРЖАНИЕ:
1. Аппаратная часть.
2. Программная реализация.
3. Симулятор ЖКИ. Калькулятор символов.

Итак, рассмотрим аппаратную часть. Для простоты я заземлил RW, (читать данные с ЖКИ я не буду)

8+2-проводовая схема

Самый простой и быстрый способ связи микроконтроллера с ЖКИ (но требующий минимум 10 (11) свободных ножек микроконтроллера). ЖКИ работает в 8-битном режиме. На схеме ножку RW ЖКИ обычно садят на землю, если не собираются читать данные с индикатора. Сначала отправляют 5 байт инициализации, а потом уже можно и «писать» буковки на ЖКИ (ну и не лишь). Более нечего добавить, потому смотрим схему:

4+2-проводовая схема

Здесь каждый байт данных для ЖКИ отсылается двумя полубайтами (таким образом посылка пяти байт инструкций инициализации превращается в передачу десяти полубайт), схема в два раза медленнее, чем предыдущая, но требует минимум 6 (7) свободных ножек. ЖКИ работает в 4-битном режиме. Схема тут:

На схеме к порту ЖКИ подключена старшая половина порта В, но можно и сделать наоборот (в любом случае входным портом ЖКИ есть DB4-DB7 и сначала в ЖКИ отправляется старший полубайт байта данных, а потом младший).

3-проводовая схема (через сдвиговый регистр – СР)

Дальше начинается самое вкусное. Если есть хотя бы 3 свободных ножки микроконтроллера, можно управлять ими ЖКИ в 4-битном режиме через сдвиговый регистр 74HC595. Такая схема будет работать ещё медленнее, чем две предыдущие, но на обслуживание ЖКИ пойдет лишь 3 лапки микроконтроллера. Можно отдельно пустить сигналы Е и RS с микроконтроллера, тогда интерфейс будет 8-битный 5-проводной (3х74HC595 + 2х(Е, RS)). Здесь уже прочитать данные с ЖКИ нельзя (74HC595 работает лишь в одном направлении). Смотрим схему:

Для понимания принципа работы нужно знать следующее: СР 74HC595 имеет последовательный вход DS, 8х параллельных выходов Q7…Q0 и последовательный выход Q7′. На борту у 74HC595 есть 2 регистра — собственно сдвиговый (каждый разряд сдвигается влево, когда приходит очередной бит) и регистр хранения (с которого наш байт параллельно выводится на выводы Q7-Q0).

Как с ним работать: на лапку DS подаем последовательно байт данных (от старшего бита к младшему, т.к. регистр сдвигается влево) и при этом каждый «висячий» на DS бит подкрепляем лог. «1» на SH_CP (синхроимпульсом). Когда последний бит зашел в СР, необходимо поднять (перевести с «0» в «1») лапку ST_CP — «защелкнуть» данные в регистре хранения (для вывода всего байта на Q7-Q0). Нога MR отвечает за сброс регистра (сброс СР происходит когда на ней появляется лог. «0») ее можно кинуть на микроконтроллер или посадить на «+» питания (если сброс не предусматривается) лапку OE тоже нужно посадить на ноль, иначе выводы Q0-7 сдвигового регистра будут находиться в HI-Z состоянии (подвешенными в воздухе) и логические уровни на них будут произвольными.

Можно попробовать работать в 8-битном режиме, подключив 2 СР последовательно. Тогда тремя ножками микроконтроллера можно дергать 16 ног 595-х (8-битный режим + E + RS+ ещё что-то):

Можно сделать обходной маневр и использовать СР 74SL164 (К555ИР8), управлять которым можно с помощью лишь 2-х ножек микроконтроллера — DATA и CLOCK.

1-проводовая схема

Ну и на десерт есть ещё одна схема со сдвиговым регистром 74HC595. Схему и принцип работы я нашел когда-то на одном из англоязычных сайтов (http://www.romanblack.com/shift1.htm) .

В том случае, когда с ногами микроконтроллера ну очень туго, можно сделать вот так:

+ для управления ЖКИ нужна всего одна нога микроконтроллера;
– на передачу данных уходит относительно много времени.

PS. Для нетребовательных к времени устройств последний пункт самоустраняется.

Как это работает. Здесь мы заставляем 74hc595 различать биты данных, сигнал CLOCK и LATCH за счет разной их длительности. На схеме имеем две RC-цепочки (интегратора): R4C4 и R3C3. Они как раз и позволяют создать необходимую разницу между 3-мя сигналами. Посмотрим на постоянную времени (которая задает время нарастания-спада импульса напряжения) обоих интеграторов:
t1=R1*C1= 1,5 кОм * 2200 пФ = 33*10-4с=3,3мс
t1=R2*C2= 33 кОм * 2200 пФ = 726*10-4с=72,6мс

Номинал R2 должен быть в ~20 раз больше, чем R1.

Давайте посмотрим что творится на DS, SH_CP, ST_CP (масштаба не придерживался — лишь для понимания принципов работы):

Итак что мы видим: мы можем дергать лишь одной лапкой микроконтроллера – будем формировать импульсы (формы 1-1-0-1-1) разной длинны (их мы сразу подаем на SH_CP – сей сигнал будет синхроимпульсами СР)

— поскольку время нарастания/спада напряжения первой R1C1-цепочки значительно меньше, чем второй, то когда на лапке SH_CP находится лог. «1» (конец первого импульса), после интегратора R1C1 на лапке DS уже будет готова лог. «1»;

— чтобы 74hc595 увидел лог. «0» на своем входе, нужно увеличить время нашего импульса (на диаграмме – второй импульс). В конце импульса напряжение на С1 не успеет подняться (а на SH_CP уже будет «1») и 74hc595 увидит лог. «0»;

— ну и чтобы защелкнуть данные в СР нужно, как видно (3-й импульс) подождать пока напряжение на С2 упадет до лог. «0» и поднимется до лог. «1» (условие защелкивания байта). Этот импульс будет одновременно восьмым битом (фактически нулевым битом байта – Q0) и защелкивающим сигналом.

Все очень просто (синий цвет = 0, а красный = 1) – чтобы получить:
лог. «1»   = 1мкс   +    15мкс
лог. «0»   = 15мкс    +    30мкс
защелкивание = 200мкс    +   300мкс

Посчитаем, хватит ли нам ног СР: поскольку у нас дефицит ног микроконтроллера и при этом хотим получить не очень большой код программы, нужно одним махом (байтом) запихнуть, защелкнуть данные в сдвиговом регистре и моргнуть сигналом Е ЖКИ. Тогда последний бит байта-посылки мы и используем как сигнал защелки (напомню, что для 4-битного интерфейса нам нужно всего 6 бит).

Программная реализация

Можно навести тексты (часть программ) для всех случаев коммуникации с ЖКИ здесь, но я подумал, что будет слишком много. Потому, я сейчас коротко расскажу, что к чему, а в архиве (см. ниже) собраны исходники программ работы в 8- 4-биных режимах, а также исходники для работы со сдвиговым регистром и 1-проводового интерфейса, которые легко можно интегрировать в свою программу. Думаю, проблем не должно возникнуть.

ASSEMBLER

Для любителей писать на ассемблере, можно посмотреть подборку программной реализации 8- и 4-битных и последовательного 2-проводового на  74SL164 интерфейсов здесь

Реализация на C

Все интерфейсы реализованы в универсальной библиотеке для символьных ЖКИ lcd.c lcd.h. Файл lcd.с содержит все функции, необходимые для реализации нужного интерфейса. Собственно интерфейс можно указать, раскоментировав нужный дефайн в заголовочном файле библиотеки lcd.h.

lcdtest.c содержит пример работы с этой библиотекой. Программа создана в среде MPLAB 8.3 с компилятором C18. Думаю, адаптация кода под другие компиляторы (например, HI-TECH) не составит труда (алгоритм  рабочей части не поменяется). Если вы используете среду mikroC PRO FOR PIC, то можно воспользоваться уже готовой библиотекой для работы с ЖКИ, так, как разработчики внедрили ее в саму среду разработки. Но мы же не ищем легких путей:)

Библиотека написана под кварц 4 МГц и если вы используете другой, нужно подкорректировать задержки.

void lcd_init(void) – содержит все инструкции, необходимые для инициализации ЖКИ в режимах 8 и 4 бит. Дальше их передача в ЖКИ зависит от интерфейса (раскоментированного дефайна).

lcd_cmd(cmd_val) – предназначена для предварительной подготовки байта команды, lcd_cmd определяет метод посылки этого байта (в зависимости от выбранного интерфейса)

cmd_p(cmd_p) – реализует параллельный 8-битный интерфейс (собственно отсылку байта cmd_p по этому интерфейсу) или по 4-х битному интерфейсу (для подготовленного в lcd_cmd() полубайта).

cmd_s(scmd) – отсылает байт (полубайт команды для 4-х битного интерфейса и два сигнала E и RS) по последовательному интерфейсу в сдвиговый регистр 74HС595. передача осуществляется в две посылки – для имитации импульса E по которому информация записывается в контроллер ЖКИ.

lcddata(dataval) предназначена для предварительной подготовки байта данных. Как и в случае с посылкой команд, посылка символа имеет аналогические функции data_p(data_p) и data_s(sdata) (разница – в сигналах RS)

cmd_1w(cmd_1 w) и data_1w(data_1 w) – занимаются передачей байта в регистр 74HС595 по 1-проводовому интерфейсу.

user_char(cgram_loc, position, *dta) – записывает в ячейку памяти (ее адрес cgram_loc начинается с 0х41 (01хххххх)) знакогенератора ЖКИ пользовательский символ *dta (его шаблон) и выводит его на ЖКИ в позицию DDRAM position.

goto_p_r(p,r) – перемещает курсор в позицию р строки r.

Для реализации связи микроконтроллера с ЖКИ я использовал контроллер PIC18F4550 (какой уже был) и 8х2 ЖКИ WH0802A. Детали смонтированы на макетной плате:

P.S. Если ЖКИ не инициализируется (или делает это через раз) – все дело в питании, помогает установка стабилизатора типа 7805. В 1-проводовом  режиме у меня на ЖКИ появлялся какой-то глюк (хотя на симуляторе все работает идеально) — вместо моего символа появлялся другой. Может быть, есть  ошибка в коде где-то, а может что-то с самим ЖКИ, но другого у меня пока нету.

Ну и можно воспользоваться симулятором 16х2 ЖКИ и калькулятором пользовательских символов, которые находятся здесь

http://www.dinceraydin.com/lcd/charcalc.htm

Там же его можно и выкачать (офф-лайн версию).

Скачать файлы проекта в Proteus и исходные тексты программ вы можете ниже


Прикрепленные файлы:

Добавить комментарий

Ваш адрес email не будет опубликован.