Урок 23. Подключение ЖК (LCD) индикаторов к Ардуино. Библиотека LiquidCrystal.

LCD индикатор

В уроке поговорим о знакосинтезирующих жидкокристаллических индикаторах, о подключении их к плате Ардуино и управлении индикаторами с помощью библиотек LiquidCrystal и LiquidCrystalRus.

Предыдущий урок     Список уроков     Следующий урок

Светодиодные семисегментные индикаторы хотя и являются самым дешевым вариантом индикации для электронных устройств, но их применение ограничено двумя существенными недостатками.

  • Практически сложно подключить к микроконтроллеру более 8ми разрядов светодиодных индикаторов. Требуется большое число выводов, значительные токи индикаторов, сложные ключи, низкая частота регенерации и т.п.
  • Невозможно отображать на семисегментных индикаторах символьную информацию.

 

Для вывода текстовой информации или чисел размером более 4 разряда гораздо практичнее использовать жидкокристаллические знакосинтезирующие индикаторы (дисплеи). К их достоинствам следует отнести:

  • удобный для подключения к микроконтроллерам интерфейс;
  • малая потребляемая мощность;
  • низкое напряжение питания;
  • долговечность.

На рынке существует большое число разнообразных жидкокристаллических (LCD) индикаторов разных производителей. Практически все они аналогичны по параметрам, сигналам интерфейсов, командам управления. В данный момент наиболее распространенными ЖК индикаторами на российском рынке являются устройства производства компании Winstar, Тайвань. Я буду ссылаться на индикаторы этой фирмы. Но информация вполне применима и для символьных LCD дисплеев других производителей.

Общие сведения.

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

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

Для управления жидкокристаллической матрицей и организации интерфейса индикатора используется встроенный контроллер  HD44780 или его полные аналоги. Этот контроллер определяет сигналы интерфейса индикатора и команды управления.

HD44780 стал де-факто стандартом для символьных жидкокристаллических (LCD) дисплеев. Техническую документацию по контроллеру  HD44780 в формате PDF можно посмотреть по этой ссылке - HD44780.pdf. Может кому-то больше понравится документация одного из аналогов этого контроллера – SPLC780D. Ссылка в формате PDF – SPLC780.pdf.

Символьные LCD индикаторы фирмы Winstar.

Мне известны следующие варианты ЖК индикаторов этой фирмы.

Тип индикатора Формат отображения, символов x строк Габариты, мм Размеры видимой области, мм Ссылка на документацию, формат PDF
WH0802A1 8 x 2 58 x 32 38 x 16

pdf

WH1202A 12 x 2 55,7 x 32 46 x 14,5
WH1601A 16 x 1 80 x 36 66 x 16
WH1601B 16 x 1 85 x 28 66 x 16
WH1601L 16 x 1 122 x 33 99 x 13
WH1602A 16 x 2 84 x 44 66 x 16
WH1602B 16 x 2 80 x 36 66 x 16
WH1602C 16 x 2 80 x 36 66 x 16
WH1602D 16 x 2 85 x 30 66 x 16
WH1602J 16 x 2 80 x 36 66 x 16
WH1602L1 16 x 2 122 x 44 99 x 24
WH1602M 16 x 2 85 x 32,6 66 x 16
WH1602O 16 x 2 85 x 25,2 66 x 16
WH1602P 16 x 2 85 x 25,2 66 x 16
WH1602S 16 x 2 59 x 29,3 52 x 15
WH1602T 16 x 2 65,4 x 28,2 54,8 x 19
WH1602W 16 x 2 80 x 36 66 x 16
WH1602V2 16 x 2 66,7 x 23,3 61 x 15,9
WH1604A 16 x 4 87 x 60 62 x 26
WH1604B 16 x 4 70,6 x 60 60 x 32,6
WH2002A 20 x 2 116 x 37 85 x 18,6
WH2002D 20 x 2 89 x 21,5 75 x 15
WH2002L 20 x 2 180 x 40 149 x 23
WH2002M 20 x 2 146 x 43 123 x 23
WH2004A 20 x 4 98 x 60 77 x 25,2
WH2004B 20 x 4 98 x 60 77 x 25,2
WH2004D 20 x 4 77 x 47 60 x 22
WH2004G 20 x 4 87 x 58 74,4 x 24,8
WH2004H 20 x 4 87 x 58 74,4 x 24,8
WH2004L 20 x 4 146 x 62,5 123,5 x 43
WH2402A 24 x 2 118 x 36 94,5 x 16
WH4002A 40 x 2 182 x 33,5 154,4 x 16,5
WH4004A 40 x 4 190 x 54 147 x 29,5

 

Подключение LCD индикатора к микроконтроллеру.

Схемы подключения, временные диаграммы, параметры сигналов, команды управления, коды символов подробно расписаны в документации на контроллер HD44780. Я приведу только самые необходимые данные о подключении индикаторов к микроконтроллерам.

Как правило, LCD индикаторы имеют 16 выводов.

Номер вывода Сигнал I - вход O - выход Назначение сигнала
1 Vss - Земля (общий провод)
2 Vdd - Питание + 5 В
3 Vo - Управление контрастностью дисплея. Вход для подключения среднего вывода делителя напряжения + 5 В. Можно использовать подстроечный резистор сопротивлением 10-20 кОм.
4 RS I Выбор регистра: 0 – регистр команд; 1 – регистр данных. Низкий уровень сигнала означает, что на шине данных сформирована команда, высокий уровень – на шине данные.
5 R/W I Направление передачи данных:

0 – запись;

1 – чтение.

Во многих приложениях функция записи не используется, поэтому сигнал часто подключается к земле.

6 E I Строб операции шины (по отрицательному фронту).
7 DB0 I/O Младшие биты восьми битного режима. При четырех битном интерфейсе не используются.
8 DB1 I/O
9 DB2 I/O
10 DB3 I/O
11 DB4 I/O Старшие биты восьми битного режима или биты данных  четырех битного интерфейса.
12 DB5 I/O
13 DB6 I/O
14 DB7 I/O
15 A - Анод питания подсветки (+).
16 K - Катод питания подсветки (-).  Ток должен быть ограничен.

Номер вывода (первый столбец) приведен для наиболее распространенного варианта. Лучше проверьте, загрузив документацию на Ваш тип индикатора из таблицы  предыдущего раздела.

Символьные ЖК дисплеи поддерживают два варианта подключения к микроконтроллеру:

  • С использованием 8ми битной шины данных. Подключаются все сигналы шины DB0-DB7. За один цикл обмена передается байт информации.
  • С применением 4х битной шины данных. Подключаются только 4 старшие разряда DB4-DB7. Информация передается по четыре бита за один такт шины.

Первый вариант обеспечивает передачу данных на дисплей с большей скоростью. Второй – требует для подключения индикатора на 4 вывода меньше. Несомненно, важнее сократить число выводов для подключения, чем увеличить скорость обмена. Тем более, что LCD индикаторы довольно медленные устройства со временем цикла регенерации 10-20 мс.

 

Подключение символьного ЖК (LCD) дисплея к плате Ардуино.

Я буду подключать индикатор WH2004A (4 строки по 20 символов) в четырех битном режиме обмена к плате Arduino UNO R3. Документацию на LCD дисплей WH2004 можете посмотреть по этой ссылке WH2004.pdf.

Схема выглядит так.

Схема подключения LCD индикатора к Ардуино

Резисторы R2 и R3 определяют контрастность индикатора. Можете подключить подстроечный резистор и установить необходимую четкость изображения. Я часто использую индикаторы  WH2004, и в своих схемах выбираю такие номиналы резисторов.

Светодиоды подсветки индикатора я подключил к источнику питания 5 В через резистор R1 (30 Ом). Этим я задал ток порядка 25 мА. Тускло, но светится. В темноте видно хорошо. Хотя индикаторы WH2004 допускают ток подсветки до 580 мА.

Подключение LCD индикатора к Ардуино

Библиотека для управления LCD индикаторами в системе Ардуино LiquidCrystal.

Существует стандартная библиотека для управления ЖК индикаторами на базе контроллера HD44780. Подробно опишу ее методы.

LiquidCristal(…)

Конструктор класса. Может иметь разное число аргументов.

  • LiquidCristal(rs, en, d4, d5, d6, d7) – четырех битный интерфейс, сигнал RW не используется (подключен к земле).
  • LiquidCristal(rs,rw, en, d4, d5, d6, d7) – четырех битный интерфейс, сигнал RW используется.
  • LiquidCristal(rs, en, d0, d1, d2, d3, d4, d5, d6, d7) – восьми битный интерфейс, сигнал RW не используется (подключен к земле).
  • LiquidCristal(rs, rw, en, d0, d1, d2, d3, d4, d5, d6, d7) – восьми битный интерфейс, сигнал RW используется.

Аргументы:

  • rs – номер вывода сигнала RS;
  • rw – номер вывода сигнала RW;
  • en – номер вывода сигнала E;
  • d0, d1, d2, d3, d4, d5, d6, d7 – номера выводов шины данных.

LiquidCrystal  disp(6, 7, 2, 3, 4, 5);

 

void begin(cols, rows)

Инициализирует интерфейс индикатора. Задает размерность индикатора. Метод должен быть вызван первым, до использования других функций класса.

Аргументы:

  • cols – количество символов в строке;
  • rows – число строк.

disp.begin(20, 4);  // используем дисплей – 4 строки по 20 символов 

 

void clear()

Очистка экрана, установка курсора в верхний левый угол.

disp.clear();  // сброс дисплея

 

void home()

Установка курсора в верхний левый угол.

disp.home();  // в начало экрана

 

void setCursor(col, row)

Устанавливает курсор в заданную позицию.

  • col – координата X, нумерация с 0;
  • row – координата Y, нумерация с 0.

setCursor(1,0);  // курсор в начало второй строки

 

byte write(data)

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

Следующий скетч выводит на экран данные с последовательного порта. Данные можно передать монитором порта Arduino IDE.

// вывод данных последовательного порта на LCD индикатор
#include <LiquidCrystal.h>
 
LiquidCrystal disp(6, 7, 2, 3, 4, 5); // создаем объект
char data;
 
void setup()
{
  Serial.begin(9600); // инициализируем последовательны порт
  disp.begin(20, 4);  // инициализируем дисплей 4 строки по 20 символов
}
 
void loop()
{
  if (Serial.available()) {     // если есть данные
    data= Serial.read();  // читаем символ
    if( (data != 0xd) && (data != 0xa) ) {  // перевод строки
      disp.write(data);  // выводим символ на экран      
    }
  }
}

У меня индикатор большой – 4 строки по 20 символов. В нем установлены два контроллера HD44780. Поэтому последовательно передаваемые символы заполняют сначала первую строку, затем третью, дальше вторую и четвертую. Т.е. через строку. Надо учитывать это свойство для определенных типов индикаторов. В документации на каждый LCD индикатор указывается последовательность адресации символов.

Вывод данных с последовательного порта

byte print(data)

Выводит на экран текст. Возвращает количество переданных байтов.

Аргументы:

data – данные для вывода на экран. Могут иметь типы char, byte, int, long, string.

Может быть второй, необязательный аргумент.

byte print(data, BASE)

  • BASE – задает систему исчисления:
  • BIN – двоичная;
  • DEC – десятичная;
  • OCT – восьмеричная:
  • HEX – шестнадцатеричная.

Пример программы, печатающей на дисплее текстовую строку.

// вывод текстовой строки на LCD индикатор
#include <LiquidCrystal.h>
 
LiquidCrystal disp(6, 7, 2, 3, 4, 5); // создаем объект
 
void setup()
{
  disp.begin(20, 4);  // инициализируем дисплей 4 строки по 20 символов
  disp.print("Test string");
}
 
void loop()
{ }

Вывод строки на индикатор

void cursor()

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

disp.cursor();  // разрешаем отображение курсора

 

void noCursor()

Запрещает отображение курсора.

disp.noCursor();  // запрещаем отображение курсора

 

void blink()

Включает режим мигающего курсора. Используется совместно с функцией cursor(). Результат зависит от конкретной модели индикатора.

disp.blink();  // разрешаем мигающий курсор

 

void noBlink()

Отключает режим мигающего курсора.

disp.noBlink();  // запрещаем мигающий курсор

 

void display()

Включает экран после того, как он был выключен функцией noDisplay(). На экране отобразится информация, которая была до выключения.

disp.display();  // включаем дисплей

 

void noDisplay()

Выключает экран. Информация сохраняется в памяти и появляется при включении дисплея.

disp.noDisplay();  // выключаем дисплей

 

void scrollDisplayLeft()

Прокручивает содержимое дисплея на один символ влево.

disp. scrollDisplayLeft();  // сдвигаем все влево

 

void scrollDisplayRight()

Прокручивает содержимое дисплея на один символ вправо.

disp. scrollDisplayRight();  // сдвигаем все вправо

 

void autoscroll()

Включение режима автоматической прокрутки текста. При выводе каждого символа, весь текст на экране будет сдвигаться на один символ. В какую сторону сдвигается информация определяют функции leftToRight() и rightToLeft().

disp. autoscroll()();  // включаем автопрокрутку

 

void noAutoscroll()

Выключение автоматической прокрутки текста.

disp. noAutoscroll()();  // запрещаем автопрокрутку

 

void leftToRight()

Задает режим вывода теста слева-направо. Новые символы будут появляться справа от предыдущих.

leftToRight();  // режим слева-направо

 

void rightToLeft()

Задает режим вывода теста справа-налево. Новые символы будут появляться слева от предыдущих.

rightToLeft();  // режим справа-налево

 

void createChar(num, data)

Метод для создания пользовательского символа. Контроллер допускает создание до 8 символов  (0…7) размером 5x8 пикселей. Изображение символа задается массивом размерностью 8 байт. 5 младших битов каждого байта определяют состояние пикселей строки.

Знакоместо индикатора

Для вывода пользовательского символа можно использовать функцию write() с номером символа.

// создание пользовательского символа
#include <LiquidCrystal.h>
 
LiquidCrystal disp(6, 7, 2, 3, 4, 5); // создаем объект

byte smile[8] = {
  B00000000,
  B00010001,
  B00000000,
  B00000000,
  B00010001,
  B00001110,
  B00000000,
  B00000000
};
 
void setup()
{
  disp.createChar(0, smile); // создаем символ
  disp.begin(20, 4);  // инициализируем дисплей 4 строки по 20 символов
  disp.print("Smile ");
  disp.write(byte(0));  // выводим символ
}
 
void loop()
{ }

Пользовательский символ

 

Отображение кириллицы.

Большинство LCD дисплеев на российском рынке поддерживают кириллические символы, но коды этих символов не соответствуют ASCII стандарту. Поэтому выводится полная белиберда.

Первый выход – задавать символы их правильными кодами в явном виде. Коды можно посмотреть в документации на контроллер HD44780.

Например коды символов:

  • А- 41h;
  • Б – a0h;
  • В – 42h;
  • Г – a1h.

Вот программа, которая выводит кириллические символы “АБВГ” таким способом.

// вывод кириллицы кодами символов
#include <LiquidCrystal.h>
 
LiquidCrystal disp(6, 7, 2, 3, 4, 5); // создаем объект
 
void setup()
{
  disp.begin(20, 4);  // инициализируем дисплей 4 строки по 20 символов
  disp.print("\x41\xa0\x42\xa1");
}
 
void loop()
{ }

Не очень удобно, но если символов не много, то вполне приемлемо. Есть программы, которые переводят кириллический текст в коды.

 

Библиотека с поддержкой кириллицы LiquidCrystalRus.

Практичный вариант для вывода текста на русском языке – использовать библиотеку LiquidCrystalRus. Загрузить ее можно по этой ссылке LiquidCrystalRus-1.6.0.zip.

Вот пример программы, выводящей на экран русский алфавит.

// вывод русского алфавита
#include <LiquidCrystalRus.h>
 
LiquidCrystalRus disp(6, 7, 2, 3, 4, 5); // создаем объект
 
void setup()
{
  disp.begin(20, 4);  // инициализируем дисплей 4 строки по 20 символов
  disp.print("абвгдеёжзийклмнопрст");
  disp.print("АБВГДЕЁЖЗИЙКЛМНОПРСТ");
  disp.print("уфхцчшщьыьэюя       ");
  disp.print("УФХЦЧШЩЫЬЭЮЯ        ");
}
 
void loop()
{ }

Кирилица на LCD индикаторе

В моем индикаторе два контроллера HD44780. Поэтому отображение через строку и мне пришлось в программе нарушить последовательность вывода строк.

 

Как видите, работать с символьными LCD дисплеями намного проще, чем кажется.

Предыдущий урок     Список уроков     Следующий урок

7 комментариев на «Урок 23. Подключение ЖК (LCD) индикаторов к Ардуино. Библиотека LiquidCrystal.»

  1. Забыли упомянуть, что большинство LCD дисплеев китайского происхождения НЕ поддерживают кириллические символы. Единственный выход- использование метода создания пользовательского символа. Но здесь ограничение- не более 8 пользовательских одновременно в памяти управляющего контроллера, соответственно и на дисплее. При использовании только верхнего регистра многие английские буквы можно использовать как русские. Напечатать полностью алфавит мне удавалось за два прохода (чтоб не больше 8 своих за раз).
    А ещё мне попался интересный индикатор с одной строкой в 16 символов, который думает, что он в две строки по 8.

  2. К сожалению стандартная схема подключения расмотренная в предыдущих уроках не всегда удобна, так как занимает как минимум 6 цифровых выходов на арудине.

    • Не сказал бы, что удобнее, но есть варианты с двумя проводами:
      https://jt5.ru/examples/oled-i2c/
      https://geektimes.ru/post/255812/

  3. Спасибо. У меня китайский шилд с дисплеем заявленный как с установленной кириллицей. Но вытащить ее никак не удавалось. Ваша публикация помогла 100%. Еще раз спасибо.

  4. disp. autoscroll()(); // включаем автопрокрутку
    Что писать во вторых скобках? Версия Ардуино 1.6.5 не понимает.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *