Подключение дисплея 1602 к ардуино. Учебный курс

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

В данной статье мы расскажем как его подключить к Arduino и вывести информацию.

Используемые компоненты (купить в Китае):

. Управляющая плата

. Соединительные провода

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

Размерность дисплеев на контроллере HD44780 может быть различной, управляться они будут одинаково. Самые распространенные размерности 16x02 (т.е. по 16 символов в двух строках) либо 20x04. Разрешение же самих символов - 5x8 точек.

Большинство дисплеев не имеют поддержку кириллицы, имеют её лишь дисплеи с маркировкой CTK. Но данную проблему можно попытаться частично решить (продолжение в статье).

Выводы дисплея:

На дисплее имеется 16pin разъем для подключения. Выводы промаркированы на тыльной стороне платы.

1 (VSS) - Питание контроллера (-)
2 (VDD) - Питание контроллера (+)
3 (VO) - Вывод управления контрастом
4 (RS) - Выбор регистра
5 (R/W) - Чтение/запись (режим записи при соединении с землей)
6 (E) - Еnable (строб по спаду)
7-10 (DB0-DB3) - Младшие биты 8-битного интерфейса
11-14 (DB4-DB7) - Старшие биты интерфейса
15 (A) - Анод (+) питания подсветки
16 (K) - Катод (-) питания подсветки

Режим самотестирования:

Перед попытками подключения и вывода информации, было бы неплохо узнать рабочий дисплей или нет. Для этого необходимо подать напряжение на сам контроллер (VSS и VDD ), запитать подсветку (A и K ), а также настроить контрастность.

Для настройки контрастности следует использовать потенциометр на 10 кОм. Каким он будет по форме - не важно. На крайние ноги подается +5V и GND, центральная ножка соединяется с выводом VO

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

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

Вывод информации:

Для работы дисплея используется встроенная с среду Arduino IDE библиотека LiquidCrystal.h

Функционал библиотеки

//Работа с курсором lcd.setCursor (0, 0); // Устанавливаем курсор (номер ячейки, строка) lcd.home (); // Установка курсора в ноль (0, 0) lcd.cursor (); // Включить видимость курсора (подчеркивание) lcd.noCursor (); // Убрать видимость курсора (подчеркивание) lcd.blink (); // Включить мигание курсора (курсор 5х8) lcd.noBlink (); // Выключить мигание курсора (курсор 5х8) //Вывод информации lcd.print ("сайт" ); // Вывод информации lcd.clear (); // Очистка дисплея, (удаление всех данных) установка курсора в ноль lcd.rightToLeft (); // Запись производится справа на лево lcd.leftToRight (); // Запись производится слева на право lcd.scrollDisplayRight (); // Смещение всего изображенного на дисплее на один символ вправо lcd.scrollDisplayLeft (); // Смещение всего изображенного на дисплее на один символ влево //Информация полезная для шпионов:) lcd.noDisplay (); // Информация на дисплее становится невидимой, данные не стираются // если, в момент когда данная функция активна, ничего не выводить на дисплей, то lcd.display (); // При вызове функции display() на дисплее восстанавливается вся информация которая была

Сам же дисплей может работать в двух режимах:

8-битный режим - для этого используются и младшие и старшие биты (BB0- DB7)

4-битный режим - для этого используются и только младшие биты (BB4- DB7)

Использование 8-битного режима на данном дисплее не целесообразно. Для его работы требуется на 4 ноги больше, а выигрыша в скорости практически нет т.к. частота обновления данного дисплея упирается в предел < 10раз в секунду.

Для вывода текста необходимо подключить выводы RS, E, DB4, DB5, DB6, DB7 к выводам контроллера. Их можно подключать к либым пинам Arduino, главное в коде задать правильную последовательность.

Пример программного кода:

#include LiquidCrystal lcd(7, 6, 5, 4, 3, 2); void setup (){ lcd.begin (16, 2); // Задаем размерность экрана lcd.setCursor (0, 0); lcd.print ("Hello, world!" ); // Выводим текст lcd.setCursor (0, 1); // Устанавливаем курсор в начало 2 строки lcd.print ("сайт" ); // Выводим текст } void loop (){ }

Создание собственных символов

С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера внутри дисплея и с ними проблем нет. А вот что делать если нужного символа в памяти контроллера нет?

Не беда, требуемый символ можно сделать вручную (всего до 7ми символов). Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.

В ниже приведенном примере нарисуем смайлик.

Пример программного кода

//Тестировалось на Arduino IDE 1.0.5 #include #include // Лобавляем необходимую библиотеку // Битовая маска символа улыбки byte smile = { B00010, B00001, B11001, B00001, B11001, B00001, B00010, }; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup (){ lcd.begin (16, 2); // Задаем размерность экрана lcd.createChar (1, smile); // Создаем символ под номером 1 lcd.setCursor (0, 0); // Устанавливаем курсор в начало 1 строки lcd.print ("\1" ); // Выводим смайлик (символ под номером 1) - "\1" } void loop (){ }

Бонус

В комментариях участник сообщества скинул ссылку на генератор символов

  • igorka

      генератор символов по примеру выше,
      сделал потому что не слабо)

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

LCD 1602

Среди множества вариантов среди дисплеев отдельно хочется отметить именно дисплей LCD1602 на базе контроллера HD4478. Существует этот дисплей в двух цветах: белые буквы на синем фоне, черные буквы на желтом фоне. Подключение LCD 1602 к Arduino также не вызовет никаких проблем, так как есть встроенная библиотека, и ничего скачивать дополнительно не нужно. Дисплеи отличаются не только ценой, но и размером. Зачастую радиолюбителями используется 16 x 2, то есть 2 строки по 16 символов. Но существует также и 20 x 4, где 4 строки по 20 символов. Размеры и цвет не играют никакой роли в подключении дисплея lcd 1602 к Arduno, подключаются они одинаково. Угол обзора составляет 35 градусов, время отклика дисплея - 250 мс. Работать может при температурах от -20 до 70 градусов по Цельсию. При работе использует 4 мА на экран и на подсветку 120 мА.

Где используется?

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

Подключение к Arduino

Подключение LCD 1602 к Arduino Nano и Uno не отличается. С дисплеем можно работать в двух режимах: 4 бита и 8. При работе с 8-битным используются и младшие, и старшие биты, а с 4-битным - только младшие. Работать с 8-битным особого смысла нет, так как добавится для подключения еще 4 контакта, что не целесообразно, ведь скорости выше не будет, предел обновлений дисплея - 10 раз в секунду. Вообще, для подключения lcd 1602 к Arduino используется много проводов, что доставляет некие неудобства, но существует особые шилды, но об этом позже. На фотографии изображено подключение дисплея к Arduino Uno:

Пример программного кода:

#include // Добавляем необходимую библиотеку LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup(){ lcd.begin(16, 2); // Задаем размерность экрана lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("Hello, world!"); // Выводим текст lcd.setCursor(0, 1); // Устанавливаем курсор в начало 2 строки lcd.print("сайт"); // Выводим текст } void loop(){ }

Что же делает код? Первым делом подключается библиотека для работы с дисплеем. Как уже говорилось выше, эта библиотека уже входит в состав Arduino IDE и дополнительно скачивать и устанавливать ее не надо. Далее определяются контакты, которые подключены к выводам: RS, E, DB4, DB5, DB6, DB7 соответственно. После чего задается размерность экрана. Так как мы работаем с версией, где 16 символов и 2 строки, то пишем такие значения. Устанавливаем курсор в начало первой строки и выводим наш первый текст Hello World. Далее ставим курсор на вторую строку и выводим название сайта. Вот и все! Было рассмотрено подключение lcd 1602 к Arduino Uno.

Что такое I2C и зачем он нужен?

Как уже говорилось выше, подключение дисплея занимает очень много контактов. Например, при работе с несколькими датчиками и дисплеем LCD 1602 контактов может просто не хватить. Зачастую радиолюбителями используются версии Uno или Nano, где не так много контактов. Тогда люди придумали специальные шилды. Например, I2C. Он позволяет подключать дисплей всего в 4 контакта. Это в два раза меньше. Продается модуль I2C как отдельно, где самому нужно припаивать, так и уже припаянный к дисплею LCD 1602.

Подключение с помощью I2C модуля

Подключение LCD 1602 к Arduino Nano с I2C занимает мало места, всего 4 контакта: земля, питание и 2 выхода для передачи данных. Питание и землю подключаем на 5V и GND на Arduino соответственно. Оставшиеся два контакта: SCL и SDA подключаем к любым аналоговым пинам. На фотографии можно увидеть пример подключения lcd 1602 к arduino с I2C модулем:

Программный код

Если для работы с дисплеем без модуля необходимо было воспользоваться только одной библиотекой, то для работы с модулем нужно две библиотеки. Одна из них уже есть в составе Arduino IDE - Wire. Другую библиотеку, LiquidCrystal I2C, надо скачивать отдельно и устанавливать. Для установки библиотеки в Arduino содержимое скачанного архива необходимо загрузить в корневую папку Libraries. Пример программного кода с использованием I2C:

#include #include LiquidCrystal_I2C lcd(0x27,16,2); // Устанавливаем дисплей void setup() { lcd.init(); lcd.backlight();// Включаем подсветку дисплея lcd..setCursor(8, 1); lcd.print("LCD 1602"); } void loop() { // Устанавливаем курсор на вторую строку и нулевой символ. lcd.setCursor(0, 1); // Выводим на экран количество секунд с момента запуска ардуины lcd.print(millis()/1000); }

Как можно увидеть, код почти не отличается.

Как добавить свой символ?

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

0 0 0 1 0
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
1 1 0 0 1
0 0 0 0 1
0 0 0 1 0
0 0 0 0 0

Если 0 - там ничего нет, если 1 - это закрашенный участок. В примере выше можно увидеть создание символа "улыбающийся смайл". На примере программы в Arduino это будет выглядеть следующим образом:

#include #include // Лобавляем необходимую библиотеку // Битовая маска символа улыбки byte smile = { B00010, B00001, B11001, B00001, B11001, B00001, B00010, }; LiquidCrystal lcd(7, 6, 5, 4, 3, 2); // (RS, E, DB4, DB5, DB6, DB7) void setup(){ lcd.begin(16, 2); // Задаем размерность экрана lcd.createChar(1, smile); // Создаем символ под номером 1 lcd.setCursor(0, 0); // Устанавливаем курсор в начало 1 строки lcd.print("\1"); // Выводим смайлик (символ под номером 1) - "\1" } void loop(){ }

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

Проблемы при которых дисплей может не работать

Бывают такие случаи, когда дисплей не работает. Например, включается, но не показывает символы. Или вовсе не включается. Сначала посмотрите, правильно ли вы подключили контакты. Если вы использовали подключение lcd 1202 к Arduino без I2C, то очень легко запутаться в проводах, что может стать причиной некорректной работы дисплея. Также следует удостовериться в том, что контрастность дисплея увеличена, так как при минимальной контрастности даже не видно, включен ли LCD 1602 или нет. Если это ничего не помогает, то, возможно, проблема может кроется в пайке контактов, это при использовании модуля I2C. Также частой причиной, при которой дисплей может не работать, является неправильная установка I2C адреса. Дело в том, что производителей много, и они могут ставить разный адрес, исправлять нужно тут:

LiquidCrystal_I2C lcd(0x27,16,2);

В скобках можно увидеть два значения, 0x27 и 16,2 (16, 2 - является размером дисплея, а 0x27 как раз таки адрес I2C). Вместо этих значений можно попробовать поставить 0x37 или 0x3F. Ну и еще одной причиной является просто неисправный LCD 1602. Учитывая, что практически все для Arduino изготавливается в Китае, то нельзя быть уверенным на 100%, что приобретенный товар не является браком.

Плюсы и минусы LCD 1602

Рассмотрим плюсы и минусы дисплея LCD 1602.

  • Цена. Этот модуль можно приобрести совсем по демократичной цене в китайских магазинах. Цена составляет 200-300 рублей. Иногда продается даже вместе с I2C модулем.
  • Легко подключать. Вероятно, никто сейчас не подключает LCD 1602 без I2C. А с этим модулем подключение занимает всего 4 контакта, никаких "паутин" из проводов не будет.
  • Программирование. Благодаря готовым библиотекам работать с этим модулем легко, все функции уже прописаны. А при необходимости добавить свой символ затрачивается всего пару минут.
  • За время использования тысячами радиолюбителями никаких больших минусов выявлено не было, только бывают случаи покупки брака, так как в основном используются китайские варианты дисплеев.

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

Так случилось, что прикупил я тут себе поприколу LCD дисплейчик две строки по восемь символов. Валялся он в ящике валялся, да чегото поперло меня и решил я его заюзать, попутно вкурив в его работу. О том как подключить к AVR LCD дисплей я вам сейчас и поведаю.

Для начала оговорюсь сразу, что речь тут пойдет о LCD индикаторах на контроллере HD44780, который стал промышленным стандартом де-факто на рынке цифро-буквенных дисплеев. Продается везде где только можно, стоит недорого (8х2 мне обошелся порядка 150 рублей), а также под него написана куча кода. Я же, как обычно, решил изобрести велосипед и сварганить свою собственную тру-библиотеку для работы с этим типом индикаторов. Разумеется на ассемблере, а на чем же еще? ;)

Подключение.
LCD на базе HD44780 подключается к AVR микроконтроллеру напрямую к портам. Есть два способа подключения — на 8 бит и на 4 бита. В восьмибитном режиме немножко проще закидывать байты — не нужно сдвигать байт, зато в четырех битном резко нужно тратить на целых четыре ножки контроллера меньше. Есть еще одна особенность работы в 8-битном режиме — к некоторым контроллерам можно подрубить этот дисплей как внешнее ОЗУ и засылать данные простыми командами пересылки. Лично я подключил его в режиме полного порта у меня один фиг выводы уже девать некуда было, так что не жалко.

  • Выводы DB7…DB0 это шина данных/адреса.
  • E — стробирующий вход. Дрыгом напряжения на этой линии мы даем понять дисплею что нужно забирать/отдавать данные с/на шину данных.
  • RW — определяет в каком направлении у нас движутся данные. Если 1 — то на чтение из дисплея, если 0 то на запись в дисплей.
  • RS — определяет что у нас передается, команда (RS=0) или данные (RS=1). Данные будут записаны в память по текущему адресу, а команда исполнена контроллером.

Со стороны питания все еще проще:

  • GND — минус, он же общий.
  • Vcc — плюс питания, обычно 5V
  • V0 — вход контрастности. Сюда нужно подавать напряжение от нуля до напряжения питания, тем самым задается контрастность изображения. Можно поставить переменный резистор, включенный потенциометром и крутить в свое удовольствие. Главное поймать значение максимального контраста, но чтобы не было видно знакомест (серый ореол из квадратов вокруг символа). Если же выставить слишком малый контраст, то символы будут переключаться лениво и задумчиво. Примерно как в калькуляторе у которого сели батарейки.
  • А — это вход Анода светодиодной подсветки. Короче плюс.
  • К — соответственно Катод, он же минус. Подсветка хавает примерно 100мА и поэтому нужно выставить туда токоограничительный резистор на 100 Ом. Кстати, многие ЖК дисплеи имеют на плате пятачки для припайки резисторов. Если прозвонить, то можно убедиться в том, что эти линии ведут на входы питания LCD, поэтому, впаяв резисторы, можно не заморачиваться на запитку подстветки, она будет подключена к питанию контроллера.
Логическая структура LCD контроллера HD44780

Контроллер имеет свой блок управления, который обрабатывает команды и память. Она делится на три вида:

DDRAM — память дисплея. Все что запишется в DDRAM будет выведено на экран. То есть, например, записали мы туда код 0x31 — на экране выскочит символ «1» т.к. 0х31 это ASCII код цифры 1. Но есть тут одна особенность — DDRAM память гораздо больше чем видимая область экрана. Как правило, DDRAM содержит 80 ячеек — 40 в первой строке и 40 во второй, а на дисплей может двигаться по этой линейке как окошко на логарифмической линейке, высвечивая видимую область. То есть, например, можно засунуть в DDRAM сразу пять пунктов меню, а потом просто гонять дисплей туда сюда, показывая по одному пункту. Для перемещения дисплея есть спец команда. Также есть понятие курсора — это место в которое будет записан следующий символ, т.е. текущее значение счетчика адреса. Курсор не обязательно может быть на экране, он может располагаться и за экраном или быть отключен вовсе.

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

CGRAM — тоже таблица символов, но ее мы можем менять, создавая свои символы. Адресуется она линейно, то есть вначале идет 8 байт одного символа, построчно, снизу вверх — один бит равен одной точке на экране. Потом второй символ тем же макаром. Поскольку знакоместо у нас 5 на 8 точек, то старшие три бита роли не играют . Всего в CGRAM может быть 8 символов, соответственно CGRAM имеет 64 байта памяти. Эти программируемые символы имеют коды от 0х00 до 0х07. Так что, закинув, например, в первые 8 байт CGRAM (первый символ с кодом 00) какую нибудь фигню, и записав в DDRAM нуль (код первого символа в CGRAM ) мы увидим на экране нашу хрень.

Доступ к памяти.
Тут все просто. Мы командой выбираем в какую именно память и начиная с какого адреса будем писать. А потом просто шлем байты. Если указано, что записываем в DDRAM то на экран (или в скрытую область) полезут символы, если в CGRAM то байты полезут уже в память знакогенератора. Главное потом не забыть переключится обратно на область DDRAM

Система команд.
Система команд проста как мычание. О том, что передается команда контроллеру дисплея сообщит нога RS =0. Сама команда состоит из старшего бита, определяющего за что отвечает данная команда и битов параметров, указывающих контроллеру HD44780 как дальше жить.

Таблица команд:

DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0 Значение
0 0 0 0 0 0 0 1 Очистка экрана. Счетчик адреса на 0 позицию DDRAM
0 0 0 0 0 0 1 Адресация на DDRAM сброс сдвигов, Счетчик адреса на 0
0 0 0 0 0 1 I/D S Настройка сдвига экрана и курсора
0 0 0 0 1 D C B Настройка режима отображения
0 0 0 1 S/C R/L Сдвиг курсора или экрана, в зависимости от битов
0 0 1 DL N F Выбор числа линий, ширины шины и размера символа
0 1 AG AG AG AG AG AG Переключить адресацию на SGRAM и задать адрес в SGRAM
1 AD AD AD AD AD AD AD Переключить адресацию на DDRAM и задать адрес в DDRAM

Теперь поясню что значат отдельные биты:
  • I/D — инкремент или декремент счетчика адреса. По дефолту стоит 0 — Декремент. Т.е. каждый следующий байт будет записан в n-1 ячейку. Если поставить 1 — будет Инкремент.
  • S — сдвиг экрана, если поставить 1 то с каждым новым символом будет сдвигаться окно экрана, пока не достигнет конца DDRAM, наверное удобно будет когда выводишь на экран здоровенную строку, на все 40 символов, чтобы не убегала за экран.
  • D — включить дисплей. Если поставить туда 0 то изображение исчезнет, а мы в это время можем в видеопамяти творить всякие непотребства и они не будут мозолить глаза. А чтобы картинка появилась в эту позицию надо записать 1.
  • С — включить курсор в виде прочерка. Все просто, записали сюда 1 — включился курсор.
  • B — сделать курсор в виде мигающего черного квадрата.
  • S/C сдвиг курсора или экрана. Если стоит 0, то сдвигается курсор. Если 1, то экран. По одному разу за команду
  • R/L — определяет направление сдвига курсора и экрана. 0 — влево, 1 — вправо.
  • D/L — бит определяющий ширину шины данных. 1-8 бит, 0-4 бита
  • N — число строк. 0 — одна строка, 1 — две строки.
  • F — размер символа 0 — 5х8 точек. 1 — 5х10 точек (встречается крайне редко)
  • AG — адрес в памяти CGRAM
  • АD — адрес в памяти DDRAM

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

Задача:

  1. Включить дисплей.
  2. Очистить содержимое.
  3. Сдвинуть курсор на одну позицию.
  4. И записать туда «1».
Решение (последовательность команд):

Первым делом Инициализация дисплея без которой большая часть дисплеев на HD44780 просто откажется работать. Некоторые виды имеют дефолтные состояние (шина 8 бит, курсор в 0) и им только дисплей включить. Но все же ее лучше сделать, мало ли что там намудрил разработчик. Лишней не будет.

  1. 001 11000 Шина 8 бит, 2 строки
  2. 00000001 Очистка экрана
  3. 000001 10 Инкремент адреса. Экран не движется
  1. 00001 100 Включили дисплей (D=1)
  2. 00000001 Очистили дисплей. Указатель встал на DDRAM
  3. 0001 0100 Сдвинули курсор (S/C=0) вправо (R/L=1)
  4. 00110001 — это мы уже записали данные (ножка RS=1) код «1» 0х31

Жирным шрифтом выделен идентификатор команды, ну а остальное по таблице увидите.

Задача: создать свой символ. С кодом 01 и вывести его на экран.
Считаем, что дисплей у нас уже инициализирован и готов к приему данных.

Решение:

  1. 01 001000 Выбираем в CGRAM адрес 0х08 — как раз начало второго символа (напомню, что на один символ уходит 8 байт)
  2. 00000001 Это пошли 8 байт данных. (RS=1 )
  3. 0000001 0 Рисуем значок молнии, ну или
  4. 000001 00 ССовскую Зиг руну, кому как
  5. 00001 000 больше нравится.
  6. 00011111 Старшие три бита не действуют
  7. 0000001 0 Туда можно писать что угодно, на
  8. 000001 00 результат влиять не будет.
  9. 00001 000 Последний байт данных
  10. 1 0000000 А это уже команда — переключение адреса на DDRAM и указатель на адрес 0000000 — первый символ в первой строке.
  11. 00000001 И снова данные (RS=1 ), код 01 — именно в него мы засунули нашу молнию.
Опа и он на экране!

Так, с логикой разобрались, пора вкуривать в физику протокола общения. Код я приведу несколько позже, когда вылижу свою библиотеку и заоптимизирую до состояния идеала. Пока же дам алгоритм, а его уж на любом языке программирования реализовать можно. Хоть на ассемблере, хоть на Сях, да хоть на Васике:)

Алгоритм чтения/записи в LCD контроллер HD44780
Направление, а также команда/данные определяются ножками, а чтение и запись осуществляется по переходу строба (вывод Е) из 1 в 0

Инициализация портов

  1. RS, RW, E — в режим выхода.
  2. DB7..DB0 в режим входа. Впрочем, можно их не трогать, дальше переопределим.

Ожидание готовности, чтение флага занятости.
  1. RS=0 (команда)
  2. RW=1 (чтение)
  3. E=1 (Готовьсь!!!)
  4. Пауза (14 тактов процессора на 8МГЦ хватало)
  5. Е=0 (Пли!)
  6. Читаем из порта. Если бит 7 (Busy flag) установлен, то повторяем все заново, пока не сбросится.

Запись команды
  1. Ожидание готовности
  2. RS=0 (команда)
  3. RW=0 (запись)
  4. Е=1 (Готовьсь!!!)
  5. Порт на выход
  6. Вывести в порт код команды
  7. Пауза
  8. Е=0 (Пли!)
  9. Орудие на плечо Порт на вход, на всякий случай.

Запись Данных
  1. Ожидание готовности
  2. RS=1 (Данные)
  3. RW=0 (запись)
  4. Е=1 (Готовьсь!!!)
  5. Порт на выход
  6. Вывести в порт код команды
  7. Пауза
  8. Е=0 (Пли!)
  9. Порт на вход, на всякий случай.

Чтение команды
  1. Ожидание готовности
  2. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  3. RS=0 (команда)
  4. RW=1 (чтение)
  5. Пауза
  6. Считываем данные с порта
  7. E=0 (Ать!)

Чтение Данных
  1. Ожидание готовности
  2. Порт данных на вход с подтяжкой (DDR=0, PORT=1)
  3. RS=1 (Данные)
  4. RW=1 (чтение)
  5. Е = 1 (Готовьсь! В этот момент данные из LCD вылазят на шину)
  6. Пауза
  7. Считываем данные с порта
  8. E=0 (Ать!)

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

Запись:

  1. Пауза
  2. Выставили в порт старшую тетраду
  3. Пауза
  4. Пауза
  5. Выставили в порт младшую тетраду

Чтение
  1. Пауза
  2. Читаем из порта старшую тетраду
  3. Пауза
  4. Пауза
  5. Читаем из порта младшую тетраду

Ждите код:) Скоро будет:)
UPD:

Жидкокристаллический дисплей (Liquid Crystal Display) сокращенно LCD построен на технологии жидких кристаллов. При проектировании электронные устройства, нам нужно недорогое устройство для отображения информации и второй не менее важный фактор наличии готовых библиотек для Arduino. Из всех доступных LCD дисплеев на рынке, наиболее часто используемой является LCD 1602A, который может отображать ASCII символа в 2 строки (16 знаков в 1 строке) каждый символ в виде матрицы 5х7 пикселей. В этой статье рассмотрим основы подключения дисплея к Arduino.

Технические параметры

Напряжение питания: 5 В
Размер дисплея: 2.6 дюйма
Тип дисплея: 2 строки по 16 символов
Цвет подсветки: синий
Цвет символов: белый
Габаритные: 80мм x 35мм x 11мм

Описание дисплея

LCD 1602A представляет собой электронный модуль основанный на драйвере HD44780 от Hitachi. LCD1602 имеет 16 контактов и может работать в 4-битном режиме (с использованием только 4 линии данных) или 8-битном режиме (с использованием всех 8 строк данных), так же можно использовать интерфейс I2C . В этой статье я расскажу о подключении в 4-битном режиме.

Назначение контактов:
VSS: «-» питание модуля
VDD: «+» питание модуля
VO: Вывод управления контрастом
RS: Выбор регистра
RW: Выбор режима записи или чтения (при подключении к земле, устанавливается режим записи)
E: Строб по спаду
DB0-DB3: Биты интерфейса
DB4-DB7: Биты интерфейса
A: «+» питание подсветки
K: «-» питание подсветки

На лицевой части модуля располагается LCD дисплей и группа контактов.

На задней части модуля расположено два чипа в «капельном» исполнении (ST7066U и ST7065S) и электрическая обвязка, рисовать принципиальную схему не вижу смысла, только расскажу о резисторе R8 (100 Ом), который служит ограничительным резистором для светодиодной подсветки, так что можно подключить 5В напрямую к контакту A. Немного попозже напишу статью в которой расскажу как можно менять подсветку LCD дисплея с помощью ШИП и транзистора.

Подключение LCD 1602A к Arduino (4-битном режиме)

Необходимые детали:
Arduino UNO R3 x 1 шт.
LCD-дисплей 1602A (2×16, 5V, Синий) x 1 шт.
Провод DuPont, 2,54 мм, 20 см, F-F (Female - Female) x 1 шт.
Потенциометр 10 кОм x 1 шт.
Разъем PLS-16 x 1 шт.
Макетная плата MB-102 x 1 шт.
Кабель USB 2.0 A-B x 1 шт.

Подключение :
Для подключения будем использовать макетную плату, схема и таблица подключение LCD1602a к Arduino в 4-битном режиме можно посмотреть на рисунке ниже.

Подключение дисплея к макетной плате будет осуществляться через штыревые контакты PLS-16 (их необходимо припаять к дисплею). Установим модуль дисплея в плату breadboard и подключим питание VDD (2-й контакт) к 5В (Arduino) и VSS (1-й контакт) к GND (Arduino), далее RS (4-й контакт) подключаем к цифровому контакту 8 (Arduino). RW (5-й контакт) заземляем, подключив его к GND (Arduino), затем подключить вывод E к контакту 8 (Arduino). Для 4-разрядного подключения необходимо четыре контакта (DB4 до DB7). Подключаем контакты DB4 (11-й контакт), DB5 (12-й контакт), DB6 (13-й контакт) и DB7 (14-й контакт) с цифровыми выводами Arduino 4, 5, 6 и 7. Потенциометр 10K используется для регулировки контрастности дисплея, схема подключения LCD дисплея 1602а, показана ниже

Библиотека уже входит в среду разработки IDE Arduino и нет необходимости ее устанавливать. Скопируйте и вставьте этот пример кода в окно программы IDE Arduino и загрузите в контроллер.

/* Тестирование производилось на Arduino IDE 1.6.11 Дата тестирования 20.09.2016г. */ #include LiquidCrystal lcd(8, 9, 4, 5, 6, 7); void setup() { lcd.begin(16, 2); // Инициализирует LCD 16x2 } void loop() { lcd.setCursor(0,0); // Установить курсор на первыю строку lcd.print("Hello, world"); // Вывести текст lcd.setCursor(0,1); // Установить курсор на вторую строку lcd.print("www.robotchip.ru"); // Вывести текст }

Скачать программу

Немного о программе .
Для облегчения связи между Arduino и LCD дисплеем, используется встроенный в библиотеке в IDE Arduino « LiquidCrystal.h « — которая написана для LCD дисплеев, использующих HD44780 (Hitachi) чипсет (или совместимые микросхемы). Эта библиотека может обрабатывать как 4 — битном режиме и 8 — битном режиме подключение LCD.

Ссылки
Документация к LCD1602A

Купить на Aliexpress
Контроллер Arduino UNO R3

В этой инструкции показано, как подключать к Arduino и использовать LCD экраны на 16х2 и 20х4.

Эти экраны имеют встроенную подсветку на базе маломощного светодиода, работают от +5 В. Для подключения этих жидкокристаллических экранов понадобится 6 контактов. Можно использовать любые пины на вашем Arduino!

Инструкция написана на основании LCD экранов от компании Adafruit - blue&white 16x2, RGB 16x2 LCD, и blue&white 20x4, RGB 20x4. Если вы используете ЖК экран от другого производителя, нет 100% гарантии, что он сработает (хотя в 99% случаев все работает).

Символьные и графические LCD - в чем разница?

Существует огромное количество разных ЖК экранов. В этой статье мы рассмотрим символьные (character) LCD. Подобные экраны - отличный вариант для отображения текста. Можно настроить и отображение иконок, но размер этих иконок не должен превышать 7 пикселей (очень маленькие!).

На фото ниже показан пример работы LCD монитора на 16 символов с двумя строками:

Если вы присмотритесь повнимательнее, вы увидите маленькие прямоугольники, в которых отображаются символы. Каждый прямоугольник - это отдельная сетка пикселей. Для сравнения, ниже показан графический (graphical) LCD экран:

На графическом жидкокристаллическом дисплее одна большая сетка пикселей (в данном примере - 128х64). На нем можно отобразить текст, но лучше выводить изображения. Графические LCD обычно больше по размерам, на них больше контактов для подключения, использовать их несколько сложнее, чем текстовые.

В этой статье мы рассмотрим только текстовые/символьные экраны!

Разные модели LCD экранов

После того, как мы ограничили тип рассматриваемых экранов, рассмотрим, какие они бывают.


Несмотря на то, что они используются только для отображения текста, существуют разные модели и форм-факторы: в левом верхнем углу ЖК экран 20x4 с белым текстом на синем фоне, в правом верхнем - 16x4 с черным текстом на зеленом фоне, слева внизу - 16x2 с белым текстом на синем фоне и 16x1 с черным текстом на сером фоне.

Хорошая новость: все эти экраны взаимозаменяемы. Если вы настроили один из них, вы можете заменить его на другую модель. Скетч Arduino придется немного изменить, но подключение одинаковое!


В этой части мы используем LCD экраны с одной рельсой и 16 контактами для подключения (смотрите фото выше). Есть и LCD с 2 рельсами по 8 контактов для подключения (на рисунке ниже).


Подключить вторую модель к беспаечной монтажной плате сложнее.

Подключение символьного LCD экрана к Arduino

Устанавливаем рельсы контактов


Помимо LCD экрана вам понадобится дополнительная обвязка. Во-первых - потенциометр на 10 КОм. С помощью потенциометра мы будем настраивать контрастность дисплея. На каждом ЖК экране различные настройки контрастности, так что без регулировки не обойтись. Кроме того, вам понадобится рельса контактов 0.1".


Если рельса с контактами слишком длинная, лишние контакты модно просто отрезать!

Вам надо припаять контакты к ЖК дисплею.

При пайке будьте предельно осторожны, не повредите ваш Breadboard ! Можете сначала "прихватить" первый и 16 контакты, а потом уже припаять остальные.


Питание и подсветка

Подключаем питание и подсветку

Пояснения


Мы начинаем подбираться к интересным вещам! Установите ваш LCD на breadboard.


Макетную плату запитываем от нашего Arduino. Подключите +5V к красной рельсе, а Gnd - к синей.


После этого подключим подсветку нашего LCD экрана. Подключите контакт 16 к gnd, а пин 15 - к +5V. На большинстве ЖК экранов предусмотрены резисторы для подсветки.

Если же на вашем модуле резисторов не оказалось, придется добавить один между 5V и пином 15. Для расчета номинала резисторов, уточните максимальный ток для питания подсветки и примерное значение падения напряжения из даташита. Отнимите значение падения напряжения от 5 В, после этого разделите на максимальную силу тока и округлите к ближайшему большему стандартному значению номинала резистора. Например, если падение напряжения составляет 3.5 В, а сила тока 16 мА, номинал резистора будет равен: (5 - 3.5)/0.016 = 93.75 Ом, или 100 Ом после округления к стандартному значению. Если вы не можете найти даташит, используйте резистор на 220 Ом. Правда, в этом случае подсветка может быть достаточно бледной.


Подключите ваш Arduino к питанию. Подсветка должна загореться.

Кстати, на некоторых дешевых LCD экранах подсветка не предусмотрена!

Схема для настройки контраста

Цепь для настройки контраста

Пояснения


Устанавливаем потенциометр. На фото он находится справа от пина 1.


Подключите одну сторону потенциометра к +5V, а вторую - к Gnd. Средний контакт потенциометра подключите к 3 пину на LCD.


Теперь подключаем логику нашего экрана - это отдельная от подсветки цепь! Пин 1 идет к Gnd, а пин 2 - к +5V.


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

Если все сработало, поздравляем. Это значит, что логика, подсветка и контраст работают! Если не получилось, не переходите к следующим шагам инструкции, пока не выясните, в чем ошибка!

Окончательное подключение

От D0 до D7, RS, EN, и RW. D0-D7 - это контакты, на которых хранится значения, передаваемые на дисплей. Контакт RS сообщает контроллеру, будем ли мы отображать данные (например, ASCII символ) или это управляющий байт (например, смена положения курсора). Контакт EN - это сокращение от "enable" (доступно), с помощью этого контакта мы сообщаем LCD, когда данные готовы для считывания. Контакт RW используется для установки направления - мы хотим отобразить (обычно) или считать (используется реже) данные с дисплея.

Не все эти контакты надо подключать к Arduino. Например, использовать RW не надо, если мы только отображаем данные на экране, так что его достаточно "подтянуть" к контакту Gnd. Кроме того, можно обмениваться данными с LCD экраном, используя 4 контакта вместо 8. Вероятно, возникает закономерный вопрос, в каких случаях используют 8 контактов? Скорее всего, это влияет на скорость передачи данных. То есть, используя 8 контактов вместо 4, вы можете увеличить скорость обмена информацией в 2 раза. В данном случае, скорость не важна, так что мы используем 4 контакта для подключения LCD к Arduino.

Итак, нам понадобятся 6 контактов: RS, EN, D7, D6, D5, и D4.

Для работы с LCD экраном, будем использовать библиотеку LiquidCrystal library, которая значительно облегчает процесс настройки пинов. Одно из достоинств этой библиотеки: вы можете использовать любые пины на Arduino для подключения контактов ЖК дисплея. Так что по окончанию этого гайда вы сможете легко заменить контакты, если это критично для вашего проекта.

Окончательное подключение дисплея

Пояснения


Как упоминалось выше, мы не будем использовать пин RW, так что "подтягиваем" его к земле. Это пин 5.


После подключаем RS - это пин #4. Мы используем коричневый провод для его подключения к цифровому контакту #7 на Arduino.


Белым проводом подключаем контакт EN - пин #6 к цифровому пину digital #8 на Arduino.


Подошла очередь к контактам data. DB7 - это пин #14 на LCD. Он подключается оранжевым проводом к пину #12 на Arduino.


Осталось три контакта data, DB6 (пин #13 желтый), DB5 (пин #12 зеленый) и DB4 (пин #11 синий). Они подключаются к пинам #11, 10 и 9 на Arduino соответственно.


В результате Подключения у вас получится что-то похожее на фото слева.

Используем символьный LCD

Пришло время загрузить скетч на Arduino для управления LCD экраном. Библиотека LiquidCrystal library установлена в Arduino IDE по умолчанию. Так что нам достаточно загрузить один из примеров и немного подкорректировать в соответствии с теми пинами, которые мы использовали для подключения.

Откройте скетч File→Examples→LiquidCrystal→HelloWorld.

Обновляем информацию о пинах. Ищем следующую строку:

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

И меняем ее на:

Теперь можете компилировать и загружать скетч на Arduino.


Если надо, настройте контраст


Естественно, вы можете использовать ЖК дисплей с любыми размерами. Например, на фото ниже показана работа LCD 20x4.


Или черный текст на зеленом фоне:


Одно из достоинств экранов с черным текстом на зеленом фоне - возможность отключения подсветки.


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

Давайте разберемся, как ЖК экран обрабатывает длинные сообщения и задействует несколько строк. Например, если вы измените следующую строку:

lcd.print("hello, world!");

На следующую:

lcd.print("hello, world! this is a long long message");

LCD дисплей 16x2 обрежет все после 16-го символа:


Но LCD дисплей 20x4 перенесет не отображенные символы с первой строки на третью (вторая строка продолжится на четвертой). Не очень удобно, но на этом этапе придется смириться. Так что при отображении длинных строк, считайте символы, чтобы не превысить допустимую длину.


LCD с RGB подсветкой

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

После подключения LCD и его проверки в соответствии с инструкциями выше, подключите светодиоды к ШИМ аналоговым пинам вашего Arduino для точной настройки цвета. Если вы используете Arduino Uno, у вас должно было остаться три свободных ШИМ контакта. подключите красный светодиод (16 контакт на LCD) к Digital 3, зеленый светодиод (контакт 17) - к Digital 5, а синий светодиод (18 контакт на LCD) - к digital 6. На LCD модуле уже предусмотрены резисторы, так что подключать дополнительные не надо.


Теперь загрузите приведенный ниже скетч на Arduino.

// включаем в скетч библиотеки:

#include

#include

#define REDLITE 3

#define GREENLITE 5

#define BLUELITE 6

// объявляем количество контактов, которые используем

// для передачи данных

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

// яркость можно изменять в диапазоне 0 -> 255

int brightness = 255;

// настраиваем количество столбцов и строк на LCD:

lcd.begin(16, 2);

// отображаем сообщение на LCD.

lcd.print("RGB 16x2 Display ");

lcd.setCursor(0,1);

lcd.print(" Multicolor LCD ");

pinMode(REDLITE, OUTPUT);

pinMode(GREENLITE, OUTPUT);

pinMode(BLUELITE, OUTPUT);

brightness = 100;

for (int i = 0; i < 255; i++) {

setBacklight(i, 0, 255-i);

for (int i = 0; i < 255; i++) {

setBacklight(255-i, i, 0);

for (int i = 0; i < 255; i++) {

setBacklight(0, 255-i, i);

void setBacklight(uint8_t r, uint8_t g, uint8_t b) {

// настраиваем красный светодиод - он ярче остальных!

r = map(r, 0, 255, 0, 100);

g = map(g, 0, 255, 0, 150);

r = map(r, 0, 255, 0, brightness);

g = map(g, 0, 255, 0, brightness);

b = map(b, 0, 255, 0, brightness);

// общий анод, так что инвертируем!

r = map(r, 0, 255, 255, 0);

g = map(g, 0, 255, 255, 0);

b = map(b, 0, 255, 255, 0);

Serial.print("R = "); Serial.print(r, DEC);

Serial.print(" G = "); Serial.print(g, DEC);

Serial.print(" B = "); Serial.println(b, DEC);

analogWrite(REDLITE, r);

analogWrite(GREENLITE, g);

analogWrite(BLUELITE, b);

Результат работы данного скетча приведен на видео ниже

Команда createChar

Вероятно, вы захотите использовать специальные символы. Например, если вы разрабатываете проект с использованием датчика температуры (термопары), вам пригодится символ (°).

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

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