Подключить LCD1602 к Arduino (или любой другой LCD на базе микросхем HD44780) не всегда удобно, потому что используются как минимум 6 цифровых выходов. LCD I2C модули на базе микросхем PCF8574 позволяют подключить символьный дисплей к плате Arduino всего по двум сигнальным проводам (SDA и SCL).
- 1 PCF8574 — I2C модуль для LCD на базе HD44780
- 2 Установка библиотеки LiquidCrystal I2C
- 3 Описание методов библиотеки LiquidCrystal I2C
- 4 Подключение LCD1602 к Arduino
- 5 Создание собственных символов
- 6 Проблемы подключения LCD1602 к Arduino по I2C
- 7 Материалы
- 8 Купить LCD Adapter PCF8574 на AliExpress
- 9 Похожие записи
PCF8574 — I2C модуль для LCD на базе HD44780
Микросхема PCF8574/PCF8574T обеспечивает расширение портов ввода/вывода для контроллеров через интерфейс I2C и позволит легко решить проблему нехватки цифровых портов. При использовании модуля как расширитель портов ввода/вывода следует учитывать то, что вывод Р3 имеет инверсный выход с открытым коллектором.
Микросхема может использоваться для управления ЖК дисплеем под управлением контроллера HD44780, в 4-х битном режиме. Для этой цели на плате установлена микросхема PCF8574, которая является преобразователем шины I2C в параллельный 8 битный порт.
Плата модуля разведена таким образом, чтобы ее можно было сразу подключить к ЖКИ. На вход подается питание и линии I2C. На плате сразу установлены подтягивающие резисторы на линиях SCL и SDA, потенциометр для регулировки контрастности и питание самого дисплея. Джампер справа включает/отключает подсветку.
Установка библиотеки LiquidCrystal I2C
Для работы с данным модулем необходимо установить библиотеку LiquidCrystal I2C. Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.
Библиотеку можно установить из самой среды следующим образом:
- В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…

- В строке поиска вводим «LiquidCrystal I2C», находим библиотеку Фрэнка де Брабандера (Frank de Brabander), выбираем последнюю версию и кликаем Установить.

- Библиотека установлена (INSTALLED).

Описание методов библиотеки LiquidCrystal I2C
LiquidCrystal_I2C(uint8_t, uint8_t, uint8_t)
Конструктор для создания экземпляра класса, первый параметр это I2C адрес устройства, второй — число символов, третий — число строк.
LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows);
init()
Инициализация ЖК-дисплея.
void init();
backlight()
Включение подсветки дисплея.
void backlight();
setCursor(uint8_t, uint8_t)
Установка позиции курсора.
void setCursor(uint8_t, uint8_t);
clear()
Возвращает курсор в начало экрана.
void clear();
home()
Возвращает курсор в начало экрана и удаляет все, что было на экране до этого.
void home();
write(uint8_t)
Позволяет вывести одиночный символ на экран.
#if defined(ARDUINO) && ARDUINO >= 100 virtual size_t write(uint8_t); #else virtual void write(uint8_t); #endif
cursor()
Показывает курсор на экране.
void cursor();
noCursor()
Скрывает курсор на экране.
void noCursor();
blink()
Курсор мигает (если до этого было включено его отображение).
void blink();
noBlink()
Курсор не мигает (если до этого было включено его отображение).
void noBlink();
display()
Позволяет включить дисплей.
void display();
noDisplay()
Позволяет отключить дисплей.
void noDisplay();
scrollDisplayLeft()
Прокручивает экран на один знак влево.
void scrollDisplayLeft();
scrollDisplayRight()
Прокручивает экран на один знак вправо.
void scrollDisplayRight();
autoscroll()
Позволяет включить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void autoscroll();
noAutoscroll()
Позволяет выключить режим автопрокручивания. В этом режиме каждый новый символ записывается в одном и том же месте, вытесняя ранее написанное на экране.
void noAutoscroll();
leftToRight()
Установка направление выводимого текста — слева направо.
void leftToRight();
rightToLeft()
Установка направление выводимого текста — справа налево.
void rightToLeft();
createChar(uint8_t, uint8_t[])
Создает символ. Первый параметр — это номер (код) символа от 0 до 7, а второй — массив 8 битовых масок для создания черных и белых точек.
void createChar(uint8_t, uint8_t[]);
Подключение LCD1602 к Arduino
Модуль оборудован четырех-пиновым разъемом стандарта 2.54мм
- SCL: последовательная линия тактирования (Serial CLock)
- SDA: последовательная линия данных (Serial DAta)
- VCC: «+» питания
- GND: «-» питания
Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся
| Arduino Mega | Arduino Uno/Nano/Pro Mini | LCD I2C модуль | Цвет проводов на фото |
|---|---|---|---|
| GND | GND | GND | Черный |
| 5V | 5V | VCC | Красный |
| 20 (SDA) | A4 | SDA | Зелёный |
| 21 (SCL) | A5 | SCL | Жёлтый |
Схема подключения LCD1602 к Arduino по I2C
Пример скетча
/*
Добавляем необходимые библиотеки
*/
#include <LiquidCrystal_I2C.h>
/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
/*
Устанавливаем курсор на первую строку и нулевой символ.
*/
lcd.setCursor(0, 0);
/*
Выводим на экран строку
*/
lcd.print(" micro-pi.ru ");
}
void loop()
{
/*
Устанавливаем курсор на вторую строку и 3 символ.
*/
lcd.setCursor(3, 1);
/*
Выводим на экран количество секунд с момента запуска ардуины
*/
lcd.print(millis() / 1000);
delay(1000);
}
Результат
Создание собственных символов
С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера. А вот что делать если нужного символа в памяти контроллера нет? Требуемый символ можно сделать вручную. Данный способ частично, ограничение в 7 символов, поможет решить проблему вывода.
Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.
Пример скетча
/*
Добавляем необходимые библиотеки
*/
#include <LiquidCrystal_I2C.h>
extern uint8_t bell[8];
extern uint8_t note[8];
extern uint8_t clock[8];
extern uint8_t heart[8];
extern uint8_t duck[8];
extern uint8_t check[8];
extern uint8_t cross[8];
extern uint8_t retarrow[8];
/*
Устанавливаем ЖК-дисплей по адресу 0x27, 16 символов и 2 строки
*/
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
/*
Инициализируем ЖК-дисплей
*/
lcd.init();
/*
Включаем подсветку дисплея
*/
lcd.backlight();
/*
Добавляем символы
*/
lcd.createChar(0, bell);
lcd.createChar(1, note);
lcd.createChar(2, clock);
lcd.createChar(3, heart);
lcd.createChar(4, duck);
lcd.createChar(5, check);
lcd.createChar(6, cross);
lcd.createChar(7, retarrow);
/*
Устанавливаем курсор на первую строку и нулевой символ.
*/
lcd.home();
/*
Выводим на экран строку
*/
lcd.print("Hello world...");
}
void loop()
{
static char i = 0;
/*
Устанавливаем курсор на вторую строку и 'i' символ.
*/
lcd.setCursor(i, 1);
/*
Выводим на экран символ с номером 'i'
*/
lcd.print(i);
/*
Ждём секунду
*/
delay(1000);
if (i == 7)
{
/*
Очищаем вторую строку после вывода всех символов
*/
i = 0;
lcd.setCursor(0, 1);
for (char j = 0; j < 16; j++)
{
lcd.print(' ');
}
}
else
{
i++;
}
}
/*
..O..
.OOO.
.OOO.
.OOO.
OOOOO
.....
..O..
*/
uint8_t bell[8] = {
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b00000,
0b00100
};
/*
...O.
...OO
...O.
.OOO.
OOOO.
.OO..
.....
*/
uint8_t note[8] = {
0b00010,
0b00011,
0b00010,
0b01110,
0b11110,
0b01100,
0b000000000
};
/*
.....
.OOO.
O.O.O
O.OOO
O...O
.OOO.
.....
*/
uint8_t clock[8] = {
0b00000,
0b01110,
0b10101,
0b10111,
0b10001,
0b01110,
0b00000
};
/*
.....
.O.O.
OOOOO
OOOOO
.OOO.
..O..
.....
*/
uint8_t heart[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
/*
.....
.OO..
OOO.O
.OOOO
.OOOO
..OO.
.....
*/
uint8_t duck[8] = {
0b00000,
0b01100,
0b11101,
0b01111,
0b01111,
0b00110,
0b00000
};
/*
.....
....O
...OO
O.OO.
OOO..
.O..O
.....
*/
uint8_t check[8] = {
0b00000,
0b00001,
0b00011,
0b10110,
0b11100,
0b01001,
0b00000
};
/*
.....
OO.OO
.OOO.
..O..
.OOO.
OO.OO
.....
*/
uint8_t cross[8] = {
0b00000,
0b11011,
0b01110,
0b00100,
0b01110,
0b11011,
0b00000
};
/*
....O
....O
..O.O
.O..O
OOOOO
.O..O
..O..
*/
uint8_t retarrow[8] = {
0b00001,
0b00001,
0b00101,
0b01001,
0b11111,
0b01001,
0b00100
};
Результат
Проблемы подключения LCD1602 к Arduino по I2C
Если после загрузки скетча у вас не появилось никакой надписи на дисплее, попробуйте выполнить следующие действия:
- Можно регулировать контрастность индикатора потенциометром. Часто символы просто не видны из-за режима контрастности и подсветки.

- Проверьте правильность подключения контактов, подключено ли питание подсветки. Если вы использовали отдельный I2C переходник, то проверьте еще раз качество пайки контактов.
- Проверьте правильность I2C адреса. Попробуйте сперва поменять в скетче адрес устройства с 0x20 до 0x27 для PCF8574 или с 0x38 до 0x3F для PCF8574A. Если и это не помогло, можете запустить скетч I2C сканера, который просматривает все подключенные устройства и определяет их адрес методом перебора. Для изменения адресации необходимо установить джамперы в нужное положение, тем самым притянуть выводы A0, A1, A2 к положительному либо отрицательному потенциалу. На плате положения промаркированы.
-
Если экран все еще останется нерабочим, попробуйте подключить LCD обычным образом.
Материалы
datasheets PCF8574.pdf
LiquidCrystal_I2C












