- Подключение lcd i2c. Подключение LCD экрана LCM1602 с I2C к Arduino
- Схема подключения:
- Библиотека
- Скетч
- 2 Схема подключения ЖК дисплея к Arduinoпо протоколу I2C
- 3 Библиотека для работыпо протоколу I2C
- 4 Скетч для вывода текстана LCD экран по шине I2C
- 5 Создание собственных символовдля ЖК дисплея
- 6 Управление ЖК экраномпо шине I2C
- 7 Что находится «за»шиной I2C
- 2 Схема подключения ЖК дисплея к Arduinoпо протоколу I2C
- 3 Библиотека для работыпо протоколу I2C
- 4 Скетч для вывода текстана LCD экран по шине I2C
- 5 Создание собственных символовдля ЖК дисплея
- 6 Управление ЖК экраномпо шине I2C
- 7 Что находится «за»шиной I2C
Подключение lcd i2c. Подключение LCD экрана LCM1602 с I2C к Arduino
Пожалуй один из самых популярных экранов на рынке. Собран на популярном контроллере HD44780U. Из названия модели следует, что экран состоит из двух строк по 16 символов. Поддержки русского языка в этой конкретной модели нет.
Шина данных ш2с позволяет по двум проводам подключать до 127 устройств, при чем одновременно. Данный I2C реализован на чипе PCF8574T.
Схема подключения:
Синяя штука — переменное сопротивление, позволяет настроить контрастность экрана.
Перемычка слева — отвечает за подсветку экрана.
Блок из 4х контактов подключается к arduino так:
GND — GND
VCC — 5V
SDA — A4 (если Arduino MEGA, то к D20)
SCL — A5 (если Arduino MEGA, то к D21)
Библиотека
Скетч
У дисплея может быть другой IIC адрес, вместо 0x27 может оказаться 0x3F. Чтобы точно определить адрес можете воспользоваться сканером i2c устройств .
#include
#include
LiquidCrystal_I2C lcd(0x27, 16, 2);
void
setup
() {
lcd.init(); // Инициализируем экран
//включаем подсветку
lcd.backlight();
//Устанавливаем позицию начиная с которой выводится текст.
lcd.setCursor
(2, 0);
//выводим строку 1
lcd.print
(“Hello, World!”
);
//аналогично выводим вторую строку
lcd.setCursor
(1, 1);
lcd.print
(“www.сайт”
);
}
void
loop
() {
}
- Модуль 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
#include
#define printByte(args) write(args); //
uint8_t heart = {0x0,0xa,0x1f,0x1f,0xe,0x4,0x0}; // битовая маска символа «сердце»
LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаём адрес 0x27 для LCD дисплея 16×2
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);
скетча).
Заполучил я тут от хорошего магазина Чип Резистор очередной девайс для изучения и применения в полезных устройствах. Сей девайс оказался заточен для управления ЖК дисплеем под управлением контроллера HD44780, в 4-х битном режиме. Для этой цели на плате установлена микросхема , которая является преобразователем шины I2C в параллельный 8 битный порт.
Плата разведена таким образом, чтобы ее можно было сразу скрестить с ЖК дисплеем. На вход подается питание и линии I2C. На плате сразу установлены подтягивающие резисторы на линиях SCL и SDA, потенциометр для регулировки контрастности и питание самого дисплея.
Джампер справа включает/отключает подсветку. Далее вооружившись тестером была составлена следующая табличка.
После изучения модуля было выявлено что P3
управляет подсветкой. Если джампер установлен, то 1 включает подсветку, а 0 выключает. При снятом джампере подсветка всегда выключена. Далее было принято решение дополнить библиотеку axlib функциями для работы с шиной I2C(программная реализация) и функциями для управления микросхемой PCF8574. В двух словах как работает модуль. Для того чтобы вывести параллельно байт, для этого нужно послать в шину I2C адрес микросхемы (по умолчанию он равен 0x4E. Так же можно менять адрес методом впаивания перемычек на плате и меняя значение трех младших разрядов адреса), затем после получения ACK посылается байт данных. После того как микросхема отвечает ACK, байт появляется на параллельном порту микросхемы. Для управления ЖК дисплеем я взял функции из библиотеки axlib и немного переделал их для работы с шиной I2C.
#include
#include
#include
#include
#define ADD 0x4E // Адрес микросхемы
/*
LCD Микросхема
RS P0
RW P1
EN P2
D4 P4
D5 P5
D6 P6
D7 P7
На ножке P3 подключени подсветка. 1 вкл, 0 выкл.
*/
// Вывод данных
com |= 0x04; // Е в единицу
pcf8574_byte_out(com, ADD); // Вывод данных
com &= 0xFB; // Е в ноль
pcf8574_byte_out(com, ADD); // Вывод данных
}
void init(void)
{
_delay_ms(30);
com(0x30);
_delay_us(40);
com(0x30); // Переход в 4-х битный режим
_delay_us(40); // Задержка для выполнения команды
com(0x30); // Переход в 4-х битный режим
_delay_us(40); // Задержка для выполнения команды
com(0x20); // Переход в 4-х битный режим
_delay_us(40); // Задержка для выполнения команды
com(0x20); // Установка параметров
com(0x80); // Установка параметров
com(0x00); // Выключаем дисплей
com(0x80); // Выключаем дисплей
com(0x00); // Очищаем дисплей
com(0x10); // Очищаем дисплей
com(0x00);
com(0x60); // Устанавливаем режим ввода данных
com(0x00);
com(0xC0); // Включаем дисплей с выбранным курсором
}
void char_out(BYTE data)
{
BYTE data_h = ((data & 0xF0) + 0x09);
BYTE data_l = ((data // Передача старших 4 бит
data_h |= 0x04;
pcf8574_byte_out(data_h, ADD); // Передача старших 4 бит
// Передача старших 4 бит
// Передача младших 4 бит
// Передача младших 4 бит
// Передача младших 4 бит
}
void str_out(BYTE *str)
{
while((*str) != “