Найти тему
Реальная Сталь

Ардуино. Работа с символьными ЖК дисплеями 1602 ,2004 по I2C. Команды LCD.

На канале есть описание вывода информации на LCD без библиотеки по четырем проводам данных и три провода управления. Итого требуется 7 ножек Ардуино. Достоинство - экономия памяти более 30 процентов и быстрая работа.

Если нам торопиться не куда, есть память и самое главное нужно экономить Пины Ардуино, целесообразно вывод информации осуществить по протоколу I²C.

Протокол I²C  — последовательная асимметричная шина для связи между интегральными схемами. Использует две двунаправленные линии связи (SDA и SCL), применяется для соединения низкоскоростной периферии микроконтроллера, соответственно Ардуино.

Аппаратный способ в Ардуино заложен на этапе изготовления. Главным козырем является простота реализации за счет наличия готовых библиотек.

Платы Ардуино используют два пина для работы по интерфейсу I²C . SDA соответствует аналоговый порт A4, а SCL соответствует аналоговый порт A5.
На Ardunio Mega
SDA — 20 пин, SCL — 21 пин. Для работы написана библиотека, качаем LiquidCrystal_I2C.h

Распаковываем архив, папку LiquidCrystal_I2C_V112, устанавливаем в Arduino IDE или копируем в папку, обычно по пути C:\Users\имя\Documents\Arduino\libraries . Пуск--> Документы--> Arduino--> libraries

Понадобятся интерфейсный модуль I2C для LCD, Знакогенерирующий дисплей LCD, любое Ардуино.

.
.

Впаиваем, или приобретаем готовый ЛСД с интерфейсом 2ИС.

.
.
.
.

Собираем схему. Взял шлейф от старенького компа.

.
.

Пишем простенький скетч для тестирования. Скетч для копирования, проверен.

// #include <Wire.h> // Подключаем библиотеку для работы с шиной I2C не обязательно

#include <LiquidCrystal_I2C.h> // Подключаем библиотеку для работы с LCD дисплеем по шине I2C

LiquidCrystal_I2C lcd (0x27, 20, 4);// ОБЪЕКТ ( АДРЕС_I2C , КОЛ_СТОЛБЦОВ , КОЛ_СТРОК );

// Если надпись не появилась, замените адрес 0x27 на 0x3F

void setup(){

lcd.init(); // Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк)

lcd.backlight(); // Включаем подсветку LCD дисплея

lcd.setCursor(1,0); // первая строка 0, второй знак 1

lcd.print(" Hello World"); // вывод строки здравствуй мир

lcd.setCursor(1,1);

lcd.print(" Welcome to the ");

lcd.setCursor(1,2);

lcd.print("Real Steel channel,");

lcd.setCursor(1,3);

lcd.print("everything is fine");

delay(5000); //задержка 5 сек

lcd.noBacklight(); // Гасим подсветку

lcd.clear(); // очистка дисплея

delay(2000);

lcd.backlight(); // Включаем подсветку LCD дисплея

}

void loop(){

lcd.setCursor(1,0);

lcd.print("Stroka 1 TEST OK");

lcd.setCursor(2,1);

lcd.print("Stroka 2 TEST OK");

lcd.setCursor(3,2);

lcd.print("Stroka 3 TEST OK");

lcd.setCursor(4,3);

lcd.print("Stroka 4 TEST OK");

delay(2000);

lcd.clear();

}

Загружаем.

.
.

Если дисплей засветился, но нет символов, отрегулируйте контрастность, осторожно, не сверните башку регулятору.

5 секунд выводится приветственный банер, затем подсветка гаснет, очищается экран. Через 2 секунды включаем подсветку. Входим в LOOP, где каждые 2 секунды очищаем дисплей и выводим тестовые строки

.
.

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

lcd.setCursor(4,3);

lcd.print("SSSSSSSSSSSSSSStroka 4 TEST OK");

Результат переполнения.
Результат переполнения.

Давайте рассмотрим команды(функции) для работы с дисплеем

  • init(); – Инициализация дисплея. Должна быть первой командой библиотеки LiquidCrystal_I2C после создания объекта.
  • backlight(); – Включение подсветки дисплея.
  • noBacklight(); – Выключение подсветки дисплея.
  • setBacklight(flag); – Управление подсветкой (1 - включить / 0- выключить), используется вместо функций noBacklight и backlight.
  • print(data); – Вывод текста, символов или цифр на экран дисплея. Синтаксис схож с одноимённой функцией класса Serial.
  • clear(); – Очистка дисплея с установкой курсора в положение 0,0 (Занимает много времени!).
  • home(); – Установка курсора в положение 0,0 (Занимает много времени!).
  • display(); – Быстрое включение дисплея (без изменения данных в ОЗУ дисплея).
  • noDisplay(); – Быстрое выключение дисплея (без изменения данных в ОЗУ).
  • blink(); – Включение мигающего курсора с частотой около 1 Гц.
  • noBlink(); – Выключение мигающего курсора.
  • cursor(); – Включение подчеркивания курсора.
  • noCursor(); – Выключение подчеркивания курсора.
  • scrollDisplayLeft(); – Прокрутка дисплея влево. Сдвиг координат дисплея на один столбец влево
  • scrollDisplayRight(); – Прокрутка дисплея вправо. Сдвиг координат дисплея на один столбец вправо
  • leftToRight(); – Указывает сдвигать положение курсора, после вывода очередного символа вправо.
  • rightToLeft(); – Указывает сдвигать положение курсора, после вывода очередного символа влево.
  • noAutoscroll(); – Указывает в дальнейшем выравнивать текст по левому краю от позиции курсора. Как обычно.
  • autoscroll(); – Указывает в дальнейшем выравнивать текст по правому краю от позиции курсора.
  • createChar(num,array); – Запись пользовательского символа в CGRAM дисплея под указанным номером.
  • setCursor(col,row); – Установка курсора в позицию указанную номером колонки и строки.

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

В Setup коварную функцию delay() оставить можно, она не помешает работе основного кода, а в loop ее придется заменить, хотя бы на милис.

В следующей статье выведем температуру на этот дисплей с помощью датчика DS18B20

Работа с ЖК дисплеем без библиотек по параллельной шине ТУТ