Дисплей 1602 с русскими буквами
Жидкокристаллический дисплей 1602 — один из самых распространённых символьных дисплеев в среде DIY электроники. Собственно, для большинства самоделок возможностей данного дисплея сполна хватает.

Число 1602 в его маркировке модуля означает, что на экране могут быть отображены две строки по 16 символов в каждой. И именно символов, поэтому данный дисплей и называется символьным. У 1602 имеется чуть менее популярный старший брат 2004, который может отобразить четыре строки по 20 символов. А вообще, промышленность выпускает подобные модули с любым количеством строк и символов.
Большинство продаваемых в Китае дисплеев 1602 и 2004 не подходят для работы с русским текстом. То есть написать на нём «Привет!» не выйдет. Конечно, есть способы как частично обойти отсутствие русских букв во внутренней памяти дисплея, но полного алфавита они не дают.
На этом уроке мы разберёмся с русифицированной версией дисплея 1602A! Подключим его к Arduino и напишем программу для вывода всех букв русского алфавита с использованием специальной библиотеки.
Список необходимых компонентов
Для выполнения простого примера с модулем 1602A, кроме самого дисплея, потребуется Ардуино-совместимый контроллер, макетная плата, потенциометр и немного проводов. Если вам не хватает чего-то из этого, можно добавить необходимые компоненты в корзину прямо здесь и затем оформить заказ в нашем интернет-магазине.
Подключение
У дисплея 1602 есть 16 контактов. Обычно, они нумеруются слева-направо, если смотреть на него так, как на картинке. Иногда, контакты подписываются так: DB0, DB1, EN и т.п. Но в большинстве случаев отмечается первый контакт и 16-й.
Порядок контактов и их назначение может меняться в зависимости от модели дисплея. Для варианта, который мы изучаем в этом уроке, порядок будет такой:
1 — VSS, земля (минус питания);
2 — VDD, питание +5В;
3 — VO, контраст;
4 — RS, выбор регистра;
5 — RW, направление передачи данных (запись/чтение);
6 — E, синхронизация;
7-14 — DB0, DB1, . DB7— шина данных;
15 — A, анод светодиода подсветки;
16 — K, катод светодиода подсветки.
Контакты RS, E и четыре контакта шины данных DB4, DB5, DB6, DB7 подключаем к цифровым выводам контроллера. Контакт RW подключим к «земле» контроллера (так как нам потребуется только функция записи в память дисплея).
Контакту VO уделим особое внимание. Уровень напряжения на этом контакте задаёт контрастность дисплея. Если контрастность будет слишком низкая — весь экран будет белым и мы не увидим ни одного символа. При максимальной контрастности экран будет, напротив, целиком закрашен черными пикселями, и опять мы не сможем на нём ничего разглядеть.
Подключим к VO обычный потенциометр, и уже после написания программы для контроллера и после подачи питания на собранный стенд, выставим требуемую контрастность.
Принципиальная схема подключения к Arduino

Таблица подключения к Arduino
| ЖК дисплей 1602 | 1 | 2 | 4 | 6 | 11 | 12 | 13 | 14 | 15 | 16 |
| Ардуино Уно | GND | +5V | D4 | D5 | D6 | D7 | D8 | D9 | +5V | GND |
Программа
В каждом подобном дисплее имеется немного встроенной постоянной памяти, в которой хранятся образы всех доступных символов. Именно из-за этой таблицы символов и возникает проблема с выводом кириллицы на большинстве нелокализованных дисплеев (купленных на Aliexpress или ещё где-то). То есть, символов кириллицы там просто нет.
Но мы будем работать с модулем 1602, в котором есть полноценная локализованная таблица. Только вот она совсем не стандартная. Не получится просто написать текст в кодировке cp1251 и отправить его на дисплей. Потребуется определённым образом перетасовать символы. К тому же, некоторые русские буквы можно взять из латинской части таблицы ASCII, чем пользуются производители дисплеев для экономии памяти.
Для работы с русифицированными дисплеями, которые продаются в нашем интернет-магазине, мы разработали вспомогательную библиотеку RobotClass_LiquidCrystal. Она сама делает все необходимые манипуляции с таблицей символов. Пользоваться ей так же просто, как и стандартной LiquidCrystal.
Напишем программу, которая будет сначала выводить заглавными и прописными буквами первую половину алфавита, а спустя секунду, вторую половину.
#include RobotClass_LiquidCrystal lcd(4, 5, 6, 7, 8, 9, CP_UTF8); byte idx = 0; void setup() < lcd.begin( 16, 2 ); >void loop()
Единственной отличие от обычной библиотеки LiquidCrystal наблюдается в строке инициализации:
RobotClass_LiquidCrystal lcd(4, 5, 6, 7, 8, 9, CP_UTF8);
Последний аргумент CP_UTF8 означает, что мы передаём в функцию print текст в кодировке UTF-8. Это стандартная кодировка для Arduino IDE. Однако, если пользователь изменил кодировку среды на cp1251, то следует заменить этот аргумент на CP_CP1251. Такие дела.
Остался ещё один момент, который может препятствовать нашей радости от работающего дисплея. После загрузки программы на Arduino необходимо настроить контрастность. Для этого покрутим ручку потенциометра до тех пор, пока изображение на дисплее не станет чётким.

К размышлению
На практике, часто бывает удобно пользоваться дисплеем 1602 в паре с I2C преобразователем. Это позволяет подключать модуль к шине I2C и экономить четыре GPIO контакта на контроллере. Для работы с таким дисплеем потребуется другая библиотека, как правило это LiquidCrystal_I2C.
Соответственно, для модуля 1602 с поддержкой кириллицы необходима модификация этой библиотеки. И мы в RobotClass тоже её сделали (русифицированный дисплей 1602 с I2C).
Как проверить ЖК-дисплей 1602 на производительность
Как мы все знаем, хотя ЖК-дисплеи и некоторые другие дисплеи значительно улучшают взаимодействие человека и машины, у них есть общая слабость. Когда они подключены к контроллеру, несколько IO будут заняты контроллером, у которого не так много внешних портов. Также он ограничивает другие функции контроллера. Поэтому для решения проблемы разработан LCD1602 с шиной I2C.
Шина I2C — это тип последовательной шины, изобретенный компанией PHLIPS. Это высокопроизводительная последовательная шина, которая имеет управление шиной и функцию высокоскоростной или низкоскоростной синхронизации устройств, необходимую для системы с несколькими хостами. Шина I2C имеет только две двунаправленные сигнальные линии: последовательную линию данных (SDA) и последовательную линию синхронизации (SCL). Синий потенциометр на I2C LCD1602 используется для регулировки подсветки, чтобы упростить отображение на I2C LCD1602.
Компоненты
— 1 * плата SunFounder Uno
— 1 * модуль I2C LCD1602
— 1 * кабель USB
— несколько соединительных проводов
Экспериментальный принцип
В этом эксперименте мы позволим I2C LCD1602 отображать «SUNFOUNDER» и «hello, world» с помощью программирования.
I²C (Inter-Integrated Circuit), произносится как I-squared-C, представляет собой одностороннюю последовательную компьютерную шину с несколькими главными и подчиненными устройствами, изобретенную Philips Semiconductor (теперь NXP Semiconductors). Обычно он используется для подключения низкоскоростных периферийных ИС к процессорам и микроконтроллерам. В качестве альтернативы I²C пишется как I2C (произносится как I-two-C) или IIC (произносится как IIC).
I²C использует только две двунаправленные линии с открытым стоком, последовательную линию передачи данных (SDA) и последовательную линию синхронизации (SCL), подтянутые резисторами. Обычно используются напряжения +5 В или +3,3 В, хотя допускаются системы с другими напряжениями.
Дополнительную информацию о принципе работы I2C см. на странице I²C.
Экспериментальные процедуры
Шаг 1. Подключите цепь
См. следующую таблицу для связи между I2C LCD1602 и платой SunFounder Uno:
| I2C LCD1602 | плата SunFounder Uno |
|---|---|
| Заземление | Заземление |
| VCC | 5В |
| SDA | A4 /pin 20 mega2560 |
| SCL | A5 /pin 21 mega2560 |
![]()
Шаг 2. Добавьте библиотеку
Прежде чем загружать код на плату управления, необходимо добавить библиотеку LiquidCrystal_I2C.
1) Загрузите библиотеку LiquidCrystal_I2C
2) Откройте среду разработки Arduino, выберите «Скетч» -> «Включить библиотеку» -> «Добавить ZIP-библиотеку».


3) Найдите файл LiquidCrystal_I2C, который вы только что скачали. Щелкните его, чтобы открыть, и затем вам будет предложено «Библиотека добавлена в ваши библиотеки. Установите флажок «Импортировать библиотеки». Вы также можете увидеть, что только что импортированные библиотеки появились в списке, выбрав Sketch->Include Library->LiquidCrystal_I2C.
Шаг 3. Скопируйте код
Скопируйте следующий код в Arduino IDE, щелкните значок загрузки, чтобы загрузить код на плату управления
экспериментальное явление
![]()
Примечание
Если все правильно, но на дисплее просто отображаются 16 черных прямоугольников в строке 1. это может быть адрес i2c не 0x27, поэтому вам нужно запустить следующий код, чтобы прочитать адрес, а затем изменить 0x27 на который ты читаешь.
Как мы все знаем, хотя ЖК-дисплеи и некоторые другие дисплеи значительно улучшают взаимодействие человека и машины, у них есть общая слабость. Когда они подключены к контроллеру, несколько IO будут заняты контроллером, у которого не так много внешних портов. Также он ограничивает другие функции контроллера. Поэтому для решения этой проблемы разработан LCD1602 с шиной I2C.
Шина I2C – это тип последовательной шины, разработанный компанией PHLIPS. Это высокопроизводительная последовательная шина, которая имеет управление шиной и функцию высокоскоростной или низкоскоростной синхронизации устройств, необходимую для системы с несколькими хостами. Синий потенциометр на I2C LCD1602 (см. рисунок ниже) используется для регулировки подсветки для лучшего отображения. I²C использует только две двунаправленные линии с открытым стоком, последовательную линию передачи данных (SDA) и последовательную линию синхронизации (SCL), подтянутые резисторами. Типичные используемые напряжения +5 В или +3.3 В, хотя разрешены системы с другим напряжением.

– 1 * плата SunFounder Uno
– 1 * модуль I2C LCD1602
В этом эксперименте мы позволим I2C LCD1602 отображать «SunFounder» и «hello, world» путем программирования.
Шаг 1. Создайте схему
Соединение между I2C LCD1602 и платой SunFounder Uno:
| I2C LCD1602 | SunFounder Uno |
| Заземление | Заземление |
| VCC | 5V |
| SDA | A4 |
| SCL | A5 |
Примечание. Подключение I2C LCD1602 одинаково на следующих уроках.

Шаг 2. Программа (см. пример кода в разделе УЧИТЬСЯ -> Получить учебные пособия на нашем веб-сайте)
Шаг 3: Поскольку в некоторых кодах необходимые библиотеки не включены в Arduino, вам необходимо добавить их перед компиляцией. Разархивируйте загруженный файл. Скопируйте папки из папки «Библиотека» в папку libraries в Arduino (если вы не можете найти путь в Arduino, откройте среду разработки Arduino, нажмите «Файл» -> «Настройки», и вы увидите путь в окне «Обзор»). , как показано на следующей диаграмме). Скомпилируйте программу.

Шаг 4. Загрузите скетч на плату SunFounder Uno
Теперь вы должны увидеть, что ваш I2C LCD1602 отображает плавные символы: «SunFounder» и «hello, world».

ЖК-дисплей 16×2 назван так потому, что; он имеет 16 столбцов и 2 строки. Доступно множество комбинаций, таких как 8×1, 8×2, 10×2, 16×1 и т. д. Но чаще всего используется ЖК-дисплей 16*2, поэтому мы используем его здесь.
Все вышеупомянутые ЖК-дисплеи будут иметь 16 контактов, и подход к программированию также одинаков, поэтому выбор остается за вами. Ниже приведены распиновка и описание контактов ЖК-модуля 16×2:
Это контакт заземления ЖК-дисплея
Подключен к земле MCU/источника питания
Это контакт питания ЖК-дисплея
Подключен к контакту питания источника питания
Регулирует контрастность ЖК-дисплея.
Подключен к переменному POT, который может быть источником 0–5 В
Переключение между регистрами команд и данных
Подключен к контакту MCU и получает либо 0, либо 1.
0 -> Командный режим
Переключает ЖК-дисплей между операциями чтения/записи
Подключен к контакту MCU и получает либо 0, либо 1.
0 -> Операция записи
1-> Операция чтения
Для выполнения операции чтения/записи необходимо удерживать высокий уровень
Подключен к MCU и всегда находится на высоком уровне.
Выводы, используемые для отправки команды или данных на ЖК-дисплей.
Только 4 контакта (0-3) подключены к MCU
Все 8 контактов (0-7) подключены к MCU
Обычная светодиодная подсветка ЖК-дисплея
Подключен к +5 В
Обычный светодиодный индикатор для освещения ЖК-дисплея, подключенного к GND.
Подключен к земле
Ничего страшного, если вы не понимаете функции всех контактов, я подробно объясню ниже. Теперь давайте перевернем наш LCD:
Хорошо, а что это за два черных круга на задней панели ЖК-дисплея?
Эти черные кружки состоят из интерфейсной ИС и связанных с ней компонентов, которые помогают нам использовать этот ЖК-дисплей с микроконтроллером. Поскольку наш ЖК-дисплей представляет собой ЖК-матрицу с разрешением 16*2 точек, он будет иметь (16*2=32) всего 32 символа, и каждый символ будет состоять из 5*8 точек пикселей. Один символ со всеми включенными пикселями показан на рисунке ниже.
![]()
Итак, теперь мы знаем, что каждый символ имеет (5*8=40) 40 пикселей, а для 32 символов у нас будет (32*40) 1280 пикселей. Кроме того, ЖК-дисплей также должен быть проинструктирован о положении пикселей.
Обрабатывать все с помощью микроконтроллера будет сложной задачей, поэтому используется интерфейсная микросхема, такая как HD44780, которая устанавливается на сам ЖК-модуль.Функция этой ИС состоит в том, чтобы получать команды и данные от микроконтроллера и обрабатывать их для отображения значимой информации на нашем ЖК-экране.
Давайте обсудим различные типы режимов и параметров, доступных на нашем ЖК-дисплее, которые должны управляться нашими контактами управления.
Режим чтения и записи ЖК-дисплея:
Как уже говорилось, сам ЖК-дисплей состоит из интерфейсной ИС. MCU может либо читать, либо писать в эту интерфейсную ИС. В большинстве случаев мы будем просто писать в IC, так как чтение усложнит задачу, а такие сценарии очень редки. При необходимости можно прочитать такую информацию, как положение курсора, прерывания завершения состояния и т. д., но это выходит за рамки данного руководства.
Интерфейсная ИС, присутствующая в большинстве ЖК-дисплеев, — HD44780U, чтобы запрограммировать наш ЖК-дисплей, мы должны изучить полное техническое описание ИС. Спецификация приведена здесь.
В ЖК-дисплее есть несколько предустановленных инструкций команд, которые нам нужно отправить на ЖК-дисплей через какой-нибудь микроконтроллер. Ниже приведены некоторые важные инструкции для команд:

В этом руководстве я объясню, как настроить ЖК-дисплей на Arduino, и покажу вам различные способы его программирования. Я покажу вам, как печатать текст, прокручивать текст, создавать пользовательские символы, мигать текст и позиционировать текст. Они отлично подходят для любого проекта, связанного с выводом данных, и могут сделать ваш проект более интересным и интерактивным.
Дисплей, который я использую, представляет собой ЖК-дисплей 16 x 2, который я купил примерно за 5 долларов США. Вам может быть интересно, почему он называется ЖК-дисплеем 16×2. Часть 16×2 означает, что ЖК-дисплей имеет 2 строки и может отображать 16 символов в строке. Таким образом, ЖК-экран 16×2 может одновременно отображать до 32 символов. Однако с прокруткой можно отобразить более 32 символов.
Код в этой статье написан для ЖК-дисплеев, использующих стандартный драйвер Hitachi HD44780. Если ваш ЖК-дисплей имеет 16 контактов, то, вероятно, он имеет драйвер Hitachi HD44780. Эти дисплеи могут быть подключены либо в 4-битном, либо в 8-битном режиме. Обычно предпочтительнее подключение ЖК-дисплея в 4-битном режиме, поскольку при этом используется на четыре провода меньше, чем в 8-битном режиме. На практике заметной разницы в производительности между двумя режимами нет. В этом уроке я подключу ЖК-дисплей в 4-битном режиме.
БОНУС: я составил краткое руководство для этого руководства, которое вы можете загрузить и вернуться к нему позже, если не можете настроить его прямо сейчас. В нем описаны все шаги, диаграммы и код, необходимые для начала работы.
Подключение ЖК-дисплея к Arduino
Вот схема контактов на ЖК-дисплее, который я использую. Соединения от каждого контакта к Arduino будут одинаковыми, но ваши контакты могут быть расположены по-разному на ЖК-дисплее. Обязательно ознакомьтесь с техническим описанием или поищите этикетки на вашем конкретном ЖК-дисплее:

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

Резистор на схеме выше устанавливает яркость подсветки. Типичное значение — 220 Ом, но подойдут и другие значения. Меньшие резисторы сделают подсветку ярче.
Потенциометр используется для регулировки контрастности экрана. Обычно я использую потенциометр на 10 кОм, но подойдут и другие значения.
Вот техническое описание ЖК-дисплея 16 x 2 со всей технической информацией о дисплее:
Программирование Arduino
Во всем приведенном ниже коде используется библиотека LiquidCrystal, которая предустановлена вместе с Arduino IDE. Библиотека — это набор функций, которые можно легко добавить в программу в сокращенном формате.
Теперь мы готовы приступить к программированию! Через мгновение я расскажу о более интересных вещах, которые вы можете сделать, а пока давайте просто запустим простую тестовую программу. Эта программа напечатает «hello, world!» на экран. Введите этот код в Arduino IDE и загрузите его на плату:
Ваш ЖК-экран должен выглядеть так:
Параметры ЖК-дисплея
В библиотеке LiquidCrystal есть 19 различных функций, которые мы можем использовать. Эти функции выполняют такие действия, как изменение положения текста, перемещение текста по экрану или включение или выключение дисплея.Далее следует краткое описание каждой функции и способов ее использования в программе.
Функция LiquidCrystal() устанавливает контакты, которые Arduino использует для подключения к ЖК-дисплею. Вы можете использовать любой из цифровых контактов Arduino для управления ЖК-дисплеем. Просто поместите номера выводов Arduino в скобки в следующем порядке:
Жидкий Кристалл(RS, E, D4, D5, D6, D7)
RS, E, D4, D5, D6, D7 — это контакты ЖК-дисплея.
Например, вы хотите, чтобы контакт D7 ЖК-дисплея соединился с контактом 12 Arduino. Просто введите «12» вместо D7 в следующей функции:
Жидкий Кристалл(RS, E, D4, D5, D6, 12)
Эта функция должна быть размещена перед разделом void setup() программы.
Эта функция устанавливает размеры ЖК-дисплея. Его нужно разместить перед любой другой функцией LiquidCrystal в разделе программы void setup(). Количество строк и столбцов указывается как lcd.begin(columns, rows) . Для ЖК-дисплея 16 × 2 вы должны использовать lcd.begin(16, 2) , а для ЖК-дисплея 20 × 4 — lcd.begin(20, 4) .
Эта функция удаляет любой текст или данные, уже отображаемые на ЖК-дисплее. Если вы используете lcd.clear() с lcd.print() и функцией delay() в разделе void loop(), вы можете создать простую программу с мерцающим текстом:
Эта функция помещает курсор в верхний левый угол экрана и печатает любой последующий текст с этой позиции. Например, этот код заменяет первые три буквы «hello world!» с крестиками:

Похожим, но более полезным, чем lcd.home(), является lcd.setCursor() . Эта функция помещает курсор (и любой печатный текст) в любое место на экране. Его можно использовать в разделе void setup() или void loop() вашей программы.
Позиция курсора определяется с помощью lcd.setCursor(column, row) . Координаты столбца и строки начинаются с нуля (0-15 и 0-1 соответственно). Например, используя lcd.setCursor(2, 1) в разделе void setup() окна «hello, world!» программа выше печатает «привет, мир!» на нижнюю строку и сдвигает ее вправо на два пробела:

Эту функцию можно использовать для записи на ЖК-дисплей различных типов данных, например, показаний датчика температуры или координат из модуля GPS. Вы также можете использовать его для печати пользовательских символов, которые вы создаете сами (подробнее об этом ниже). Используйте lcd.write() в разделе void setup() или void loop() вашей программы.
Эта функция используется для печати текста на ЖК-дисплее. Его можно использовать в разделе программы void setup() или void loop().
Чтобы напечатать буквы и слова, заключите текст в кавычки («»). Например, чтобы напечатать hello, world!, используйте lcd.print(«hello, world!») .
Чтобы напечатать числа, кавычки не нужны. Например, чтобы напечатать 123456789, используйте lcd.print(123456789) .
lcd.print() может печатать числа в десятичной, двоичной, шестнадцатеричной и восьмеричной системе счисления. Например:
- lcd.print(100, DEC) печатает «100»;
- lcd.print(100, BIN) печатает «1100100»
- lcd.print(100, HEX) печатает «64»
- lcd.print(100, OCT) печатает «144»
Эта функция создает видимый курсор. Курсор представляет собой горизонтальную линию, расположенную под следующим символом, который будет напечатан на ЖК-дисплее.
Функция lcd.noCursor() выключает курсор. lcd.cursor() и lcd.noCursor() можно использовать вместе в разделе void loop(), чтобы сделать мигающий курсор похожим на то, что вы видите во многих полях ввода текста:
Это помещает мигающий курсор после восклицательного знака в «hello, world!»
Курсоры можно размещать в любом месте экрана с помощью функции lcd.setCursor(). Этот код помещает мигающий курсор прямо под восклицательным знаком в слове «hello, world!»:
Эта функция создает курсор в виде блока, который мигает примерно с частотой 500 миллисекунд за цикл. Используйте его в разделе void loop(). Функция lcd.noBlink() отключает мигающий блочный курсор.
Эта функция включает любой текст или курсоры, которые были напечатаны на ЖК-экране. Функция lcd.noDisplay() отключает любой текст или курсоры, напечатанные на ЖК-дисплее, не удаляя их из памяти ЖК-дисплея.
Эти две функции можно использовать вместе в разделе void loop() для создания эффекта мерцания текста. Этот код заставит «hello, world!» мигание текста включается и выключается:
Эта функция берет все, что напечатано на ЖК-дисплее, и перемещает его влево.Его следует использовать в секции void loop() с командой задержки, следующей за ней. Функция переместит текст на 40 пробелов влево, прежде чем вернуться к первому символу. Этот код перемещает «привет, мир!» текст слева, со скоростью одна секунда на символ:
Текстовые строки длиннее 40 пробелов будут напечатаны в строке 1 после 40-й позиции, а начало строки будет продолжать печататься в строке 0.
Эта функция ведет себя как lcd.scrollDisplayLeft() , но перемещает текст вправо.
Эта функция берет строку текста и прокручивает ее справа налево с шагом, равным количеству символов в строке. Например, если у вас есть строка текста длиной 3 символа, она будет сдвигать текст на 3 пробела влево с каждым шагом:
Как и в функциях lcd.scrollDisplay(), текст может иметь длину до 40 символов до повторения. На первый взгляд эта функция кажется менее полезной, чем функции lcd.scrollDisplay(), но она может оказаться очень полезной для создания анимации с пользовательскими персонажами.
lcd.noAutoscroll() отключает функцию lcd.autoscroll(). Используйте эту функцию до или после lcd.autoscroll() в разделе void loop() для создания последовательностей прокручиваемого текста или анимации.
Эта функция задает направление печати текста на экране. Режим по умолчанию — слева направо с использованием команды lcd.leftToRight(), но вы можете найти некоторые случаи, когда полезно выводить текст в обратном направлении:
Этот код печатает «привет, мир!» текст как «!dlrow, olleh». Если вы не укажете положение курсора с помощью lcd.setCursor() , текст будет напечатан с позиции (0, 1), и будет виден только первый символ строки.

Эта команда позволяет вам создавать своих собственных персонажей. Каждый символ ЖК-дисплея 16×2 имеет ширину 5 пикселей и высоту 8 пикселей. В одной программе можно определить до 8 различных пользовательских символов. Чтобы создать своих собственных персонажей, вам нужно будет создать двоичную матрицу вашего пользовательского персонажа из генератора символов с ЖК-дисплеем или отобразить ее самостоятельно. Этот код создает символ градуса (°):

С этими ЖК-дисплеями 16 x 2 можно сделать много интересных вещей! Попробуйте объединить некоторые из этих функций и посмотрите, что получится.
Вот видеоверсия этого руководства, чтобы вы могли увидеть, что делает каждая функция на ЖК-дисплее в режиме реального времени:
Если вы нашли эту статью полезной, подпишитесь по электронной почте, чтобы получать уведомления, когда мы публикуем новые сообщения! И, как всегда, если у вас возникли проблемы с чем-либо, просто оставьте комментарий, и я постараюсь вам помочь.
Читайте также:
- Как создать личный кабинет мтс на компьютере домашний интернет
- Дисплей iPad не работает
- Компьютер зависает из-за Firefox
- Viewcube в 3ds max, как отключить
- Вредит ли электронная книга вашему зрению?
Обзор LCD-дисплея 1602A (LCD1602A)

Жидкокристаллический дисплей (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 и загрузите в контроллер.
Подключение жидкокристаллического дисплея LCD1602 (HD44780) к микроконтроллеру ATmega8 в 8-битном режиме
Примечание:
Статья не является оригинальным переводом. Статья созданы на базе статьи (см. источник информации указанный ниже) путем его перевода, использования основного текста оригинала и дополнена автором; данный код протестирован на реальном устройстве ф. Winstar.
LCD-дисплеи (Liquid Crystal Displays) используют для отображения состояния или параметров в различных приборах.
Жидкокристаллический дисплей LCD1602 представляет собой 16-выводное устройство, имеющее 8 выводов для передачи данных (D0-D7) и 3 вывода управления (RS, RW, EN). Остальные 5 выводов предназначены для питания и подсветки ЖК-дисплея. Цифры «1602» указывают на формат выводимой (отображаемой) информации: 16×02 символов (рисунок 1).
Выводы управления помогают нам настроить LCD-дисплей в командном режиме или режиме передачи данных. Они также помогают настроить режим чтения или записи, а также время чтения или записи.
LCD-дисплей 16×2 можно использовать в 4-битном или 8-битном режиме в зависимости от технических требований. Чтобы использовать его, нам необходимо отправить определенные команды на LCD-дисплей в командном режиме, и как только ЖК-дисплей будет настроен в соответствии с нашими требованиями, мы сможем отправить необходимые данные в режиме передачи данных.
Для получения дополнительной информации о LCD-дисплее 16×02 и о том, как его использовать, необходимо обратиться к datasheet.

Схема подключения жидкокристаллического дисплея LCD1602 (HD44780) к микроконтроллеру ATmega8 в 8-битном режиме показана на рисунке 2.

Подстрочный резистор R1 предназначен для точной подстройки контрастности дисплея. Резистор R2 предназначен для ограничения тока на аноде подсветки дисплея.
Таблица 1 – Аппаратные соединения
Выводы LCD-дисплея
Выводы ATmega8
Выводы для передачи данных D0-D7
Функция инициализации дисплея:
1. Включить питание на LCD-дисплее
2. Необходимо подождать не менее 15 мс, время инициализации включения питания для LCD1602.
3. Отправить команду 0x38 которая переводит LCD-дисплей в 2-строчный, 8-битный режим и 5×8 точек.
4. Отправить одну из команд включения курсора дисплея (0x0E, 0x0C).
5. Отправить команду 0x06 (сдвиг курсора вправо).
void LCD_Init (void) /* LCD Initialize function */ < LCD_Command_Dir = 0xFF; /* Make LCD command port direction as o/p */ LCD_Data_Dir = 0xFF; /* Make LCD data port direction as o/p */ _delay_ms(20); /* LCD Power ON delay always >15ms */ LCD_Command (0x38); /* Initialization of 16X2 LCD in 8bit mode */ LCD_Command (0x0C); /* Display ON Cursor OFF */ LCD_Command (0x06); /* Auto Increment cursor */ LCD_Command (0x01); /* clear display */ LCD_Command (0x80); /* cursor at home position */ >
Теперь, когда LCD–дисплей инициализирован, он готов принимать данные для отображения.
Функция записи команд (инструкций):
1. Отправим значение команды на порт передачи данных LCD1602.
2. Установим вывод RS на «низкий» уровень, RS = 0 (регистр команд).
3. Установим вывод RW на «низкий» уровень, RW = 0 (операция записи)
4. Подадим импульс от «высокого» до «низкого» на выводе Enable (E) с минимальной задержкой 450 нс.
Когда мы подаем разрешающий импульс, LCD-дисплей фиксирует данные, имеющиеся на выводах D0 – D7, и выполняет их как команду, поскольку RS — это регистр команд.
void LCD_Command(unsigned char cmnd) < LCD_Data_Port= cmnd; LCD_Command_Port &= ~(1<Функция записи данных:
1. Отправим команду на порт передачи данных.
2. Установим вывод RS на «высокий» уровень, RS = 1 (регистр данных)
3. Установим вывод RW на «низкий» уровень, RW = 0 (операция записи)
4. Подадим импульс от «высокого» до «низкого» на выводе Enable (E).
Когда мы подаем разрешающий импульс, LCD-дисплей фиксирует имеющиеся данные (на выводах D0-D7) и отображает их на матрице 5x8, поскольку RS - это регистр данных.
void LCD_Char (unsigned char char_data) /* LCD data write function */ < LCD_Data_Port = char_data; LCD_Command_Port |= (1<Функция отображения строки:
Эта функция принимает строку (массив символов) и отправляет по одному символу в функцию данных LCD-дисплея до конца строки. Цикл for используется для отправки символа на каждой итерации. Символ NULL указывает на конец строки.
void LCD_String (char *str) < int i; for(i=0;str[i]!=0;i++) /* send each char of string till the NULL */ < LCD_Char (str[i]); /* call LCD data write */ >>1. Задержка включения LCD-дисплея. После включения LCD1602 мы не можем немедленно отправлять на него команды, поскольку ему требуется время на инициализацию 15 мс. Поэтому при программировании нам нужно позаботиться о том, чтобы обеспечить достаточную задержку включения питания (> 15 мс), а затем отправлять команды на LCD-дисплей.
2. После проверки команд LCD1602 требуется время (в микросекундах) для их выполнения. Но для команды 0x01 (т.е. очистить отображение) выполнение занимает 1,64 мс. Следовательно, после отправки команды 0x01 необходимо обеспечить достаточную задержку (> 1,63 миллисекунды).
#define F_CPU 8000000UL /* Define CPU Frequency e.g. here 8MHz */ #include /* Include AVR std. library file */ #include /* Include inbuilt defined Delay header file */ #define LCD_Data_Dir DDRB /* Define LCD data port direction */ #define LCD_Command_Dir DDRC /* Define LCD command port direction register */ #define LCD_Data_Port PORTB /* Define LCD data port */ #define LCD_Command_Port PORTC /* Define LCD data port */ #define RS PC0 /* Define Register Select (data/command reg.)pin */ #define RW PC1 /* Define Read/Write signal pin */ #define EN PC2 /* Define Enable signal pin */ void LCD_Command(unsigned char cmnd) < LCD_Data_Port= cmnd; LCD_Command_Port &= ~(1<void LCD_Char (unsigned char char_data) /* LCD data write function */ < LCD_Data_Port= char_data; LCD_Command_Port |= (1< void LCD_Init (void) /* LCD Initialize function */ < LCD_Command_Dir = 0xFF; /* Make LCD command port direction as o/p */ LCD_Data_Dir = 0xFF; /* Make LCD data port direction as o/p */ _delay_ms(20); /* LCD Power ON delay always >15ms */ LCD_Command (0x38); /* Initialization of 16X2 LCD in 8bit mode */ LCD_Command (0x0C); /* Display ON Cursor OFF */ LCD_Command (0x06); /* Auto Increment cursor */ LCD_Command (0x01); /* Clear display */ LCD_Command (0x80); /* Cursor at home position */ > void LCD_String (char *str) /* Send string to LCD function */ < int i; for(i=0;str[i]!=0;i++) /* Send each char of string till the NULL */ < LCD_Char (str[i]); >> void LCD_String_xy (char row, char pos, char *str)/* Send string to LCD with xy position */ < if (row == 0 && pos<16) LCD_Command((pos & 0x0F)|0x80); /* Command of first row and required position<16 */ else if (row == 1 && pos<16) LCD_Command((pos & 0x0F)|0xC0); /* Command of first row and required position<16 */ LCD_String(str); /* Call LCD string function */ >void LCD_Clear() < LCD_Command (0x01); /* clear display */ LCD_Command (0x80); /* cursor at home position */ >int main() < LCD_Init(); /* Initialize LCD */ LCD_String("Hello World"); /* write string on 1st line of LCD*/ LCD_Command(0xC0); /* Go to 2nd line*/ LCD_String("8 bit"); /* Write string on 2nd line*/ return 0; После загрузки прошивки на дисплее LCD1602 мы увидим следующий результат, показанный на рисунке 3.
Хорошим тоном программирования является создание отдельной библиотеки для нашего ЖК-дисплея.
Расшифровка наиболее употребляемых команд, посылаемых от микроконтроллера в дисплей LCD1602 (HD44780) приведена в таблицах 2,3.
Таблица 2 – Расшифровка наиболее употребляемых команд, посылаемых от микроконтроллера в дисплей LCD1602 (HD44780)
Команда ЖКИ
HEX-код
Выполняемые действия
Время вып., мкс
