Для обеспечения хорошего взаимодействия между миром людей и миром машин необходимы дисплеи различного вида. Также дисплеи являются важной частью различных встраиваемых систем. Дисплеи, маленькие или большие, работают по аналогичным принципам. В радиолюбительской практике наиболее распространены жидкокристаллические (ЖК) дисплеи 16x1 и 16x2. ЖК дисплей 16x1 может отображать 16 символов, расположенных на одной строке. ЖК дисплей 16x2 может в сумме отображать 32 символа на двух строках – 16 символов на первой строке и 16 символов на второй. Здесь необходимо принимать во внимание тот факт, что каждый символ в подобных дисплеях состоит из 5x10=50 пикселов (точек). То есть чтобы отобразить 1 символ все эти 50 пикселов должны работать вместе. Но мы можем об этом не беспокоиться, потому что за их совместную работу отвечает контроллер HD44780 – его визуально можно увидеть на обратной стороне ЖК дисплея.

В данной статье мы будем подключать ЖК дисплей 16x2 к плате Arduino Uno. Как мы увидим далее подключить ЖК дисплей к этой плате значительно проще чем к большинству других аналогичных платформ. Нам не будет нужно беспокоиться о передаче данных и их приеме. Нам необходимо будет только определиться с номерами контактов и мы будем готовы к отображению данных на ЖК дисплее.
Необходимые компоненты
- Плата Arduino UNO (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Конденсатор 100 нФ (купить на AliExpress).
- Источник питания 5 В.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Работа схемы
Схема устройства представлена на следующем рисунке.
В ЖК дисплее 16x2 если мы хотим задействовать подсветку, то нам будут нужны все его 16 контактов, в противном случае нам будет достаточно 14 контактов. 2 контакта, отвечающие за подсветку (Backlight), можно оставить неиспользованными. Среди оставшихся 14 контактов мы имеем 8 контактов данных (7-14 или D0-D7), 2 контакта для подачи питания (1&2 или VSS&VDD или GND&+5v), 3-й контакт для управления контрастностью (определяет насколько "жирными" будут выглядеть символы на экране дисплея) и 3 управляющих контакта (RS&RW&E).
На представленной схеме можно увидеть, что мы использовали только 2 управляющих контакта – это обеспечивает гибкость в управлении. Бит контраста и READ/WRITE используются редко, поэтому в нашем случае их можно замкнуть на землю – это обеспечивает ЖК дисплею максимальную контрастность и режим чтения. Таким образом, нам необходимо будет контролировать только контакты ENABLE и RS чтобы передавать на ЖК дисплей символы и данные.
В схеме необходимо будет сделать следующие соединения с ЖК дисплеем:
PIN1 или VSS на землю
PIN2 или VDD или VCC к источнику питания +5В
PIN3 или VEE на землю (обеспечивает максимальную контрастность – хорошо для начинающих)
PIN4 или RS (Register Selection) к контакту PIN0 ARDUINO UNO
PIN5 или RW (Read/Write) на землю (переводит ЖК дисплей в режим чтения, что упрощает взаимодействие с ним для начинающих)
PIN6 или E (Enable) к контакту PIN1 of ARDUINO UNO
PIN11 или D4 к контакту PIN8 of ARDUINO UNO
PIN12 или D5 к контакту PIN9 of ARDUINO UNO
PIN13 или D6 к контакту PIN10 of ARDUINO UNO
PIN14 или D7 к контакту PIN11 of ARDUINO UNO
Программная среда ARDUINO IDE позволяет пользователю использовать ЖК дисплей в 4-битном режиме. Этот тип взаимодействия с ЖК дисплеем позволяет сократить использование контактов ARDUINO, к тому же этот режим взаимодействия (4-битный) по умолчанию заложен в ARDUINO. На представленной схеме мы использовали 4-битный режим взаимодействия (контакты D4-D7).
То есть в сумме мы подсоединили 6 контактов ЖК дисплея к нашей плате Arduino, из которых 4 контакта будут использоваться для передачи данных и 2 контакта для целей управления.
Исходный код программы
Чтобы в программе подключить ЖК дисплей к ARDUINO UNO, необходимо сделать следующие несколько вещей:
|
1 2 3 4 |
#include <LiquidCrystal.h> lcd.begin(16, 2); LiquidCrystal lcd(0, 1, 8, 9, 10, 11); lcd.print("hello, world!"); |
В первую очередь мы должны подключить заголовочный файл (‘#include <LiquidCrystal.h>’), в котором находятся все необходимые инструкции для взаимодействия с ЖК дисплеем, что значительно упростит взаимодействие с ним в 4 битном режиме. Используя этот заголовочный файл нам не нужно будет передавать в ЖК дисплей бит за битом и нам не нужно будет самим программировать какие-либо функции для взаимодействия с ЖК дисплеем.
Во второй строчке мы должны сказать плате ARDUINO UNO какой тип ЖК дисплея мы собираемся использовать, поскольку существует достаточно большое число типов подобных дисплеев, например, 20x4, 16x2, 16x1 и т.д. В нашем проекте мы собираемся подключать к ARDUINO UNO ЖК дисплей 16х2, поэтому мы и должны записать команду ‘lcd.begin(16, 2);’. А если бы мы подключали ЖК дисплей 16х1, то в этом случае изменилась бы и команда соответствующим образом - ‘lcd.begin(16, 1);’.
В следующей инструкции мы сообщаем плате ARDUINO UNO к каким контактам мы подсоединили ЖК дисплей. В нашем случае мы использовали контакты ЖК дисплея “RS, En, D4, D5, D6, D7”, которые подсоединены к контактам "0, 1, 8, 9, 10, 11" ARDUINO UNO, поэтому и приведенная команда выглядит следующим образом - “LiquidCrystal lcd(0, 1, 8, 9, 10, 11);”.
Для того, чтобы напечатать на экране дисплея строку символов, мы использовали команду lcd.print("hello, world!"), которая выводит на экран дисплея строку ‘hello, world!’.
Как мы видим из представленного кода, нам не нужно заботиться больше ни о каких аспектах взаимодействия с ЖК дисплеем, нам нужно просто инициализировать ЖК дисплей в программе и тогда плата ARDUINO UNO будет готова к отображению информации на экране дисплея.
Далее представлен исходный код программы (с комментариями) для взаимодействия платы ARDUINO UNO с ЖК дисплеем 16х2.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <LiquidCrystal.h> // инициализируем библиотеку для взаимодействия с ЖК дисплеем LiquidCrystal lcd(0, 1, 8, 9, 10, 11); /// сообщаем Arduino номера контактов, к которым подключен ЖК дисплей - REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN void setup() { // устанавливаем число столбцов и строк для ЖК дисплея lcd.begin(16, 2); } void loop() { // устанавливаем курсор в нулевой столбец первой строки lcd.print(" CIRCUIT DIGEST"); //печатаем строку lcd.setCursor(0, 1); // устанавливаем курсор в нулевой столбец второй строки lcd.print("http://www.circuitdigest.com/");//печатаем строку delay(750); //задержка на 0.75 сек lcd.scrollDisplayLeft();// переключаем данные на ЖК дисплее lcd.setCursor(0, 0);// устанавливаем курсор в нулевой столбец первой строки } |




Благодарю Вас за информационную конкретность и последовательность предлагаемых действий по наладке схемы... Все заработало в соответствии с проектным решением. Позвольте ещё один вопрос: Что нужно изменить а скетче, если LCD 16x02 использовать с модулем_12С?..
Добрый день. Можете взять за основу скетч из статьи Счетчик шагов (шагомер) на Arduino и акселерометре, взяв из нее только то, что относится к работе с ЖК дисплеем.
Или посмотреть вот эту статью для модуля ESP32 - подключение ЖК дисплея к нему будет фактически таким же, как и для Ардуино
Уважаемый админ, добрый вечер!
Рекомендованная Вами статья о подключении LCD 1602 к ARDUINO UNO заслуживает достойного внимания и благодарности за простоту и последовательность изложения. Для начинающего изучать подобные материалы - это путеводитель без права совершения ошибки. Это дорогого стоит: коротко, доходчиво, последовательно, без необходимости дилетантского домышления. Спасибо автору за добросовестный труд!
Теперь по-сути ранее поставленного вопроса. Схема для проверки индикатора собрана. При подключении к ПК экран индикатора засветился, на котором четко определились две строки прямоугольников (верхняя - светлая, нижняя - темно-синяя). Но увидеть желанное "hello,world" на экране было не суждено, так как рекомендованный скетч почему-то не компилируется, а в строке внизу появляется следующая информация: "Ошибка компиляции для платы Arduino UNO". Новый тупичок. Для проверки открыл пример "blink", в результате -- все компилируется и загружается. Что порекомендуете для следующего шага?
С наилучшими пожеланиями, Николай.
Добрый день.
Ошибка компиляции в приведенном скетче может возникать из-за конфликта контактов. В Arduino UNO контакты 0 (RX) и 1 (TX) используются для последовательной связи (USB) с компьютером. Когда вы объявляете LiquidCrystal lcd(0, 1, 8, 9, 10, 11);, вы пытаетесь использовать эти контакты для дисплея, что блокирует связь с ПК и приводит к ошибке.
Исправление №1 (Рекомендуемое)
Самый простой способ — поменять номера контактов на свободные (кроме 0 и 1). Например, подключите дисплей так, как указано в классических примерах:
Схема подключения (если у вас есть возможность перепаять/переткнуть шлейфы):
RS -> пин 12
E -> пин 11
D4 -> пин 5
D5 -> пин 4
D6 -> пин 3
D7 -> пин 2
Исправленный код:
#include
// ИНИЦИАЛИЗАЦИЯ С НОВЫМИ КОНТАКТАМИ (без 0 и 1)
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup()
{
lcd.begin(16, 2);
lcd.print(" CIRCUIT DIGEST");
lcd.setCursor(0, 1);
lcd.print("http://www.circuitdigest.com/");
}
void loop()
{
// В оригинале scrollDisplayLeft() в loop() вызывает быстрое дерганье текста
// Обычно прокрутку делают так:
lcd.scrollDisplayLeft();
delay(500);
}
Альтернативный вариант (Проверка дисплея)
Чтобы просто убедиться, что дисплей работает (исключить ошибку монтажа), залейте этот простейший код, используя контакты 12, 11, 5, 4, 3, 2:
#include
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() {
lcd.begin(16, 2);
lcd.print("Hello, World!");
}
void loop() {
}
Если текст появится: значит, ваш дисплей подключен правильно. Проблема была в контактах 0 и 1.
Если текста нет (видны только прямоугольники):
Проверьте контрастность — на дисплее есть потенциометр (винт сбоку), его нужно подкрутить. Обычно именно из-за него видны прямоугольники, но не видно букв.
Проверьте, подключен ли пин RW дисплея к GND (земле) или к пину на Arduino.
Здравствуйте, подскажите что мог неправильно сделать подключил по вашей схему, и на верхней строку пишет черную полоску. Правильность подключения проверил.
Добрый вечер. Ну а просто lcd.print("hello, world!") удается вывести на первую или вторую строку? Или на вторую строку нормально выводится, а на первой строке при этом отображается черная полоска?