Подключаем LCD-дисплей на базе HD44780 к Arduino

Подключаем LCD-дисплей на базе HD44780 к Arduino

При работе с Arduino иногда возникает необходимость вывести какие-либо данные на дисплей, но передавать для этого данные на ПК имеет смысл только если устройство будет использоваться в связке с ПК. А как же быть с автономными устройствами? Тут на помощь придут LCD-дисплеи.

Рассмотрим LCD-дисплеи на базе контроллера HD44780 на примере WH1602B-YYK-CTK.

Этот монохромный дисплей имеет опциональную подсветку и может отображать 2 строки по 16 символов. Разрешение символов — 5×8 точек. Есть поддержка кириллицы, но странная, об этом — в конце статьи.

Чем хороши такие дисплеи? Контроллер HD44780 — стандарт де-факто среди небольших монохромных LCD-дисплеев, поэтому библиотеку для работы с дисплеями на его базе не написал только ленивый. Ленивым на сей раз оказался я, а вот разработчики Arduino написали библиотеку для своей платформы, и называется она LiquidCrystal. Её мы и используем для работы с выбранным мной дисплеем.

Итак, прежде чем писать код, нужно подключить дисплей к Arduino. Вам понадобятся:

    или CraftDuino
  • LCD-дисплей, например WH1602B-YYK-CTK
  • макетная плата
  • соединительные провода
  • потенциометр

Схема подключения в официальном руководстве на сайте Arduino выглядит так:

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

Кстати, дисплей имеет режим самотестирования, который можно включить, подсоединив выводы:

  • 1 — Vss, земля ⇨ GND
  • 2 — Vdd, питание ⇨ +5 В
  • 3 — Vo, управление контрастностью напряжением ⇨ выход потенциометра
  • 15 — A, питание для подсветки ⇨ +5 В
  • 16 — K, земля для подсветки ⇨ GND

Верхний ряд символов должен полностью заполниться тёмными прямоугольниками:

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

А для полноценной работы с дисплеем подключим 12 выводов:

  • 1 — Vss, земля ⇨ GND
  • 2 — Vdd, питание ⇨ +5 В
  • 3 — Vo, управление контрастностью напряжением ⇨ выход потенциометра
  • 4 — RS, выбор регистра ⇨ пин 12 Arduino
  • 5 — R/W, чтение/запись ⇨ земля (режим записи)
  • 6 — E, он же Enable, cтроб по спаду ⇨ пин 11 Arduino
  • 7-10 — DB0-DB3, младшие биты 8-битного интерфейса; не подключены
  • 11-14 — DB4-DB7, старшие биты интерфейса ⇨ пины 5-2 Arduino
  • 15 — A, питание для подсветки ⇨ +5 В
  • 16 — K, земля для подсветки ⇨ GND

Этот дисплей, как и прочие на контроллере HD44780, поддерживает два варианта параллельного интерфейса:

  • 8-битный, выводы DB0-DB7, за один такт передаётся 1 байт (8 бит)
  • 4-битный, выводы DB4-DB7, за один такт передаётся половина байта (4 бита)

Смысла использовать 8-битный вариант нет, потому что это требует больше ног, а выигрыша в скорости всё равно нет: частота обновления дисплея не больше 10 раз в секунду, так что мы всё равно не сможем увидеть часто обновляемые данные. Поэтому выводы DB0-DB3 оставляем неподключенными.

Ну что же, всё подключено — пора писать код. Начнём с классического «Hello, World», который доступен в Arduino IDE через пункт меню File ⇨ Examples ⇨ LiquidCrystal ⇨ HelloWorld:

Ничего сложного, как видите: основного кода набралось всего 4 строки. Обратите внимание на инициализацию дисплея:

Здесь мы задали размер экрана: 2 строки по 16 символов. Прелесть в том, что можно, ничего не меняя в схеме, подцепить другой дисплей — например, размером 16х4 символа, или сэкономить и взять 8х2. Достаточно изменить строку инициализации соответственно размеру подключенного дисплея.

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

  • home() и clear()Первый метод возвращает курсор в начало экрана; clear() делает то же самое, заодно стирая всё, что было на дисплее до этого.
  • write(ch)Выводит одиночный символ ch на дисплей. Пример:

Неплохо бы опробовать все эти функции, не правда ли? Сказано — сделано! Напишем большой и фаршированный функционалом скетч:

Видеозапись процесса работы этого скетча:

Надеюсь, вас не испугал такой объём кода. Зато всё в одном скетче, а не в нескольких, как в примерах к библиотеке LiquidCrystal. Исходный код с комментариями на английском языке также доступен вот тут и на GitHub в репозитории RoboCraft.

Теперь о кириллице. Дело в том, что китайцы решили, что поддержка кириллицы — это значит произвольным образом раскидать по таблице знаков кириллические символы, без соответствия какой-либо кодировке. Один добрый человек, Илья Данилов, в далёком 2010 году написал библиотеку LiquidCrystalRus, которая умело справляется с китайской кириллицей, делая её поддержку прозрачной. Однако с тех пор она малость устарела, поэтому я, да не осудит меня автор, её освежил и выкладываю в репозитории.

Напишем с её помощью русский вариант «Hello, World»:

Теперь вы знаете всё о работе с библиотекой LiquidCrystal, и в ваших силах создать более функциональное устройство с LCD-дисплеем — нужно только проявить фантазию (:

Для написания статьи были использованы:

    по работе с LCD на официальном сайте Arduino к библиотеке LiquidCrystal
  • Arduino-совместимая плата CraftDuino
  • LCD-дисплей WH1602B-YYK-CTK
  • Удобные соединительные провода
  • Беспаечная макетная плата Breadboard

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

97 комментариев на «“Подключаем LCD-дисплей на базе HD44780 к Arduino”»

Замечательная статья! Спасибо!

Судя по ответам, у всех работает, а у меня не желает…

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

Отличная статя, спасибо! P.S skystorm, согласен)

Спасибо за спасибо! Обозначения на фотках специально тщательно вырисовывал, потому что для меня самого обычные схемы не очень-то наглядны — слишком серы и скучны (:

Очень хорошая статья. Наполняя такими вещами сайт, можно привлечь большое количество новичков, ведь очень сложно начать самому с нуля. Спасибо!

Не плохо было бы ещё рассмотреть вариант подключения с использованием 74HC595 Вот тут статья об этом на английском http://www.circuitsathome.com/mcu/interfacing-lcd-via-spi

А я уже пишу 😉 Тут один товарищ ещё хотел сервами через сдвиговый регистр порулить — об этом тоже будет (:

Можно ли использовать вместо 11 и 12 пина Arduino пины 6 и 7? У кого собрана такая схема можете плиз проверить…

Можно использовать любые пины Arduino — хоть в обратном порядке, хоть вперемешку. Я недавно LCD вообще через сдвиговый регистр подключал (:

Может кто-нибудь подробнее объяснить куда скопировать папку LiquidCrystalRus? Сам скопировал сюда \arduino\libraries. Но при компиляции появляется куча ошибок: In file included from HelloWorldRus.cpp:1: C:\Users\Дмитрий\Desktop\arduino-1.0-rc2\libraries\LiquidCrystalRus/LiquidCrystalRus.h:16: error: expected class-name before ‘

📎📎📎📎📎📎📎📎📎📎