Светодиодный дисплей 7×7 на микроконтроллере avr

AVR Урок 12. LCD индикатор 16×2. Часть 1

Урок 12

LCD индикатор 16×2

Сегодня мы начнём изучение жидкокристаллического индикатора символьного, который способен выводить определённые символы в две строки по 16 символов в каждую. Изучать мы данный индикатор будем с целью его подключения к микроконтроллеру AVR и управления им.

Выглядит индикатор, с которым мы будем работать вот таким вот образом

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

Вроде и кажется, что 16 контактов – это много, но на самом деле не так уж и много. За счет контроллера HD44780, установленного в модуле, нам не придется подводить по 8 и более контактов к каждому из 32 символов, этим как раз и займётся данный контроллер. Мы лишь только будем давать ему определённые команды и посылать определённые данные. Хотя это также сопряжено с определёнными трудностями программирования данного устройства, но на это и существует урок, чтобы данные трудности как-то преодолеть.

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

Например, модуль компании Winstar на 1 ножке имеет анод, а наш китайский дисплей, который стоит дешевле, в отличие от Winstar, на данной ножке имеет катод.

Поэтому будьте внимательны и читайте документацию на тот именно модуль, который будет у вас.

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

Ну раз уж мы увидели надписи на ножках модуля, давайте тогда разберёмся, какая ножка для чего служит. Пойдём слева направо.

Ножка первая – VSS – это общий провод или «земля»

2 – VDD – питание.

3 – V0 – это ножка, с помощью которой регулируется контрастность дисплея. То есть контрастность дисплея будет зависеть от поданного напряжения на данную ножку. Как правило берётся переменный резистор на 10 килоом, подключенный крайними ножками на общий провод и на питание, а с центральной ножки данного резистора провод идёт как раз на ножку V0 и посредством регулировки движка резистора мы и регулируем контрастность дисплея в модуле.

4 – RS – это такая хитрая ножка, с помощью которой контроллер дисплея будет «знать», какие именно данные нахдятся на шине данных. Если мы подадим на данную ножку логический 0, то значит будет команда, если 1 – то это данные.

5 – RW – данная ножка в зависимости от логического состояния на ней говорит контроллеру дисплея, будем мы с него читать или будем мы в него писать данные. Если будет 0 – то мы в контроллер дисплея будем писать, а если 1 – то будем читать данные из контроллера дисплея. Данная функция используется редко. Как правило мы всегда только пишем данные в дисплей. Чтение обычно требуется для того, чтобы определить, что дисплей принял наши данные, либо чтобы определить состояние. Но существуют определённые тайминги, позволяющие нам на слово «верить» котнроллеру дисплея, что он наши данные принял и обработал. Также читать мы можем из памяти дисплея, что, в принципе, незачем. Поэтому мы обычно соединяем данный контакт с общим проводом.

6 – E – это так называемая стробирующая шина, по спадающему фронту (когда 1 меняется в 0) на которой контроллер дисплея понимает, что именно сейчас наступил момент чтения данных на ножках данных D0 – D7, либо передачи данных из модуля в зависимости также от состояния ножки RW.

Ножки D0 – D7 – это параллельная восьмибитная шина данных, через которую и передаются или принимаются данные. Номера 0 – 7 соответствуют одноименным битам в байте данных. Но также есть ещё 4-битный способ передачи данных в контроллер и из контроллера дисплея, когда используются только ножки данных D4 – D7, а ножки D0 – D3 уже не используются. Как правило такой способ используется в целях экономии ножек порта и именно такой способ мы и будем сегодня использовать, так как мы теряем скорость вдвое, но у нас дисплей символьный и спешить нам некуда. В 4-битном режиме мы передаём или принимаем байт в 2 приёма по половинке, сначала старшую часть байта, затем младшую.

Ножки A и K – это анод и катод для подачи напряжения для питания светодиодной подсветки дисплея. Как правило можно питать от 5 вольт, но желательно поставить токоограничивающий резистор на 100 ом и скорее всего тогда подсветка дисплея «проживёт» дольше. Всё это обычно указывается в технической документации на дисплей.

Также данную информацию мы видим в технической документации на дисплей

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

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

Например, первая команда Clear Display говорит сама за себя. Она очищает дисплей. Вообще за отображение на дисплее у нас отвечает оперативная память DDRAM, также существующая в контрроллере дисплея. Вот данную память как раз и очищает данная команда.

Остальных команд мы коснёмся несколько позднее.

Теперь идём дальше по технической документации. Дальше идёт объяснение каждой команды и назначение каждого бита, представленного в таблице. Мы можем заметить, что в таблице каждый используемый бит как-то называется.

Дальше идёт объяснение процесса инициализации модуля дисплея. Инициализация любого активного устройства – это неотъемлимая часть программирования. Без первичной инициализации не будет работать ни одно устройство.

Сначала показана инициализация 8-битного режима, а затем 4-битного режима. Нам интересен именно последний способ. Поэтому посмотрим данную страничку

Мы видим, что всё здесь очень подробно рассказано и показано. Вот эту диаграмму мы и будем использовать, когда будем писать код инициализации дисплея. Опять же требование – 270 кГц частота работы генератора.

Также посмотрим организацию знакомест дисплея в памяти DDRAM. Это нам будет необходимо для написания функции позиционирования

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

Подобная документация существует также не только на дисплей, а ещё и на контроллер. Я её также в конце статьи обязательно приложу к страничке.

А теперь наконец-то проект.

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

Читайте также  Как найти проводку под штукатуркой?

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

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

#define F_CPU 8000000UL

#include

Скомпилируем код, чтобы у нас была хотя бы какая-то прошивка.

Напишем функцию port_ini(). Под все ножки модуля дисплея мы будем использовать порт D. Так как режим у нас 4-битный, то нам вполне хватит ножек, даже останутся

void port_ini ( void )

PORTD =0x00;

DDRD =0xFF;

Также давайте данную функцию вызовем в функции main()

port_ini (); //Инициализируем порты

Зайдём теперь в проект в протеус и найдем там дисплей в библиотеке компонентов

Подключим его следующим образом

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

Дальнейшую работу с данным дисплеем мы продолжим в следующей части.

Программатор и дисплей можно приобрести здесь:

Светодиодный дисплей 7×7 на микроконтроллере AVR

Статья познакомит Вас с созданием интересного проекта, который при большом желании и небольшом умении Вы сможете воссоздать и модернизировать! Основная идея данной статьи была взята из этого источника, однако концепция и принципиальная схема были переработаны. Так же хочется отметить, что данная статья (в моих позитивных планах) будет иметь продолжение и рассказывать о создании полноценного дисплея, способного отображать разные изображения.

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

Во – первых, немного о наших глазах. Наверное, ни для кого не секрет, что человек воспринимает всю окружающую среду, использую органы чувств. Одним из таких является зрение. А видит человек тоже довольно замысловато: мы можем различить 24 – 25 кадров минуту. А все остальное нам видится либо как медленно передвигающееся или меняющееся либо наоборот, передвигающиеся очень быстро, что пространственная координата меняется скачком. Именно на принципе того, что человеческий глаз и не может отследить быстроменяющиеся картинки, построен данный дисплей. Программа и взаимное включение светодиодов сконфигурированы таким образом, что человеку кажется, что изображение статично. Однако, смена горящих светодиодов в столбцах матрицы происходит слишком быстро, для корректного детектирования. Так что ошибки природы не всегда идут во вред!

Теперь поподробнее о схеме:

Для опытных радиолюбителей схема не требует пояснений, для новичков поясню. Основным элементом управления является микроконтроллер ATmega8, компании Atmel. Именно он, в совокупности с загруженной программой, и позволяет реализовывать эффекты динамического отображения изображений на дисплее. В качестве питания схемы используется гальванический элемент типа «крона» на 9В. Элемент питания подключается к основной схеме через стабилизатор напряжения LM7805 (отечественный аналог КР142ЕН5). Конденсаторы C1 и С2 необходимы для сглаживания пульсаций и помех (фильтры). Резистор R1 необходим для установления логического состояния 1 на линии reset, с целью запуска микроконтроллера. Резисторы R2 – R8, номиналами по 100 Ом каждый, являются токоограничивающими, т.е. предотвращают протекание большого тока через светодиоды. Резисторы R9 – R15 служат для задания необходимого напряжения на затворах транзисторов VT1 – VT7. Светодиоды HL1 – HL49 являются элементами дисплея. В моем девайсе я использовал красные светодиоды (напряжение 3 В, размер 3 мм). Но тут уж как говорится дело вкуса…

Дальше идем к процессу и особенностям сборки:

Для платы используется фольгированный двусторонний текстолит FR4, габаритными размерами 50 * 50 мм. В виду особенностей конструкции таких заготовок понадобится 2 штуки. Далее стандартная процедура:

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

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

3. Далее чистую плату кладем на салфетку или лист бумаги оборачиваем другой стороной и немного прогреваем утюгом (10 – 15 секунд). После чего кладем трафарет на текстолит и тщательно прижимаем утюгом (в таком состоянии ждем 25 – 30 секунд).

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

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

6. После чего повторяем вышеописанные процедуры для второй стороны.

7. Точно таким же путем делаем заготовку второй платы.

8. Далее отправляем обе платы в емкость с хлорным железом или персульфатом аммония для травления. Водичку лучше постоянно подогревать на водяной бане с целью уменьшения времени травления. После чего лудим заготовки (я предпочитаю покрывать печатные платы сплавом Вуда. Вторую плату не лудил в виду отсутствия времени).

9. Затем наступает самое интересное – монтаж компонентов. Для металлизации отверстий используются металлические проволочки, которые с лихвой остаются после монтажа светодиодов. Сами светодиоды монтируются с отступом 5 – 7 мм от платы (связано с особенностями конструкции).

10. Припаяв и подключив наш девайс к программатору загружаем прошивку. Фьюз биты оставляем заводскими – они вполне устраивают.

11. Ну и наконец проверяем работу устройства. Если все получилось правильно, тогда должно получится в точности как на видео.

К особенностям сборки добавлю то, что платы вставляются друг в друга посредством штырей PLS и их ответных частей. Крепеж довольно надежный. Оформлять коробочку – тоже дело творческое и к электронике мало относится.

Дерзайте, господа! Успехов в этом нелегком деле…

Подключение LCD(HD44780) к микроконтроллерам AVR

Автор: AntonChip. Дата публикации: 28 февраля 2011 .

В этой статье приведен пример подключения LCD индикатора к микроконтроллеру AVR, а именно ATmega8. При выборе LCD cледует различать обычные многопозиционные LCD серии ИЖКЦ, модули на их основе с микросхемой HT1611 и алфавитно-символьные LCD с встроенным контроллером. Именно последние и относят к наиболее перспективным изделиям. В подтверждение тому множество фирм в мире, специализирующихся на выпуске подобной продукции. Крупнейшие из них находятся в Тайване, Китае, Японии, США.

Среди параметров, отличающих одни LCD от других, выделяется марка внутреннего контроллера. В дальнейшем будут рассматриваться только модели, совместимые с контроллером HD44780 (фирма Hitachi) и его аналогами, например, KS0066 (фирма Samsung), SED1278
(фирма Epson), ST7066 (фирма Sitronix). Таких изделий на отечественном рынке подавляющее большинство, да и в любительских конструкциях они стали стандартом «де-факто».

При покупке LCD надо поинтересоваться следующими моментами:

поддерживается ли система команд HD44780 («Да»);
имеется ли русификация знакогенератора с выводом больших и малых букв («Да»);
однополярное или двухполярное требуется питание («Однополярное +5 В»);
имеется ли подсветка (если «Да», то нужна светодиодная, а не электролюминесцентная);
сколько символов и строк отображается на экране LCD («8×1»,
«8×2», «16×1», «16×2», «20×2», «20×4» и т.д.).

Внутреннее устройство LCD

Достоинством символьных многострочных LCD является то, что заботу о подаче требуемых напряжений на массив «ЖК-конденсаторов» берет на себя встроенный управляющий контроллер. На рис.1 показана структурная схема типового LCD с организацией 16х2, которая идентична для всех моделей независимо от фирмы-изготовителя. Основу составляет специализированный контроллер, обычно выполненный в виде одной или двух микросхем-«капелек», реже — в виде фирменной SMD-микросхемы. По назначению выводов и системе команд он совпадает с родоначальником серии — HD44780. Общепринятое название таких микросхем «Dot Matrix Liquid Crystal Display Controller/Driver», из чего следует их двойная функция — контроллер управляет интерфейсом, а драйвер «зажигает» сегменты.

Контроллер синхронизируется внутренним RC-генератором G1, имеющим частоту 250 ±50 кГц. Напряжение подсветки подается через выводы А и К на светодиоды, которые освещают ЖК-панель с торца или обратной стороны корпуса. Светодиоды включены матрицей и соединены параллельно-последовательно. В связи с этим напряжение подсветки довольно высокое 4,0. 4,2 В.

Назначение и нумерация всех внешних выводов LCD унифицированы (рис.2). Это не зависит от количества строк и символов, будь то «8×1» или «16×2». Даже контакты светодиодной подсветки 15, 16 имеются на всех LCD, хотя при ее физическом отсутствии они будут просто «висеть в воздухе».

Небольшой нюанс. На печатной плате LCD порядок нумерации контактных площадок отличается от модели к модели. Например, встречаются следующие варианты: слева направо 1-16, справа налево 16-1, вперемежку 15, 16, 1-14. Подсказку следует искать визуально по отмаркированным цифрам на печатной плате. Контакты 15, 16 обычно дублируются еще одной парой контактов с маркировкой А и К соответственно. Электрически они соединены параллельно.

Читайте также  Проводка по плинтусам в квартире

Конструктивно выводы могут располагаться сверху, снизу или на боковой стороне платы LCD. Это не суть важно, ведь соединяться с изделием они будут жгутом проводов длиной до 10 см. Крепление LCD производится винтами через 4 угловых отверстия.

Электрический интерфейс состоит из трех шин:

DB0-DB7 шина данных;
RS, R/W, E шина управления;
VCC, GND, Vo, A, K шина питания.

Внимание: перед подключением питания VCC и GND внимательно прочитайте описание на Ваш дисплей, т.к. контакты питания у некоторых дисплеев могут различаться.

Типовая схема подключения LCD к МК показана на рис.3. Именно она и будет использоваться для первой тестовой проверки LCD с выведением на экран знаменитой фразы «Hello, world!» («Здравствуй, мир!»). Кнопка SB1 осуществляет начальный сброс. Переменным резистором R2 регулируют контрастность изображения. Его сопротивление непринципиально и может меняться от 5 до 20 кОм.

Рис. 3

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

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

Управляющая программа хранится в МК DD1. Чтобы облегчить ее составление, здесь и в дальнейшем приняты некоторые упрощения.

Во-первых, LCD будет работать только на прием информации по всем 11 соединительным линиям шины данных и управления.

Во-вторых, экран LCD считается жестко привязанным к начальной позиции с фиксированными адресами знакомест.

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

Программное управление LCD

Поскольку внутри LCD находится свой собственный контроллер со своей разветвленной системой команд, то задача упрощается. Две такие мощные и интеллектуальные микросхемы, как HD44780 и ATmega8, смогут быстро между собой «договориться» на машинном языке. Труд программиста заключается в том, чтобы «объяснить» контроллерам правила общения и установить протокол соединения.

Таблица 3

В таблице (см. выше) показана расшифровка наиболее употребляемых команд, посылаемых от МК в LCD, а на рис.4 — показаны команды для перехода на определенное знакоместо верхней или нижней строки экрана. Время выполнения команд указано приблизительно. Оно определяется частотой внутреннего RC-генератора LCD, которая, в свою очередь, зависит от технологического разброса и температуры нагрева корпуса.

Рисунок 4

Различают команды прямого и косвенного действия. Первые из них занимают адреса 0x01-0x3F и не требуют передачи данных. За вторыми (диапазон выше 0x3F) обязательно следует передача одного или нескольких байтов информации. Для примера на рис.5 показаны временные диаграммы выполнения команды 0x80 «Установка курсора в первое знакоместо верхней строки экрана» и индикация в нем цифры «4» пересылкой кода данных 0x34.

Рисунок 5

Формировать диаграммы, показанные на рис.5, должен МК с учетом задержек из табл.3, необходимых контроллеру LCD на выполнение команд. Для повышения устойчивости работы экономить на задержках не надо. По крайней мере, при отладке программы они должны быть достаточно большими.

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

Далее показана Си-программа для тестовой проверки LCD по схеме, собранной на рис.3.

Функции «lcd_com» и «lcd_dat» формируют соответственно левую и правую половину временных диаграмм, показанных на рис.5.

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

Наиболее общая процедура инициализации приведена в DATASHEET на HD44780. Функция «lcd_init» в целом повторяет ее с тем отличием, что команда полного выключения дисплея 0х08 поставлена первой, чтобы при включении питания на экране не появлялся «мусор». Здесь нет ограничений против экспериментов, главный критерий — практика.

После выполнения инициализации курсор устанавливается в крайнее слева положение в верхней строчке экрана. Следовательно, первая буква «H» будет выведена именно в это знакоместо. Далее курсор автоматически переходит на одну позицию вправо и следующая команда выведет сюда букву «e» и т.д.

Подключение жидкокристаллического (ЖК) дисплея к микроконтроллеру ATmega32

Для того, чтобы обеспечить хорошую коммуникацию между миром машин и миром людей, необходим жидкокристаллический дисплей. Как правило, он является важным компонентом различных встраиваемых систем. Все дисплеи, большие они или маленькие, функционируют согласно следующим основным принципам. Рассмотрим дисплеи 16×1 и 16×2. Дисплей 16×1 позволяет отобразить 16 символов в одной строке. Дисплей 16×2 позволяет отображать 32 символа – 16 символов на первой строке и 16 символов на второй. Для того чтобы научиться работать с дисплеем необходимо понять, что каждый символ занимает на дисплее 5×10=50 пикселов. То есть чтобы отобразить один символ на экране дисплея, все эти пикселы должны работать одновременно. Но эти проблемы нас не будут волновать поскольку в составе дисплея, который мы будем использовать, присутствует контроллер HD44780, который берет всю работу по контролю этих пикселов на себя.

Необходимые компоненты

Аппаратное обеспечение

  1. Микроконтроллер ATmega32 (семейство AVR).
  2. Программатор AVR-ISP (купить на AliExpress), USBASP (купить на AliExpress) или другой подобный.
  3. JHD_162ALCD (жидкокристаллический дисплей 16×2) (купить на AliExpress).
  4. Конденсатор 10 мкФ.
  5. Источник питания с напряжением 5 Вольт.

Программное обеспечение

  1. Atmel Studio версии 6.1 (или выше).
  2. Progisp или flash magic (необязательно).

Работа схемы

Схема устройства приведена на следующем рисунке.

На схеме показано, что порты микроконтроллера AVR ATmega32 подсоединены к портам данных жидкокристаллического дисплея (ЖК). При этом необходимо помнить о том, что необходимо деактивировать интерфейс JTAG в PORTC ATmega32 при помощи изменения фьюзов (fuse bytes) чтобы иметь возможность использовать порты PORTC в качестве обычных портов ввода/вывода. У ЖК дисплея 16×2 всего 16 контактов если в нем присутствует черный цвет. Если же черного цвета нет, то у ЖК дисплея будет 14 контактов. 2 контакта, отвечающих за черный цвет, можно проигнорировать. Таким образом, среди оставшихся 14 контактов имеем 8 контактов данных (7-14 или D0-D7), 2 контакта для подачи питающего напряжения (1&2 или VSS&VDD или gnd&+5v), 3-й контакт для контроля контраста (насколько «жирно» будут выглядеть символы на экране), 3 контакта контроля (RS&RW&E).

На представленной схеме использовано только 2 контакта контроля, что обеспечивает дополнительную гибкость схеме. Контакт контраста и контакт READ/WRITE используются редко, поэтому в нашем случае они могут быть просто замкнуты на землю, что гарантирует ЖК дисплею максимальный контраст и переключает его в режим чтения (READ). Нам необходимо всего лишь управлять контактами ENABLE и RS чтобы передавать на дисплей символы и данные.

Необходимые соединения между микроконтроллером ATmega32 и 16×2 ЖК дисплеем следующие:
PIN1 или VSS – земля (ground)
PIN2 или VDD или VCC – питание +5 В
PIN3 или VEE — земля (обеспечивает максимальный контраст символов)
PIN4 или RS (Register Selection) — PD6 микроконтроллера
PIN5 или RW (Read/Write) — земля (переводит ЖК дисплей в режим чтения)
PIN6 или E (Enable) — PD5 микроконтроллера
PIN7 или D0 — PA0 микроконтроллера
PIN8 или D1 — PA1
PIN9 или D2 — PA2
PIN10 или D3 — PA3
PIN11 или D4 — PA4
PIN12 или D5 — PA5
PIN13 или D6 — PA6
PIN14 или D7 — PA7

В представленной схеме мы использовали 8-битную связь с ЖК (D0-D7), хотя это не обязательно и мы могли ограничиться 4-битной связью (D4-D7) – но в этом случае программа была бы немного сложнее, что было бы не очень хорошо для начинающих.

Таким образом, мы соединили 10 контактов ЖК дисплея с микроконтроллером, из которых 8 контактов используются для передачи данных, а 2 контакта – для управления.

Принципы управления жидкокристаллическим дисплеем

Итак, мы определились с тем, что будем использовать 10 контактов ЖК дисплея: 8 контактов для передачи данных и 2 контакта для управления.

2 контакта управления будут использоваться следующим образом:

1. Контакт RS (Register selection – выбор регистра) будет использоваться для того, чтобы сообщить ЖК дисплею о том будем ли мы пересылать ему данные или команду.

В представленной таблице (верхней) значение порта данных ЖК дисплея (D7-D0), равное «0b0010 1000» (двоичный код) или «0x28» (шестнадцатеричный код) указывает на то, что ЖК дисплей должен отобразить на своем экране символ «(«. В таблице 2 (нижней) то же самое значение «0x28» указывает ЖК дисплею что он должен переключиться в режим: 4 бита, 2 строки, 5х7 точек. Таким образом, одно и то же значение порта данных (D7-D0) может использоваться для двух целей – и выбор одной из этих целей осуществляется с помощью регистра выбора RS. Если на контакте RS низкое напряжение – это свидетельствует ЖК дисплею о том, что мы будем передавать команду. Если на контакте RS высокое напряжение, то ЖК дисплей понимает что мы будем передавать данные. Соответственно, ЖК дисплей конфигурирует свой порт данных в зависимости от состояния регистра (контакта) RS.

Читайте также  Индикатор скрытой проводки в стене какой выбрать?

2. Контакт E (Enable — доступен) устанавливает готовность порта данных к приему информации. Если напряжение на этом контакте изменяется с высокого на низкое – это свидетельствует о том, что ЖК дисплей принял данные и отображает на экране соответствующий результат. Таким образом, на этот контакт подается высокое напряжение перед началом передачи данных и низкое напряжение когда процесс передачи данных завершен.

Объяснение работы программы

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

Сначала мы сообщаем микроконтроллеру ATmega32 какие порты ЖК дисплея мы собираемся использовать для передачи данных и команд управления. Затем мы сообщаем микроконтроллеру когда мы будем посылать данные ЖК дисплею устанавливая соответствующие значения контактов RS и E дисплея.

Короткое объяснение принципов работы программы:

  1. На контакт E подается высокое напряжение (сообщаем ЖК дисплею что он будет принимать данные), а на контакт RS подается низкое напряжение (сообщаем ЖК дисплею о том, что будет передаваться команда).
  2. Передаем значение 0x01 на порт данных – команда очистки экрана.
  3. На контакт E подается высокое напряжение (сообщаем ЖК дисплею что он будет принимать данные), на контакт RS также подается высокое напряжение (сообщаем ЖК дисплею о том, что будут передаваться данные).
  4. Передаем строку символов – по одному символу, один за другим.
  5. На контакт E подается низкое напряжение – сообщаем ЖК дисплею о том, что мы закончили передачу данных.
  6. После этой последней команды ЖК дисплей заканчивает процессы связи (передачи/приема данных), обрабатывает полученные данные и высвечивает полученную строку символов на экране.

В представленном сценарии работы программы мы передаем поочередно символы на ЖК дисплей – один за другим. Символы передаются на ЖК дсиплей в ASCII коде (American standard Code for Information Interchange — Американский стандартный код обмена информацией).

На следующем рисунке представлена таблица ASCII кодов. К примеру, чтобы ЖК дисплей отобразил символ “@” мы должны передать ему в шестнадцатеричном коде код “64”. Если мы передадим на ЖК дисплей значение ‘0x62’, то он отобразит на экране символ ‘>’. Таким образом, передавая необходимые ASCII коды на ЖК дисплей, мы заставим отображать его те символы, которые нам нужны.

Ниже представлен код программы на языке С с необходимыми пояснениями.

Урок 3. Как подключить ЖК(LCD) дисплей к AVR микроконтроллеру

Мы научились: управлять микроконтроллером и управлять чем то, при помощи микроконтроллера. Теперь, чтобы сделать наше устройство более дружелюбным, будем к нему подключать дисплей.

Сразу оговорюсь дисплей — символьный. Это значит что внутри у него, в памяти, уже есть алфавит. Все что нам нужно — дать команду вывести строку.

Дисплеи бывают разные: разный цвет подсветки экрана, разное количество строк, разное количество символов в строке. Поэтому, здесь рассматривается дисплей WH0802A-YGK-CT, 2 строки по 8 символов, подсветка желтая светодиодная.

Создадим проект в CodeVision. На вкладке LCD укажем порт, к которому будет подключен наш дисплей (PORTD). В строке Char/Line указываем количество символов нашего ЖК дисплея (8).

Генерируем, сохраняем проект. Приводим код к следующему виду:

#include #asm .equ __lcd_port=0x12 ;PORTD #endasm #include void main(void) < PORTD=0x00; DDRD=0x00; lcd_init(8); while (1) < >; >

Добавились новые строчки

#asm
.equ __lcd_port=0x12
#endasm
Дисплей подключен к PORTD
#include Библиотека для работы с LCD дисплеями

Немного изменим код нашей программы:

lcd_gotoxy(0,0); Переставить курсор в координату ХУ,х – позиция по горизонтали,у – по вертикали
lcd_putsf(«lesson3»); Вывести слово lesson3 на LCD дисплей
#pragma rl+
lcd_putsf(«Урок3»);
#pragma rl-
Данная директива позволяет вывести на экран русский алфавит, при условии что дисплей его поддерживает

Запустим получившийся код на симуляцию в ISIS Proteus. Как видно первая строчка отображается правильно, а вот вторая кракозябами. Дело в том, что протеус не распознает русский алфавит и если ваш дисплей не будет поддерживать его, то на реальном дисплее тоже будут непонятные символы.

Теперь нужно опробовать все это на настоящем дисплее. Тут есть свои нюансы. Открываем даташит на наш дисплейчик и видим такую вот таблицу с распиновкой:

Наверное, тут все очевидно, но все же:

3 — Управление контрастностью. Подключается через переменный резистор.

Светодиодная подсветка. Подключаем как обычный светодиод.

А — подключаем к «+» через токоограничивающий резистор, К — подключаем к «земле» (GND).

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

Внешний вид прошитого устройства

Файл прошивки и протеуса доступны тут

206 комментариев: Урок 3. Как подключить ЖК(LCD) дисплей к AVR микроконтроллеру

Просьба четко прояснить строку .equ __lcd_port=0x12. Почему именно 0х12? А если будет порт C, или D? Просто пытаюсь понять суть…

Вопрос отпал… Залез в заголовочник, PortВ — 0х12, PortC — 0x15, PortD — 0x18… Я всё правильно понял?

Извиняюсь, наоборот: PortD — 0x12, PortC — 0x15, PortB — 0x18

Пытаюсь подключить дисплей к Mega328P в протеус, выдаёт ошибку «[HD44780] Attempted to read after writing a single nibble [LCD2]» Код полностью ваш скопировал, порт правильно прописал 0x0B — PORTD В чём может быть проблема?

сгенерите заново код, там в разных версиях cavr немного отличалось.

Итак, подключаем дисплей WH0802A-YGH-CT к микроконтроллеру

WH0802A – двухстрочный символьный дисплей на 8 знакомест со встроенным управляющим контроллером KS0066.
Разбираем назначение выводов дисплея.

По умолчанию подсветка у дисплея WH0802A-YGH-CT отключена. Чтобы ее включить, нужно проделать парочку нехитрых манипуляций, а именно – установить две перемычки и впаять токоограничительный резистор (смотри на фотке RK, JF и RA соответственно).

Схема подключения дисплея

Начальный код

Цикл записи для 8-ми разрядной шины выглядит следующим образом:
1. Установить RS (0 — команда, 1 – данные)
2. Вывести значение байта данных на шину DB7…DB0
3. Установить E=1
4. Программная задержка 1
5. Установить E=0
6. Программная задержка 2

//подключаем символьный ЖК-дисплей к AVR
#include
#include

//порт к которому подключена шина данных ЖКД
#define PORT_DATA PORTD
#define PIN_DATA PIND
#define DDRX_DATA DDRD

//порт к которому подключены управляющие выводы
#define PORT_SIG PORTB
#define PIN_SIG PINB
#define DDRX_SIG DDRB

//номера выводов микроконтроллера
//к которым подключены управляющие выводы ЖКД
#define RS 5
#define RW 6
#define EN 7

//макросы для работы с битами
#define ClearBit(reg, bit) reg &= (

(1 #define SetBit(reg, bit) reg |= (1 #define F_CPU 8000000
#define _delay_us(us) __delay_cycles ((F_CPU / 1000000) * (us));
#define _delay_ms(ms) __delay_cycles ((F_CPU / 1000) * (ms));

int main( void )
<
while (1);
return 0;
>

Здесь нет сложных мест, все должно быть понятно. Идем дальше.

1. Подаем питание

2. Ждем >40 мс

3. Подаем команду Function set

DL – бит установки разрядности шины
0 – 4 разрядная шина, 1 – 8 разрядная шина

N – бит установки количества строк дисплея
0 – однострочный режим, 1 – двухстрочный режим

F – бит установки шрифта
0 – формат 5*8, 1 – формат 5*11

* — не важно что будет в этих битах

4. Подаем команду Display ON/OFF

D – бит включения/выключения дисплея
0 – дисплей выключен, 1 – дисплей включен

C – бит включения/выключения курсора
0 – курсор выключен, 1 – курсор включен

B – бит включения мерцания
0 – мерцающий курсор включен, 1 – мерцающий курсор выключен

5. Подаем команду Clear Display



6. Ждем > 1,5 ms

7. Подаем команду Entry Mode Set

I/D – порядок увеличения/уменьшения адреса DDRAM(ОЗУ данных дисплея)
0 – курсор движется влево, адрес уменьшается на 1, 1 – курсор движется вправо, адрес увеличивается на 1

SH – порядок сдвига всего дисплея
0 – сдвига нет, 1 – сдвиг происходит согласно сигналу I/D – если он 0 – дисплей сдвигается вправо, 1 – дисплей сдвигается влево

Для нашего примера функция инициализации будет выглядеть так

Теперь у нас есть необходимый минимум, чтобы начать работу с дисплеем. Выведем на него слово «Test.» //собственно наша программа
int main( void )
<
InitLcd();
LcdWriteData(‘T’);
LcdWriteData(‘e’);
LcdWriteData(‘s’);
LcdWriteData(‘t’);
LcdWriteData(‘.’);
while (1);
return 0;
> Первые результаты мы получили. Доводить программу до ума будем в следующих статьях.