Нет жки-драйвера – есть калькулятор!

Управление ЖКИ (LCD) индикаторами

ПодробностиКатегория: Примеры построения узловОпубликовано 08.03.2014 18:48Просмотров: 4465

В данной статье рассматривается пример подключения жидкокристалического индикатора (сокращенно ЖКИ или LCD) к микроконтроллеру.

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

Сразу отметим, что все ЖКИ можно разделить на индикаторы со встроенным контроллером и простые индикаторы без микроконтроллера. Индикаторы с микроконтроллером более предпочтительны для самостоятельного применения.

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

А интерфейс связи встроенного контроллера обычно совсем не сложный и позволяет легко подключить его к любому универсальному контроллеру. Возмем для примера микроконтроллер Российского производства МТ-10Т7-7.

Это простой индикатор, дисплей которого представляет собой строку из десяти семисегментных знакомест. Напряжение питания такого индикатора от 3 до 5 вольт. Ток потребления 30 мкА. Габаритные размеры 66 X 31,5 X 9,5 мм. Схема подключения такого индикатора к микроконтроллеру приведена на рисунке 1.

Рис. 1.

Для управления индикатором используется порт PB. Линии PB0…PB3 образуют шину данных/адреса. А линия PB4 используется для передачи на индикатор сигнала записи. Выход PB6 используется для выбора адрес/данные. Команды управления передаются на индикатор следующим образом.

Сначала необходимо передать адрес разряда, куда мы хотим записать код очередного выводимого символа. Адрес состоит из одного четырехбитного двоичного числа. Нумерация разрядов ведется слева на право. Самый левый (старший) разряд имеет адрес 0 (00002). Следующий разряд имеет адрес 1 (00012). Последний, самый правый, десятый разряд имеет адрес 9 (10012).

Для того, что бы записать адрес в контроллер индикатора необходимо, что бы на его A0 присутствовал сигнал логического нуля. Значение адреса выставляется на выходах PB0…PB3. А затем на выход PB4 кратковременно подается единичный сигнал, который поступае на вход WR1 индикатора.

По фронту этого импульса адрес записывается в индикатор и запоминается в его внутренней памяти. Теперь, если в индикатор будет записан байт данных, он поступит именно по этому адресу.

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

Для передачи байта данных на входе A0 а значит и на выходе PB6 должен присутствовать сигнал логической единицы. Байт данных передается в индикатор за два приема. Сначала на выводах PB0…PB3 выставляется младший полубайт. По сигналу на WR1 он записывается в память индикатора. Затем на тех же выходах (PB0…

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

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

Рис. 2.

На этом рисунке представлены два варианта работы с индикатором. Запись одного знакоместа и запись нескольких знакомест подряд. Переменный резистор R1 (см. схему на рис. 1) предназначен для регулировки контрастности дисплея.

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

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

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

Источник: http://mirmk.ru/index.php/mikrokontrollery/23-primery-postroeniya-uzlov/49-upravl-lcd-indik

Программное управление простым семиcегментным ЖКИ

В статье рассказывается о применении неспециализированного микроконтроллера в управлении сегментами простого жидкокристаллического индикатора с одним общим электродом.

Вопрос целесообразности такого применения я здесь не затрагиваю и оставляю читателю возможность ответить на него самому.

Цель статьи – показать возможность управления ЖКИ без применения специализированных аппаратных средств на примере реализованной конструкции. Автору удалось изготовить в конце 2013 года часы-будильник (фото справа) со встроенным термометром на базе Atmega8515L, который выполнает все функции устройства, кроме измерения температуры. Для этой цели применен цифровой датчик температуры ADT7301.

Это устройство приведено здесь в качестве примера. Описание реализации обозначеной задачи будет проводится на другом устройстве, имеющем упрощениый функционал – комнатный термометр.

Собственно, что же побудило меня взяться за изготовления комнатного термометра, да еще и таким извратным способом? Этому способствало наличие свободного времени и соответствующих даровых компонентов, т.е. «спасенных» из радиохлама ЖКИ, МК и некоторой прочей мелочи. Семисегментный четырехзначный ЖКИ извлечен из напольных бытовых весов, МК AT90S8515 — из вышедшего из строя многоканального модуля АЦП.

Принцип действия ЖКИ повторять в статье не имеет смысла – легко находится в интернете, но важные моменты я постараюсь раскрыть достаточно широко.

Один из них — применение переменного электрического поля для исключения деградации дисплея. Кратко остановимся на этом моменте.

Слева представлены графики напряжения на электродах ЖКИ. Синим обозначен потенциал общего электрода (ОЭ) дисплея, красным – потенциал и фаза видимого сегмента, зеленым – прозрачного.

Причем в нижней части я заведомо показал возможность наличия остаточного напряжения на электродах относительно GND, которое показывает уровень низкого выходного сигнала микросхемы. В верхне части – соответствующее дифференциальное напряжение на паре сегмент-ОЭ.

Здесь однозначно видно, что приложенное электрическое поле имеет симметричное значение вне зависимости от остаточного напряжения на электродах. Причем разности потенциалов на обкладках неактивного сегмента нет, посему нет и возбуждающего электрического поля.

Справедливости ради обязан сказать, что это верно в случае одинаковых электрических характеристик выходных каскадов управляющей микросхемы, что в большинстве случаев имеет место.

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

Исходя из приведённых графиков формулируем задачу:

  1. 1) напряжение на общем электроде (COM) всегда симметрично-переменное, в нашем случае имеет форму меандра (т.е. прямоугольного сигнала с равными длительностями высокого и низкого значения);
  2. 2) напряжение на электроде неактивного (невидимого) сегмента имеет ту же фазу, что и напряжение на ОЭ;
  3. 3) напряжение на электроде активного (видимого) сегмента имеет противоположную фазу, относительно ОЭ.

Поскольку электроды ЖКИ подключены непосредственно к выходам МК, не имеющем специальной периферии, все эти манипуляции придется выполнять программно.

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

Чтобы переключения электродов ЖКИ произошли по возможности одновременно, данные для вывода значений в порты подготавливаются заранее. При рассмотрении схемы устройства станет понятным, что процедура подготовки этих данных не из самых простых.

Соединения между МК и ЖКИ выбраны из удобства разводки в одном слое, поэтому имеет место «каша» в соответствии выходных портов отдельным сегментам ЖКИ. Четвертое (самое левое) знакоместо сокращено до трех сегментов для вывода «1» или «Минус».

Конечно было бы намного проще управлять сегментами, если бы они были подключены по принципу: одному знакоместу — один порт ввода-вывода, одинаковым сегментам – одинаковые биты. А поскольку выбран другой путь, то придется вводить в программу МК специальные функции преобразования.

Давайте рассмотрим, какие же програмные функции необходимы вообще для всего устройства и в частности – для управления ЖКИ.

Не заостряя внимание на все начальные инициализации самого МК, вырисовываются такие основные задачи:

  1. управление и обмен данными с датчиком температуры;
  2. усреднение и преобразование значений температуры;
  3. преобразование чисел в символы семисегментного индикатора;
  4. и самое главное – программный драйвер ЖКИ.

Собственно, пункты 2 и 3 — довольно банальная задача для конструкторов цифровых термометров, публикаций которых в интернете предостаточно. Пункт 1 относится к ним же, с той лишь разницей, что применен не широкораспространенный DS18x20 или LM75, а ADT7301. Поэтому я заострю все внимание на последнем пункте, который придется разложить еще на несколько.

Как я уже упоминал выше, для точного по времени переключения выходов МК задействован аппаратный таймер Т0, переполнения которого (а значит и прерывания) происходят около 64 раз в секунду, таким образом обеспечивая частоту регенерации ЖКИ в примерно 32 Гц, которая вписывается в рекомендуемый многими производителями диапазон.

Я безуспешно пытался задействовать «часовой» кварцевый резонатор (32768 Гц) с этим МК, чтобы получить точную частоту, поэтому-то и «около 64» из-за использования кварца на 2 МГц – самого низкочастотного из имевшихся в наличии, который стабильно заработал.

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

Выводимые данные представлены двумя наборами: прямым и инверсным, для каждого полупериода и хранятся они в младших регистрах общего назначения (РОН). То есть для каждого из портов имеется пара регистров, например RPB и _RPB (регистр порта Б). Понятно, что содержимое _RPB является битовой инверсией RPB. А вот его значения имеют непростую историю!

Вернемся же к началу цепочки данных — к их источнику. Как я уже упоминал выше, числовое представление температуры преобразовывается в соответствующие коды семисегментного индикатора. Теперь нам нужно перенести биты этих кодов в соответствующие позиции регистров RPA, RPB, RPC и RPB.

Чтобы этот перенос упростить, насколько это возможно, нужно внимательно изучить таблицу соответствия. Я ее получил при помощи экспорта Netlist из EAGLE-схемы. Увы, много совпадений не оказалось, но и та малая их часть несколько упростит преобразование: сегменты 1A и 2A соответствуют 5 биту своих портов.

Также довольно удачно попало самое правое знакоместо, оно полностью подключено в порту С, хотя значения сегментов не подряд. Я в определениях проекта эту особенность учту, приписывая сегментам нужные битовые значения.

Все остальные значения придётся перетасовывать, маскируя и сдвигая на нужную позицию, либо применять команды копирования битов через флаг Т регистра состояния SREG. Второй путь в моем примере оказался даже короче.

Это и есть самая емкая по времени задача. В предыдущем проекте она занимает 56 инструкций.

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

Ну и под конец – создать инверсные пары, так же с учетом текущего состояния PB2 – PB7. Временной момент записи этих пар регистров (RPx и _RPx) немаловажен. Их состояние должно смениться до прихода прерывания Т0, т.е.

до вывода в ЖКИ, поскольку неполностью завершенная конвертация нарушит регенерацию дисплея. Поэтому имеет смысл производить запись в ответственные регистры сразу после их вывода.

Для этого в главном цикле я предусмотрел точку «сна», из которой МК пробуждается таймером и последующие операции цикла выполняются непосредственно за обработчиком прерывания.

Мало того, я еще ввел сравнение результатов последних двух измерений, чтобы не производить лишних преобразований в случае равенства текущей и предыдущей температур. Это сокращает время выполнения главного цикла и увеличивает время «сна» МК, а так же уменьшает потребление энергии.

Теперь обработчик прерывания таймера может попеременно выводить в порты прямые и инверсные значения. В оставшееся время в обработчике еще будет производиться подсчет времени, чтобы в заданные моменты будить и опрашивать датчик температуры, и другие возможные события.

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

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

Скачать архив с исходниками

В архиве есть также фотографии процесса разработки и конечного устройства.

Вопросы, как всегда, в форум.

Источник: http://radiohlam.ru/?p=1438

Управление мультиплексными ЖКИ

Источник: https://pro-radio.ru/it-works/3458

Работа с символьным жидкокристаллическим индикатором

Методическое указание к лабораторной работе на учебном стенде LESO1.

1 Цель работы

  1. Изучить схему подключения жидкокристаллического индикатора (ЖКИ) к микроконтроллеру.
  2. Изучить особенности работы символьного ЖКИ.
  3. Изучить особенность параллельной синхронной передачи данных.
  4. Научится выводить на ЖКИ информацию.

2 Предварительная подготовка к работе

  1. По конспекту лекций и рекомендуемой литературе изучить принцип работы символьного жидкокристаллического индикатора.
  2. По конспекту лекций и рекомендуемой литературе изучить принцип работы параллельных портов ввода-вывода микроконтроллера.
  3. Составить алгоритм работы программы, соответственно заданию.
  4. Составить программу на языке программирования С.

3 Краткие теоретические сведения

3.1 Устройство и принцип работы символьного жидкокристаллического индикатора

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

Графические индикаторы представляют собой матрицу из m строк и n столбцов, на пересечении которых находятся пиксели. Пиксель представляет собой неделимый объект прямоугольной или круглой формы, обладающий определённым цветом; пиксель – наименьшая единица растрового изображения.

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

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

Для упрощения взаимодействия микропроцессорной системы и ЖКИ используют специализированную микросхему – контроллер (драйвер) ЖКИ. Он управляет пикселями жидкокристаллического дисплея и интерфейсной частью индикатора.

Обычно такой контроллер входит в состав индикатора. В целом жидкокристаллический индикатор представляет собой печатную плату, на которой смонтирован сам дисплей, контроллер и необходимые дополнительные электронные компоненты.

Внешний вид ЖКИ показан на рисунке ниже.

Рисунок 1 – Внешний вид жидкокристаллического индикатора

В учебном стенде LESO1 использован двухстрочный восьмисимвольный ЖКИ. Структурная схема показана на рисунке 2.

Рисунок 2 – Структурная схема ЖКИ

В состав контроллера ЖКИ входят три вида памяти: CGROM, CGRAM, DDRAM.

Когда микроконтроллер передает в контроллер ЖКИ ASCII-коды символов, то они записываются в DDRAM (Display data RAM – ОЗУ ASCII-кодов отображаемых символов), такую память называют видеопамятью или видеобуфером. Видеобуфер в символьных индикаторах обычно содержит 80 ячеек памяти – больше, чем число знакомест дисплея.

У двухстрочных индикаторов ячейки с адресами от 0x00 и до 0x27 отображаются на верхней строке дисплея, а ячейки с адресами 0x40 … 0x67 – на нижней строке. Смещая видимое окно дисплея относительно DDRAM, можно отображать на дисплее различные области видеопамяти.

Сдвиг окна индикатора относительно видеобуфера для верхней и нижней строк происходит синхронно, как это показано на рисунке 3. Курсор будет виден на индикаторе только в том случае, если он попал в зону видимости дисплея (и если предварительно была подана команда отображать курсор).

Рисунок 3 – Отображение символов из видеобуфера

Матрицы начертания символов хранятся в памяти знакогенератора.

Память знакогенератора включает в себя CGROM (Character generator ROM – ПЗУ знакогенератора), в которую на заводе-изготовителе загружены начертания символов таблицы ASCII. Содержимое CGROM изменить нельзя.

Для того, чтобы пользователь смог самостоятельно задать начертание нужных ему символов, в знакогенераторе имеется специальное ОЗУ – CGRAM (Character generator RAM). Под ячейки CGRAM отведены первые (младшие) 16 адресов таблицы кодов.

Схема подключения ЖКИ к микроконтроллеру ADuC842 показана ниже на рисунке:

Рисунок 4 – Схема подключения ЖКИ к микроконтроллеру

Интерфейс подключения – параллельный. Для соединения индикатора с микроконтроллером используется 11 линий — восемь для передачи данных (D0D7) и три линии управления.

Линия RS служит для сообщения контроллеру индикатора о том, что именно передается по шине: команда или данные (RS = 1 — данные, RS = 0 — команда).

По линии Е передается строб-сигнал, сопровождающий запись или чтение данных: по переходу сигнала на линии E из 1 в 0 осуществляется запись данных во входной буфер микроконтроллера индикатора. Запись информации в ЖКИ происходит по спаду этого сигнала.

Потенциал на управляющем выводе R/W (Read/Write) задает направление передачи информации, при R/W = 0 осуществляется запись в память индикатора, при R/W = 1 – чтение из нее. Еще три линии предназначены для подачи питающего напряжения (VDD, GND) и напряжения смещения, которое управляет контрастностью дисплея.

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

Рисунок 5 – Диаграмма передачи информации контроллеру ЖКИРисунок 6 – Диаграмма чтения информации из контроллера ЖКИ

В таблице 1 приведены команды контроллера ЖКИ и время, необходимое для выполнения этих команд.

Для того чтобы можно было определить, когда ЖКИ закончит свои внутренние операции, контроллер ЖКИ содержит специальный флаг занятости – BUSY-флаг (BF).

Если контроллер занят выполнением внутренних операций, то BF установлен (BF = 1), если же контроллер готов принять следующую команду, то BF сброшен (BF = 0).

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

Таблица 1 – Команды контроллера ЖКИ

Редакция отказалась от публикации – публикация отказывается от Редакции. Выкладываю после небольшого редактирования; таких матералов при поисках в Сети мне не попадалось, пришлось разбираться самому.

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

На таких индикаторах, кроме собственно цифр, имеются изображения других (служебных) символов; они, как правило, снабжены собственным контроллером, диалог с которым возможен по тому или иному стандартному протоколу.

Можно ли использовать многоразрядные индикаторы без контроллера? Это случаи, когда протокол неизвестен (отсутствует та часть устройства, которая должна формировать сигналы индикации), или МК поврежден. Рассмотрим, как организована индикация в таком приборе.
В http://kulikova-nata.narod.ru/oldsite/articles/lcd/lcd.html , http://radvs.boom.

ru/indicator.html есть описание принципа действия ЖКИ индикаторов вообще, а также рассмотрена конструкция мультиплексного индикатора. Двенадцатиразрядный индикатор такого типа применяется в калькуляторах «CITIZEN». Конструкция одного из разрядов такого индикатора показана на рис.1.

Все сегменты A, B, F всех 12 разрядов конструктивно объединены одним общим (прозрачным) электродом, вывод которого обозначен COM1. Сегменты C, E, G объединены электродом COM2, а D, «точки» каждого разряда и один для всех цифр знак «минус» (на рисунке не показан) – COM3.

Каждое знакоместо имеет три вывода: объединены сегменты B, C, «точка» – вывод обозначен SEG3; A, G, D – вывод SEG2; и F, E, «минус» – SEG1. Таким образом, сформирована матричная структура, которой можно управлять. Электроды COM возбуждаются трёхуровневым сигналами, один цикл индикации составляет 6 тактов.

В принципе, для включения всех сегментов достаточно первых трёх тактов (1, 2, 3), ещё три (4, 5, 6) нужны именно для организации знакопеременного напряжения на выводах индикатора. Как известно, возбуждение сегментов ЖКИ желательно производить переменным напряжением, при этом долговечность индикатора на порядок выше.

Следовательно, сигналы управления также должны быть инвертированы.На временных диаграммах показаны сигналы, которые необходимы и достаточны для индикации всех возможных состояний индикатора. На диаграмме 4 показаны эпюры напряжений, которые, будучи поданы на выводы SEG1,2,3 приведут к гашению всех сегментов. Это состояние обозначено символом 0.

Зажигание сегмента обозначено символом 1 и все восемь возможных вариантов приведены на диаграммах 4 – 11. Если сигналы 9 – 11 будут поданы на выводы SEG так, как указано на рисунке, будет индицироваться цифра 0 (с децимальной точкой).

Индицируемые сегменты выделены красным цветом, сегмент G и знак «минус» не индицируется, они обозначены черным цветом. Легко заметить, что включение егмента происходит только в те моменты, когда сигналы на выводах COM и SEG находятся в противофазе. Если сигналы синфазны, происходит гашение сегмента.

Кроме рассмотренного случая сегменты могут быть конструктивно объединены в другом сочетании. Разобраться несложно – неизвестный индикатор можно «прозвонить» простым, общеизвестным способом: достаточно прикоснуться жалом включенного в сеть паяльника к выводу прибора, как подключенные к нему сегменты будут видны на экране.

Встречаются индикаторы, имеющие два или четыре, а не три общих электрода. При этом цикл индикации будет равен четырём или восьми тактам соответственно. Очевидно, что схему управления мультиплексными индикаторами лучше всего делать на микроконтроллерах. Собирать схему на простой логике неоправданно по причине трудоёмкости и увеличения габаритов изделия.

Команда Код Описание Время исполнения команды
RS R/W D7 D6 D5 D4 D3 D2 D1 D0
Очистка дисплея 1 Записывает код 0x20 (пробел) во все ячейки DDRAM, устанавливает счетчик адреса DDRAM в 0x00. 1,5 мс
Возврат в начальную позицию 1 х Устанавливает счетчик адреса DDRAM в 0x00 и возвращает курсор в начальную позицию. Содержимое DDRAM не изменяется. 1,5 мс
Режим ввода 1 L/R SH Задает направление перемещения курсора (L/R) и разрешает сдвиг сразу всех символов (SH). 38 мс
Включение-выключение дисплея 1 D C B Устанавливает/ отключает биты, отвечающие за включения дисплея (D), отображение курсора (C), мерцание курсора (B). 38 мкс
Сдвиг курсора или видимой области дисплея 1 D/C R/L x x Бит D/C определяет то, что будет перемещаться – видимая область дисплея или курсор (при D/C = 1 перемещается видимая область, при D/C = 0 – курсор), R/L задает направление перемещения. DDRAM не изменяется 38 мкс
Начальные установки 1 DL N F x x Определяет разрядность шины интерфейса (DL = 1 8-бит, DL = 0 4-бита), количества строк на дисплее (N = 1 – две строки, N = 0 – одна строка) и размера символов (F = 1 – 5×11 точек, F = 0 5×8 точек). 38 мкс
Установка адреса CGRAM 1 A5 A4 A3 A2 A1 A0 Установка счетчика адреса CGRAM 38 мкс
Установка адреса DDRAM 1 A6 A5 A4 A3 A2 A1 A0 Установка счетчика адреса DDRAM 38 мкс
Чтение BF и счетчика адреса 1 BF A6 A5 A4 A3 A2 A1 A0 Если BF = 1 то контроллер ЖКИ выполняет внутреннюю операцию. А6 – А0 – текущее значение адреса DDRAM.
Запись данных в RAM 1 D7 D6 D5 D4 D3 D2 D1 D0 Запись данных в ОЗУ (DDRAM или CGRAM) 38 мкс
Чтение данных из RAM 1 1 D7 D6 D5 D4 D3 D2 D1 D0 Чтение данных из ОЗУ (DDRAM или CGRAM) 38 мкс

Перед началом работы требуется произвести инициализацию ЖКИ согласно алгоритму, показанному на рисунке 7.

Рисунок 7 – Алгоритм инициализации ЖКИРисунок 8 – Таблица символов знакогенератора

3.2 Рекомендации по программному управлению ЖКИ

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

В любом случае, общий алгоритм передачи информации контроллеру не изменится.

Руководствуясь диаграммой передачи информации (рисунок 5), определим последовательность действий при передаче информации в ЖКИ следующим образом: устанавливаем требуемое значение RS, на линию R/W подаем логический ноль, затем на линию E выводим логическую единицу, после чего подаем на шину D значение передаваемого байта.

Контроллер ЖКИ считает этот байт и состояние управляющих линий (RS, R/W) только после подачи на линию E логического ноля. При этом, если временные задержки, указные на диаграмме, меньше длительности машинного цикла, то ими можно пренебречь. Код программы, реализующей запись в память ЖКИ байта данных, показан ниже:

В приведенном участке программы подразумевается, что переменные RS, RW и E объявлены как sbit, а переменная Data – как sfr. Аналогично будет происходить передача любой команды контроллеру ЖКИ.

При реализации чтения информации из контроллера необходимо пользоваться диаграммой, приведенной на рисунке 6. Следует помнить, что для того, чтобы ввести информацию с параллельного порта, в него предварительно должны быть записаны логические единицы.

Для того, чтобы не загромождать основную программу алгоритм инициализации (рисунок 7) можно реализовать в виде отдельной подпрограммы. Временные задержки, указанные в алгоритме, следует задавать с помощью таймеров, как это делалось в лабораторной работе «Изучение таймеров микроконтроллера».

4 Задание к работе в лаборатории

SFR параллельных портовSFR таймеровSFR UART

4.1 Вывод символа на ЖКИ

  1. Разработайте алгоритм программы, выводящей на экран ЖКИ ваше имя в заданной строке. Режим работы ЖКИ и номер строки определяется согласно варианту задания (таблица 2).
  2. По принципиальной схеме учебного стенда LESO1 определите, к каким выводам микроконтроллера ADuC842 подключен ЖКИ. По таблице SFR определите адреса используемых портов ввода-вывода.
  3. Разработайте и введите текст программы в соответствии с созданным алгоритмом.
  4. Оттранслируйте программу, и исправьте синтаксические ошибки.
  5. Загрузите полученный *.hex файл в лабораторный стенд LESO1.
  6. Убедитесь, что на экране дисплея в заданной позиции появился требуемый символ.

4.2 Управление ЖКИ через последовательный порт персонального компьютера (дополнительно)

  1. Измените программу таким образом, что бы на экране ЖКИ выводилась информация, переданная с персонального компьютера через UART. Передача команды осуществляется через терминал nwFlash. Выбор источника синхронизации и скорости передачи данных осуществляется по усмотрению студента.
  2. Загрузите полученный *.hex файл в лабораторный стенд LESO1.
  3. Через терминал nwFlash передайте коды символов, убедитесь, что соответствующие символы выводятся на экране индикатора.

Таблица 2 – Варианты заданий

номер варианта номер строки режим курсора
1 первая выключен
2 вторая включен, мерцает
3 первая включен, не мерцает
4 вторая выключен
5 первая включен, мерцает
6 вторая включен, не мерцает
7 первая выключен
8 вторая включен, мерцает
9 первая включен, не мерцает
10 вторая выключен
11 первая включен, мерцает
12 вторая включен, не мерцает
13 первая выключен
14 вторая включен, мерцает
15 первая включен, не мерцает

5 Указания к составлению отчета

Отчет должен содержать:

  1. Цель работы.
  2. Принципиальную схему подключения ЖКИ к управляющему микроконтроллер.
  3. Структурную схему ЖКИ.
  4. Диаграммы передачи данных по параллельному интерфейсу.
  5. Расчет параметров таймера.
  6. Графическую схему алгоритма работы программы.
  7. Исходный текст программы.
  8. Содержимое файла листинга программного проекта.
  9. Выводы по выполненной лабораторной работе.

Схемы, а также отчет в целом, выполняются согласно нормам ЕСКД.

Источник: http://www.labfor.ru/guidance/mpu-leso1/6

Подключаем ЖКИ на базе ks0066 к AVR. Программа на Си. Шаг № 4

Обновлено 23.02.15. Всем привет. Рассмотрев первую программу в статье №3на микроконтроллере, способы настройки Makefile (статья №2), заливки, а также имея «aрсенал» необходимой литературы (статья №1), приступаем чуть к более сложному этапу: подключим ЖКИ к AVR и разберем алгоритм «общения» с ним.

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

Как и во всех устройствах у индикатора есть свои  параметры:

– важным является время релаксации — это то время, которое необходимо для возвращения молекул жидкого кристалла в исходное состояние после выключения поля,  и составляет 30-50 мс. Приемлемо для индикаторов, но не достаточно для компьютерных мониторов. Данный параметр зависит от температуры;

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

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

Поэтому для управления ЖКИ используются контроллеры.

От общей теории перейдем к практике. Рассмотрим ЖКИ фирмы RAYSTAR RC1602D-YKY-CSX, на базе контроллера ks0066 (Samsung), который является аналогом hd44780, за исключением алгоритма инициализации hd44780.Ну что ж разберем техничексое описание и напишем функции на Си..

На общей блок-диаграмме видно примерное взаимодействие элементов модуля. Контроллер управляет индикатором а мы будем управлять контроллером. Он имеет свой набор команд, определенные требования по задержкам. Кстати команды обоих контроллеров (hd44780  и ks0066)  идентичны, также и по временным задержкам.
На рисунке ниже приведено описание выводов модуля.

С 4 по 14 пин — эти выводы непосредственно подключаются к микроконтроллеру. На блок-диаграмме (выше)  пин №3 подключен к переменному резистору (подстроечному). Регулируя его мы регулируем контрасность. Однако если прибор используется в промышленности то используется другая схема включения для регулировки контрастности в зависимости от переменны температуры.

Interface Pin Function.

Для экономии «ножек» микроконтроллера, при подключениии к ЖКИ,  существует два варианта подключения к шинам данных: 8-ми битная и 4-х битная.

Программа для 4-х битного подключения сложней, но зато экономия! В этом варианте байт передаётся в два приёма: на старшую половину шины данных ЖК-модуля, первым передают старший полубайт, затем – младший.
В  даташите описаны алгоритмы для двух режимов работы.

Рассмотрим инициализацию  для 4-х битного режима, которая кардинально отличается от аналогичногоконтроллера hd44780.

Напишем функции для работы с ЖКИ.
1.Инициализация 4 –битного интерфейса контроллера ks0066

На рисунке слева приведен порядок инициализации контроллера ks0066 . Как видно, алгоритм делится на четыре блока: инициализация самого дисплея и строчного режима(одно или двух); включение или выключение управления дисплеем; очистка дисплея; установка режима ввода.

Пусть выводы ЖКИ DB7, DB6, DB5, DB4 соответствуют ножкам PB7,PB6,PB5,PB4 , а выводы RS- PB0, R/W-PB2,Е-PB1. ЗАМЕТЬТЕ ЧТО ЭТО УСЛОВНОСТЬ, МОЖНА БРАТЬ ЛЮБЫЕ НОЖКИ МИКРОКОНТРОЛЛЕРА AVR.

Перед написанием функции используем макросы препроцессора define для настройки программы под другие ножки, т.е. используем приемы универсальности. Данный вопрос мы рассмотрели в статье №20. Итак что б не писать каждый раз строки, например посылки комманды

PORTB = 0×20;                   

_delay_us (2);                       

PORTB |= _BV (PB1);         

_delay_us (2);                        

PORTB &= ~_BV (PB1);    

Длинные строки PORTB |= _BV (PB1);  мы упрощаем путем переопределения в define, а однотипный алгоритм запихиваем в функцию

#define PORTLC PORTB /*Порт подключения к ЖКИ*/

#define DDRLC DDRB /*Определяем направленность вход/выхода порта*/

#define poryd 0b11110011/*Определяем подключенные ножки порта к ЖКИ*/

#define E PB1  /*Нога подключенная для передачи строба подтверждения передачи данных*/

#define RS PB0  /*Нога для характера(команда или данные) передачи данных*/

#define E1 PORTLC |= _BV (E);      

#define E0 PORTLC &= ~_BV (E);

#define RS1 PORTLC |= _BV (RS); /*RS=1: данные которые следует отобразить*/ 

#define RS0 PORTLC &= ~_BV (RS); /*RS=0: влияющая на режим работы дисплея*/

Все теперь мы можем легко поменять порт и применить программу к другому микроконтроллеру. Пропишем функцию передачи команды

void  command_lcd (unsigned char cmd)

{

         PORTLC = (cmd & 0xF0); /* Передаем старший полубайт *1111 0000 */

         RS0;   /*Для передачи комманды*/

         E1;     /*Подтверждение передачи данных*/

         _delay_us (2); /* Небольшая задержки для обработки команды    контроллером ЖКИ*/

         E0; /*Окончание импульса строба*/  

         PORTLC = ((cmd & 0x0F) 1) {adr = x + 64;}  /*если вторая строка, то переводим символ на вторую строку, 64- в десятичной ,соответствует 40 в 16-ричной*/

            else { adr = x;}    /* иначе присваиваем переменной позицию курсора в первой строке, добавляя максимальную длину строки*/

/*Передаем номер ячейки  индикатору для этого проведем побитовое сложение*/

             adr = adr|0×80;    /*0xxx xxxx | 1000 0000*/

             command_lcd (adr);

}

Адресса знакомест на дисплее.

3.Напишем функцию вывода строки, передачи данных и очистка дисплея

void PrintString (char *sign )

{

          unsigned char i;   

          for (i=1;i

Источник: http://www.ap-impulse.ru/podklyuchaem-zhki-na-kontrollere-ks0066-shag-4/

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}