Безопасность

Подключение lcd к ардуино. Символьные и графические LCD - в чем разница? Описание протокола I2C

Подключение lcd к ардуино. Символьные и графические LCD - в чем разница? Описание протокола I2C

За все время увлечения электроникой мне довелось пользоваться ЖКД от нескольких производителей - DataVision, WINSTAR, Uniworld Technology Corp . Они отличались типом контроллера, количеством выводов и длинною строк, но при этом все имели одинаковую схему подключения, систему команд и обслуживались одной и той же программой со стороны микроконтроллера. Поэтому, хотя речь сейчас пойдет о дисплее WH0802A фирмы WINSTAR , все ниже сказанное применимо к символьным ЖК-дисплеям и других фирм.

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

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

У некоторых дисплеев есть два дополнительных вывода – выводы подсветки +LED и –LED. Причем если выводы есть – это еще не означает что есть и подсветка. Как и наоборот. У моего дисплея подсветка есть, а выводов управления нет.

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

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

Это типовая схема включения символьных LCD. Схему управления подсветкой дисплея мы задействовать не будем, но я ее на всякий случай нарисовал.

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

Подав питание на схему, нужно покрутить регулятор контраста (резистор R1). Если на экранчике появилась верхняя строка, значит, он живой и самое время приступать к написанию кода. На начальном этапе мы будем использовать 8-ми разрядную шину. Чтобы получить первые результаты, нам понадобится написать две функции – функцию записи данных и функцию записи команд. Отличаются они всего одной строчкой – когда записываются данные, сигнал RS должен быть 1, когда записывается команда, RS должен быть 0. Функции чтения мы пока использовать не будем, поэтому сигнал R/W будет всегда 0.

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

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

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

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

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

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

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

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

#define F_CPU 8000000
#define _delay_us(us) __delay_cycles ((F_CPU / 1000000) * (us));
#define _delay_ms(ms) __delay_cycles ((F_CPU / 1000) * (ms));

//функция записи команды
void LcdWriteCom(unsigned char data)
{
ClearBit(PORT_SIG, RS); // устанавливаем RS в 0
PORT_DATA = data; // выводим данные на шину
SetBit(PORT_SIG, EN); // устанавливаем Е в 1
_delay_us (2);
ClearBit(PORT_SIG, EN); // устанавливаем Е в 0
_delay_us(40);

//функция записи данных

void LcdWriteData(unsigned char data)
{
SetBit(PORT_SIG, RS); //устанавливаем RS в 1
PORT_DATA = data; //выводим данные на шину
SetBit(PORT_SIG, EN); //устанавливаем Е в 1
_delay_us (2);

ClearBit(PORT_SIG, EN); // устанавливаем Е в 0

Delay_us(40);
}

int main(void )
{
while (1);
return 0;
}

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

Любой ЖК-дисплей перед использованием нужно инициализировать. Процесс инициализации обычно описан в datasheet`е на контроллер дисплея. Но даже если там и нет информации, последовательность, скорее всего, будет такая.

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

2. Ждем >40 мс

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

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

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

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

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

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

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

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

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

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


6. Ждем > 1,5 ms

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

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

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

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

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

Данная статья подробно с изображениями рассказывает, как подключить LCD к Arduino и отобразить информацию.

Дисплеи 1602 имеют два различных исполнения :

Жёлтая подсветка с чёрными буквами
- либо (это бывает гораздо чаще) синяя подсветка с белыми.

Размерность дисплеев на HD44780 контроллере бывает самой разной, а управляются они одинаково. Наиболее распространённые из размерностей – 16 на 02 (то есть по 16 символов в двух строках) или 20 на 04. Сами же символы имеют разрешение в 5 на 8 точек.

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

На дисплее есть 16-PIN разъём для подключения. Выводы имеют маркировку с тыльной стороны платы , она следующая:

1 (VSS) – питание на минус для контроллера.
2 (VDD) – питание на плюс для контроллера.
3 (VO) – настройки управления контрастом.
4 (RS) – выбор для регистра.
5 (R/W) – чтение и запись, в частности, запись при соединении с землёй.
6 (E) – активация (enable).
7–10 (DB0-DB3) – младшие биты от восьмибитного интерфейса.
11–14 (DB4-DB7) – старшие биты от интерфейса
15 (A) – положительный анод на питание подсветки.
16 (K) – отрицательный катод на питание подсветки.

Шаг 2: Подключаем ЖК-дисплей

Перед тем как подключать дисплей и передавать на него информацию, стоит проверить его работоспособность. Сперва подайте напряжение на VSS и VDD контроллер, запитайте подсветку (A, K), далее настройте контрастность. Для таких настроек подойдёт потенциометр с 10 кОм, форма его не важна. На крайние ноги подают +5V и GND, а ножку по центру соединяют с VO выводом.

Когда на схему подаётся питание, нужно добиться необходимого контраста, если он настраивается неправильно, то и изображение на экране видно не будет. Чтобы настроить контраст, нужно «поиграть» с потенциометром. Когда схема будет собрана правильно и контраст настроен верно, верхняя строка на экране должна заполниться прямоугольниками.

Чтобы дисплей работал, применяется встроенная в Arduino IDE среду специальная библиотека LiquidCrystal.h, о которой я напишу ниже. Он может действовать в 8-битном и в 4-битном режиме. В первом варианте применяют лишь младшие и старшие биты (BB0-DB7), во втором – только младшие (BB4-DB7).

Но применение 8-битного режима в этом дисплее – неправильное решение, преимущества в скорости почти нет, поскольку частота обновления у него всегда меньше 10 раз за секунду. Чтобы выводился текст, надо присоединить выводы DB7, DB6, DB5, DB4, E и RS к выводам контроллера. Присоединять их допустимо к любым пинам Arduino, главное – задание верной последовательности в коде.

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

Рассмотренная выше схема подключения не всегда хороша, т. к. на Arduino занимается минимум шесть цифровых выходов.

Шаг 3: Схема обхода

Изучим вариант, как обойти это и обойтись только двумя. Нужен добавочный модуль-конвертор для LCD в IIC/I2C. Как он припаивается к дисплею и присоединяется к Arduino, можно увидеть на изображениях ниже.

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

Шаг 4: Библиотека LiquidCrystal.h

Библиотеку LiquidCrystal.h можно скачать с официального ресурса - . Также вы можете скачать ниже по ссылкам:

Скетч

После того, как вы скачали архив замените папку LiquidCrystal в папке с библиотеками вашего каталога установки Arduino.

Вы можете увидеть примерный скетч в Файл -> Примеры -> LiquidCrystal -> HelloWorld_SPI (File -> Examples -> LiquidCrystal -> HelloWorld_SPI).

На этом наш очередной урок завершен. Желаем вам качественных проектов!

Сегодня попробуем остановиться на выводе на текстовый дисплей. Наиболее популярным является чип HD44780 (или совместимый с ним KS0066). Перечислим их плюсы и минусы:

Плюсы:

  1. Невысокая цена.
  2. Простота программирования, код будет одинаков для любой модели.
  3. Многообразие моделей - наиболее распространённые: 8x1, 16x2, 20x4. Также можно встретить довольно экзотические модели 40x4, т.е. четыре строки по 40 символов в каждой.
  4. Возможность подключить несколько дисплеев к одной Arduino.
  5. Возможность задавать собственные символы.

Минусы:

  1. Далеко не все дисплеи поддерживают русские символы. Подробнее надо смотреть в описании к конкретному дисплею.
  2. Подключение без использования I2C-шины требует использования 10-16 проводов, что очень плохо. с I2C - 4 провода.

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

Давайте попробуем.

Что нам понадобится.

  1. Arduino (Я взял модель Nano)
  2. Дисплей на чипе HD44780 с модулем I2C или без него (тогда понадобится отдельно плата LC1602 IIC) - в нашем случае 16x2 без I2C модуля
  3. Резистор на 10Ком (Если нужно ручное управление подсветкой).
  4. Потенциометр (Если нужно ручное управление подсветкой).
  5. Макетная плата Breadboard.
  6. Библиотека LiquidCrystal_I2C. http://www.ansealk.ru/files/LiquidCrystal_V1.2.1.zip

Небольшое отступление №1: Как отличить дисплей с I2C-модулем?

На самом деле все довольно просто. Если, перевернув дисплей мы видим длинную колодку разъемов (как правило 16 штук) то модуля I2C на дисплее нет:

А вот так выглядит дисплей с уже установленным I2C-модулем:

Контакты SCL, SDA, VCC, GND используются для подключения Arduino. Два контакта слева - на картинке они замкнуты перемычкой - нужны для работы подсветки.

Если модуль не подключен - придется сделать это самостоятельно. Главное, на что стоит обратить внимание - соединить контакты в правильном порядке. Как правило первый и 16 пины помечены. Иногда бывает, что 15-16 контакты, через которые осуществляется управление подсветкой, могут располагаться перед первым (в этом случае они будут пронумерованы). На самом же модуле первый пин также может быть обозначен не цифрой, а квадратом вокруг самого пина.

Схемы:

Соберем следующую схему:

Обращу внимание на следующие моменты:

  1. Если вам попался дисплей с уже припаянным I2C-модулем, то провода, помеченные серым, не понадобятся. В остальном - ничего не меняется.
  2. Если мы не хотим менять яркость дисплея - то схема упростится:

как заметили, два пина на I2C-модуле с маркировкой LED отвечают за подсветку дисплея. Если не хотим использовать управление яркостью - их просто можно замкнуть.

Теперь давайте разберем код.

Тут почти все нам должно быть знакомо. В строке 5 указываем адрес устройства. В строках 16 и 17 - количество символов в строке и количество строк. В строках 20-22 - Создаем объект для работы с дисплеем и описываем параметр работы с ним.

Небольшое отступление №2: Как узнать адрес I2C-устройства?

В большинстве своем адрес можно посмотреть в даташите к микросхеме, на которой построено I2C-устройство. Если же такой возможности нет вот ссылка на архив со скетчем и схемами - http://www.ansealk.ru/files/Arduino_lcd_i2c.zip который определяет адреса всех устройств, подключенных по I2C-шине. Достаточно только подключить устройство к Arduino, загрузить скетч, открыть консоль и увидеть адрес.

Тут мы видим функцию, которая, собственно, и будет заниматься выводом на дисплей. Принцип вывода примерно такой:

Задаём позицию начала вывода функцией setCursor()

Печатаем строку функцией print()

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

Таким образом у нас на экране в первой строке появится надпись "Test LCD1602", а во второй будет указано разрешение дисплея и счетчик, показывающий, сколько циклов отработал наш скетч.

Но, если нам надо будет выводить много значений переменных на экран, этот метод не совсем удобен. Дело в том, что процедура вывода на дисплей - очень энергоёмкая и медленная, а вывод мы делаем в этой функции аж 7 раз. Гораздо проще будет заранее сформировать строку заранее, а затем вывести её целиком. В этом нам поможет функция форматированного ввода sprintf().

Небольшое отступление №3: Функция форматированного ввода sprintf().

В Языке C существует несколько очень удобных функций для вывода строк - они называются функциями форматированного вывода - printf (от слов print и format). В нашем конкретном случае нас интересует функция sprintf, которая не выводит ничего на экран, а формирует строку для последующего вывода. Выглядит она примерно так:

sprintf (str , "Строка %d для вывода ", i );

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

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

Что же такое шаблоны? Любой шаблон начинается символом "%" и заканчивается одним из десяти (в случае Arduino - семи) символов типа. Между ними может быть указано довольно много информации о том, как выводить значение, а может быть не указано и ничего.

Давайте разберем что же может быть в шаблоне. В общем случае шаблон имеет такой вид:

%[флаг ][ширина ][.точность ]типа

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

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

Символ Значение
c Один символ
s Строка символов
d,i Целое десятичное со знаком
o Целое восьмеричное
u Целое десятичное без знака
x, X Целое шестнадцатеричное
p Указатель (в шестнадцатеричном виде)
f Дробное число в фиксированном формате
e, E Дробное число в научном формате
g, G Дробное число в научном или фиксированном формате

Серым помечены те типы, которые не применимы при работе с Arduino. Таким образом, для вывода строки надо указать "%s", а для вывода целого числа - "%d".

Далее рассмотрим поле ширины. Число в нем указывает минимальную ширину поля, в котором будет выведен шаблон. Если размер значения в переменной меньше - поле будет добито пробелами, если больше - запись выйдет за пределы поля. Таким образом шаблон "%6d" для числа 385 выведет 385 (обратим внимание на три пробела перед числом).

Спецификатор точности всегда начинается с точки и следующее за ним число указывает различные действия в зависимости от типа значения. Для типов "d,o,u,x" он укажет минимальное количество символов, которое должно появится при обработке. Для типа "f" - число знаков после запятой. Для типа "s" - максимальное число символов стоки, который будут выведены. Например, "%6.1f" для числа 34.2345 выведет "34.1" (обращу внимание, что точка также считается знаком и перед числом будет присутствовать два пробела). Или шаблон "%.3s" от строки "точность" выведет только первые три символа - "точ".

Флаг позволяет изменить отображение выводимого значения:

Более подробно о шаблонах функции printf можно прочитать интернете. Здесь же я дал краткий обзор наиболее часто используемых возможностей.

Таким образом, наша функция вывода, переписанная с учетом использования форматированного вывода будет выглядеть следующим образом:

Заметим, что в строках 33 и 37 мы формируем целую строку для вывода, а в строках 34 и 38 - выводим их.

Наконец, наши любимые функции setup и loop.

В строке 47 мы задаем разрешение дисплея, в строке 48 - включим подсветку (яркость которой можно отрегулировать потенциометром). В строке 49 установим счетчик циклов в ноль. Увеличивать его будем на единицу в 37-й строке при выводе (помните конструкцию count++?). Наконец, в строке 56 вызываем рассмотренную раннее функцию вывода на дисплей. Все.

Что можно поменять или улучшить?

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

Все эти вопросы я тут не рассматриваю, так как они выходят за рамки обзора для начинающих.

А на сегодня у меня все.

Arduino. Подключаем LCD-дисплей

26 оценок, Средняя оценка: 5 из 5
  • Модуль FC-113 сделан на базе микросхемы PCF8574T, которая представляет собой 8-битный сдвиговый регистр - «расширитель» входов-выходов для последовательной шины I2C. На рисунке микросхема обозначена DD1.
  • R1 - подстроечный резистор для регулировки контрастности ЖК дисплея.
  • Джампер J1 используется для включения подсветки дисплея.
  • Выводы 1…16 служат для подключения модуля к выводам LCD дисплея.
  • Контактные площадки А1…А3 нужны для изменения адреса I2C устройства. Запаивая соответствующие перемычки, можно менять адрес устройства. В таблице приведено соответствие адресов и перемычек: "0" соответствует разрыву цепи, "1" - установленной перемычке. По умолчанию все 3 перемычки разомкнуты и адрес устройства 0x27 .

2 Схема подключения ЖК дисплея к Arduino по протоколу I2C

Подключение модуля к Arduino осуществляется стандартно для шины I2C: вывод SDA модуля подключается к аналоговому порту A4, вывод SCL - к аналоговому порту A5 Ардуино. Питание модуля осуществляется напряжением +5 В от Arduino. Сам модуль соединяется выводами 1…16 с соответствующими выводами 1…16 на ЖК дисплее.


3 Библиотека для работы по протоколу I2C

Теперь нужна библиотека для работы с LCD по интерфейсу I2C. Можно воспользоваться, например, вот этой (ссылка в строке "Download Sample code and library").

Скачанный архив LiquidCrystal_I2Cv1-1.rar разархивируем в папку \libraries\ , которая находится в директории Arduino IDE.

Библиотека поддерживает набор стандартных функций для LCD экранов:

Функция Назначение
LiquidCrystal() создаёт переменную типа LiquidCrystal и принимает параметры подключения дисплея (номера выводов);
begin() инициализация LCD дисплея, задание параметров (кол-во строк и символов);
clear() очистка экрана и возврат курсора в начальную позицию;
home() возврат курсора в начальную позицию;
setCursor() установка курсора на заданную позицию;
write() выводит символ на ЖК экран;
print() выводит текст на ЖК экран;
cursor() показывает курсор, т.е. подчёркивание под местом следующего символа;
noCursor() прячет курсор;
blink() мигание курсора;
noBlink() отмена мигания;
noDisplay() выключение дисплея с сохранением всей отображаемой информации;
display() включение дисплея с сохранением всей отображаемой информации;
scrollDisplayLeft() прокрутка содержимого дисплея на 1 позицию влево;
scrollDisplayRight() прокрутка содержимого дисплея на 1 позицию вправо;
autoscroll() включение автопрокрутки;
noAutoscroll() выключение автопрокрутки;
leftToRight() задаёт направление текста слева направо;
rightToLeft() направление текста справа налево;
createChar() создаёт пользовательский символ для LCD-экрана.

4 Скетч для вывода текста на LCD экран по шине I2C

Откроем образец: Файл Образцы LiquidCrystal_I2C CustomChars и немного его переделаем. Выведем сообщение, в конце которого будет находиться мигающий символ. В комментариях к коду прокомментированы все нюансы скетча.

#include // подключаем библиотеку Wire #include // подключаем библиотеку ЖКИ #define printByte(args) write(args); // uint8_t heart = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // битовая маска символа «сердце» LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаём адрес 0x27 для LCD дисплея 16x2 void setup() { lcd.init(); // инициализация ЖК дисплея lcd.backlight(); // включение подсветки дисплея lcd.createChar(3, heart); // создаём символ «сердце» в 3 ячейке памяти lcd.home(); // ставим курсор в левый верхний угол, в позицию (0,0) lcd.!"); // печатаем строку текста lcd.setCursor(0, 1); // перевод курсора на строку 2, символ 1 lcd.print(" i "); // печатаем сообщение на строке 2 lcd.printByte(3); // печатаем символ «сердце», находящийся в 3-ей ячейке lcd.print(" Arduino "); } void loop() { // мигание последнего символа lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print("\t"); delay(500); lcd.setCursor(13, 1); // перевод курсора на строку 2, символ 1 lcd.print(" "); delay(500); }

Кстати, символы, записанные командой lcd.createChar(); , остаются в памяти дисплея даже после выключения питания, т.к. записываются в ПЗУ дисплея 1602.

5 Создание собственных символов для ЖК дисплея

Немного подробнее рассмотрим вопрос создания собственных символов для ЖК экранов. Каждый символ на экране состоит из 35-ти точек: 5 в ширину и 7 в высоту (+1 резервная строка для подчёркивания). В строке 6 приведённого скетча мы задаём массив из 7-ми чисел: {0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0} . Преобразуем 16-ричные числа в бинарные: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Эти числа - не что иное, как битовые маски для каждой из 7-ми строк символа, где "0" обозначают светлую точку, а "1" - тёмную. Например, символ сердца, заданный в виде битовой маски, будет выглядеть на экране так, как показано на рисунке.

6 Управление ЖК экраном по шине I2C

Загрузим скетч в Arduino. На экране появится заданная нами надпись с мигающим курсором в конце.


7 Что находится «за» шиной I2C

В качестве бонуса рассмотрим временную диаграмму вывода латинских символов "A", "B" и "С" на ЖК дисплей. Эти символы имеются в ПЗУ дисплея и выводятся на экран просто передачей дисплею их адреса. Диаграмма снята с выводов RS, RW, E, D4, D5, D6 и D7 дисплея, т.е. уже после преобразователя FC-113 «I2C параллельная шина». Можно сказать, что мы погружаемся немного «глубже» в «железо».


Временная диаграмма вывода латинских символов "A", "B" и "С" на LCD дисплей 1602

На диаграмме видно, что символы, которые имеются в ПЗУ дисплея (см. стр.11 даташита, ссылка ниже), передаются двумя полубайтами, первый из которых определяет номер столбца таблицы, а второй - номер строки. При этом данные «защёлкиваются» по фронту сигнала на линии E (Enable), а линия RS (Register select, выбор регистра) находится в состоянии логической единицы, что означает передачу данных. Низкое состояние линии RS означает передачу инструкций, что мы и видим перед передачей каждого символа. В данном случае передаётся код инструкции возврата каретки на позицию (0, 0) ЖК дисплея, о чём также можно узнать, изучив техническое описание дисплея.

И ещё один пример. На этой временной диаграмме показан вывод символа «Сердце» на ЖК дисплей.


Опять, первые два импульса Enable соответствуют инструкции Home() (0000 0010 2) - возврат каретки на позицию (0; 0), а вторые два - вывод на ЖК дисплей хранящийся в ячейке памяти 3 10 (0000 0011 2) символ «Сердце» (инструкция lcd.createChar(3, heart); скетча).

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

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, а также были представлены примеры программ для работы с этим дисплеем. Он действительно является в своей категории одним из лучших, не просто так его выбирают тысячи радиолюбители для своих проектов!