Подключение LCD к плате Ардуино (Arduino). LCD WH1602B компании Winstar Lcd 1602 подключение к инфракрасной станции


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

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

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

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

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

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

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

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

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

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

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

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

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

Тип индикатора Формат отображения, символов x строк Габариты, мм Размеры видимой области, мм Ссылка на документацию, формат PDF
WH0802A1 8 x 2 58 x 32 38 x 16
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 можете посмотреть по этой ссылке .

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

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

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

Библиотека для управления 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(0,1); // курсор в начало второй строки

byte write(data)

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

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

// вывод данных последовательного порта на LCD индикатор
#include


char data;

void setup()
{
Serial.begin(9600); // инициализируем последовательны порт
disp.begin(20, 4); //
}

void loop()
{
if (Serial.available()) { // если есть данные
data= Serial.read(); // читаем символ
if((data != 0xd) && (data != 0xa)) { // перевод строки
disp.write(data); // выводим символ на экран
}
}
}

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

byte print(data)

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

Функция имеет различные формы вызова для разных форматов и типов данных.

print(char d) Если аргумент типа char выводит код символа

char d= 83;
disp.print(d); // выводит символ S
disp.print(‘S’); // выводит символ S

print(int d) Если аргумент – целый тип, то выводит строку с десятичным представлением числа

int d= 83;
disp.print(d); // выводит строку “83”
disp.print(83); // выводит строку “83”

print(float) Вещественные типы выводятся символами ASCII, два знака после запятой

float d= 7.65432;
disp.print(d); // выводит строку “7.65”
disp.print(7.65432); // выводит строку “7.65”

print(* str) Если аргумент указатель на строку, то выводится текстовая строка.

char letters= {65, 66, 67};
disp.print(“Letters”); // выводит строку “Letters”
disp.print(letters); // выводит строку из 3 символов с кодами 65, 66, 67

print(int d, DEC) Выводит строку ASCII - десятичное представление числа

int d= 83;
disp.print(d, DEC); // вывод строку “83”

print(int d, HEX) Выводит строку ASCII – шестнадцатиричное представление числа

int d= 83;
disp.print(d, HEX); // вывод строку “53”

print(int d, OCT) Выводит строку ASCII – восьмеричное представление числа

int d= 83;
disp.print(d, OCT); // вывод строку “123”

print(int d, BIN) Выводит строку ASCII – двоичное представление числа

int d= 83;
disp.print(d, BIN); // вывод строку “01010011”

print(float d, N) Для вещественных чисел параметр N задает количество цифр после запятой.

disp.print(7.65432, 0); // выводит строку “7”
disp.print(7.65432, 2); // выводит строку “7.65”
disp.print(7.65432, 4); // выводит строку “7.6543”

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

// вывод текстовой строки на LCD индикатор
#include

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 disp(6, 7, 2, 3, 4, 5); // создаем объект

byte smile = {
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()
{ }

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

// вывод русского алфавита
#include

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

В данной статье мы расскажем как его подключить к Arduino и вывести информацию.

Используемые компоненты (купить в Китае):

. Управляющая плата

. Соединительные провода

Данные дисплеи имеют два исполнения: желтая подсветка с черными буквами либо, что встречается чаще, синюю подсветку с белыми буквами.

Размерность дисплеев на контроллере HD44780 может быть различной, управляться они будут одинаково. Самые распространенные размерности 16x02 (т.е. по 16 символов в двух строках) либо 20x04. Разрешение же самих символов - 5x8 точек.

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

Выводы дисплея:

На дисплее имеется 16pin разъем для подключения. Выводы промаркированы на тыльной стороне платы.

1 (VSS) - Питание контроллера (-)
2 (VDD) - Питание контроллера (+)
3 (VO) - Вывод управления контрастом
4 (RS) - Выбор регистра
5 (R/W) - Чтение/запись (режим записи при соединении с землей)
6 (E) - Еnable (строб по спаду)
7-10 (DB0-DB3) - Младшие биты 8-битного интерфейса
11-14 (DB4-DB7) - Старшие биты интерфейса
15 (A) - Анод (+) питания подсветки
16 (K) - Катод (-) питания подсветки

Режим самотестирования:

Перед попытками подключения и вывода информации, было бы неплохо узнать рабочий дисплей или нет. Для этого необходимо подать напряжение на сам контроллер (VSS и VDD ), запитать подсветку (A и K ), а также настроить контрастность.

Для настройки контрастности следует использовать потенциометр на 10 кОм. Каким он будет по форме - не важно. На крайние ноги подается +5V и GND, центральная ножка соединяется с выводом VO

После подачи питания на схему необходимо добиться правильного контраста, если он будет настроен не верно, то на экране ничего не будет отображаться. Для настройки контраста следует поиграться с потенциометром.

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

Вывод информации:

Для работы дисплея используется встроенная с среду Arduino IDE библиотека LiquidCrystal.h

Функционал библиотеки

//Работа с курсором lcd.setCursor (0, 0); // Устанавливаем курсор (номер ячейки, строка) lcd.home (); // Установка курсора в ноль (0, 0) lcd.cursor (); // Включить видимость курсора (подчеркивание) lcd.noCursor (); // Убрать видимость курсора (подчеркивание) lcd.blink (); // Включить мигание курсора (курсор 5х8) lcd.noBlink (); // Выключить мигание курсора (курсор 5х8) //Вывод информации lcd.print ("сайт" ); // Вывод информации lcd.clear (); // Очистка дисплея, (удаление всех данных) установка курсора в ноль lcd.rightToLeft (); // Запись производится справа на лево lcd.leftToRight (); // Запись производится слева на право lcd.scrollDisplayRight (); // Смещение всего изображенного на дисплее на один символ вправо lcd.scrollDisplayLeft (); // Смещение всего изображенного на дисплее на один символ влево //Информация полезная для шпионов:) lcd.noDisplay (); // Информация на дисплее становится невидимой, данные не стираются // если, в момент когда данная функция активна, ничего не выводить на дисплей, то lcd.display (); // При вызове функции display() на дисплее восстанавливается вся информация которая была

Сам же дисплей может работать в двух режимах:

8-битный режим - для этого используются и младшие и старшие биты (BB0- DB7)

4-битный режим - для этого используются и только младшие биты (BB4- DB7)

Использование 8-битного режима на данном дисплее не целесообразно. Для его работы требуется на 4 ноги больше, а выигрыша в скорости практически нет т.к. частота обновления данного дисплея упирается в предел < 10раз в секунду.

Для вывода текста необходимо подключить выводы RS, E, DB4, DB5, DB6, DB7 к выводам контроллера. Их можно подключать к либым пинам Arduino, главное в коде задать правильную последовательность.

Пример программного кода:

#include LiquidCrystal lcd(7, 6, 5, 4, 3, 2); void setup (){ lcd.begin (16, 2); // Задаем размерность экрана lcd.setCursor (0, 0); lcd.print ("Hello, world!" ); // Выводим текст lcd.setCursor (0, 1); // Устанавливаем курсор в начало 2 строки lcd.print ("сайт" ); // Выводим текст } void loop (){ }

Создание собственных символов

С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера внутри дисплея и с ними проблем нет. А вот что делать если нужного символа в памяти контроллера нет?

Не беда, требуемый символ можно сделать вручную (всего до 7ми символов). Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.

В ниже приведенном примере нарисуем смайлик.

Пример программного кода

//Тестировалось на Arduino IDE 1.0.5 #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 (){ }

Бонус

В комментариях участник сообщества скинул ссылку на генератор символов

  • igorka

      генератор символов по примеру выше,
      сделал потому что не слабо)

Некоторое время лежал без дела вот такой дисплей.


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

Итак, начнём.
Первое что надо сделать - это найти распиновку, то есть какой контакт за что отвечает, второе - найти название контроллера, который управляет дисплеем, для этого скачиваем даташит на данный LCD и открываем его на первой странице.


Контакты считаются слева направо, первый отмечен красной стрелочкой. Напряжение питание равно 5 вольтам, управляющий контроллер S6A0069 или аналогичный, например, ks0066U .

Для чего мы искали название управляющего контроллера? Дело в том, что в даташите на дисплей есть временные задержки(timing diagram), описана система команд, но нет банальной инициализации, а без неё никуда.
Далее, открываем вторую страницу и видим таблицу, в которой написано какой контакт за, что отвечает.


DB7…DB0 – шина данных/адреса.

R/W - определяет что будем делать, считывать(R/W=1) или записывать(R/W=0)

R/S – определяет, что будем слать команду(RS=0) или данные(RS=1)

E – стробирующий вход, изменяя сигнал на этом входе мы разрешаем дисплею считывать/записывать данные.

LED± – управление подсветкой.

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

Скачиваем даташит на управляющий контроллер и находим инструкцию по инициализации. Картинки можно увеличить, кликнув по ним.



Оказывается, таких инструкций целых две, для 8-битного и 4-битного режима. Что ж это за режимы такие? Данные режимы определяют по скольки проводкам будут передаваться данные: по четырём, либо по восьми. Давайте рассмотрим передачу по 4 проводам , в таком случае дисплей будет работать медленнее, но зато мы сэкономим 4 вывода микроконтроллера, да и реализация восьмибитного режима не намного отличается.

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


Контрастность можно регулировать включив потенциометр между выводами питания.

Хотелось бы обратить внимание, что во время инициализации R/S и R/W всегда равны нулю, то есть мы будем слать команды .

При инициализации можно настроить:

  • N - количество отображаемых строк
  • C - включить или выключить курсор
  • B - сделать курсор мигающим
  • I/D - увеличивать или уменьшать значение счётчика адреса
  • SH - двигать окошко дисплея
Два последние пункта рассмотрим подробнее.
На картинке ниже показано по какому адресу надо писать данные чтобы они отобразились в определённой позиции, например, если мы хотим вывести символ на первой позиции второй строки , то мы должны писать по адресу 0х40.


После этого значение счётчика автоматически изменится, либо увеличится, либо уменьшится, а вместе с ним изменится и положение курсора.

Кстати, память в которую мы пишем, называется DDRAM , все что мы запишем в эту память выведется на дисплей, ещё есть CGROM , в которой хранится таблица знакогенератора.


Эту таблицу нельзя изменить, но из неё можно брать уже готовые символы. Ещё один вид памяти это CGRAM , она то же представляет собой таблицу знакогенератора, но символы в этой таблице мы рисуем сами.


Теперь пару слов о движении экрана, дело в том что обычно на дисплее мы видим не всю DDRAM, а лишь определённую часть, как показано на картинке ниже.


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

С теорией закончили переходим к практике.
Картина общения с LCD дисплеем в 4-битном режиме выглядит следующим образом.


Данные шлются байтами, но так, как у нас 4-битный режим, то для того чтобы отправить байт надо сделать 2 посылки, старшим битом вперёд. На картинке первая посылка обозначена D7(старшая тетрада), вторая D3(младшая тетрада). Перед следующей посылкой мы должны проверить флаг занятости и если он не установлен снова можно слать, если установлен ждём, пока контроллер, управляющий LCD закончит свои дела.

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


Для отправки надо по 8-битной шине:
  • R/W установить в 0
  • выдаём код команды/данные в шину
  • задержка 2us
  • опускаем строб Е

Операция чтения реализуется аналогично:

  • убедиться, что управляющий контроллер свободен
  • R/W установить в 1
  • поднимаем строб E(в этот момент LCD выдаст данные в шину)
  • задержка 2us
  • читаем то что выдал LCD
  • опускаем строб Е
Откуда взялась задержка 2us?

Выше таймингов есть таблица в которой написано чему равны задержки изображённые на графике, так вот длительность стробирующего импульса - tw должна быть равна 230nS или 450nS в зависимости от напряжения питания, мы взяли чуть с запасом. Почему мы учли только эту задержку? Потому что значение остальных задержек очень мало.

Для отправки по 4-битной шине:

  • убедиться, что управляющий контроллер свободен
  • установить RS в 0(команда) или 1(данные), в зависимости оттого что будем слать
  • R/W установить в 0
  • поднимаем строб E(устанавливаем в 1)
  • выдаём старшую тетраду в шину
  • задержка 2us
  • опускаем строб Е
  • задержка 1us
  • поднимаем строб E(устанавливаем в 1)
  • выдаём младшую тетраду в шину
  • задержка 2us
  • опускаем строб Е

Для чтения по 4-битной шине:

  • убедиться, что управляющий контроллер свободен
  • порт данных на вход с подтяжкой
  • установить RS в 0(команда) или 1(данные), в зависимости оттого что будем читать
  • R/W установить в 1
  • поднимаем строб E(устанавливаем в 1)
  • задержка 2us
  • читаем старшую тетраду
  • опускаем строб Е
  • задержка 1us
  • поднимаем строб E(устанавливаем в 1)
  • задержка 2us
  • читаем младшую тетраду
  • опускаем строб Е

Поднятие строба и вывод команды/данных в шину, можно поменять местами. Теперь не составит труда инициализировать дисплей. Для упрощения инициализации, мы заменим чтение флага занятости задержкой, а работу с флагом рассмотрим позже.
Надо отметить, что при инициализации в 4-битном режиме используются 4-битные команды, а после инициализации 8-битная система команд, поэтому для инициализации мы реализуем отдельную функцию отправки команд void Write_Init_Command(uint8_t data) .
//Код инициализации для Atmega16 #define F_CPU 8000000UL #define LCD_PORT PORTA #define LCD_DDR DDRA #define LCD_PIN PINA #define DATA_BUS 0XF0 #define RS 0 #define RW 1 #define E 2 #include #include void Write_Init_Command(uint8_t data) { //ножки по которым передаются команды/данные на выход LCD_DDR |= DATA_BUS; //будем слать команду LCD_PORT &= ~(1<Весело мигающий курсор, свидетельствует о том, что инициализация прошла успешно. В

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

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

LCD I2C модуль позволить подключить символьный дисплей к плате Arduino всего по двум сигнальным проводам.

Используемые компоненты (купить в Китае):

. Управляющая плата

. Соединительные провода

Основные технические характеристики:

Дисплей: Символьный 16х02 либо 20x04
. Подсветка: Синяя c белыми символами
. Контраст: Настраивается потенциометром
. Напряжение питания: 5В
. Интерфейс: I2C
. I2C адрес: 0x27
. Размеры: 82мм x 35мм x 18мм

Подключение к Arduino

Модуль оборудован четырех-пиновым разъемом стандарта 2.54мм

SCL : последовательная линия тактирования (Serial CLock)

SDA : последовательная линия данных (Serial DAta)

VCC : "+" питания

GND : "-" питания

Выводы отвечающие за интерфейс I2C на платах Arduino на базе различных контроллеров разнятся

Для работы с данным модулем необходимо установить библиотеку LiquidCrystal_I2C1602V1

Скачиваем, распаковываем и закидываем в папку libraries в папке Arduino. В случае, если на момент добавления библиотеки, Arduino IDE была открытой, перезагружаем среду.

Переходим непосредственно к скетчу. В данном примере выведем стандартный "Hello, world!" и для адрес нашего сообщества.

пример программного кода:

#include #include LiquidCrystal_I2C lcd(0x27,16,2); /* Задаем адрес и размерность дисплея. При использовании LCD I2C модуля с дисплеем 20х04 ничего в коде изменять не требуется, cледует только задать правильную размерность */ void setup () { lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку // Курсор находится в начале 1 строки lcd.print ("Hello, world!" ); // Выводим текст lcd.setCursor (0, 1); // Устанавливаем курсор в начало 2 строки lcd.print ("сайт" ); // Выводим текст } void loop () { }

Создание собственных символов

С выводом текста разобрались, буквы английского алфавита зашиты в память контроллера внутри дисплея и с ними проблем нет. А вот что делать если нужного символа в памяти контроллера нет?

Не беда, требуемый символ можно сделать вручную. Данный способ частично, ограничение в 7 символов, поможет решить проблему вывода.

Ячейка, в рассматриваемых нами дисплеях, имеет разрешение 5х8 точек. Все, к чему сводится задача создания символа, это написать битовую маску и расставить в ней единички в местах где должны гореть точки и нолики где нет.

В ниже приведенном примере нарисуем смайлик.

пример программного кода:

//Тестировалось на Arduino IDE 1.0.5 // Добавляем необходимые библиотеки #include #include // Битовая маска символа улыбки byte smile = { B00010, B00001, B11001, B00001, B11001, B00001, B00010, }; LiquidCrystal_I2C lcd(0x27,20,4); // Задаем адрес и размерность дисплея. void setup () { lcd.init(); // Инициализация lcd lcd.backlight(); // Включаем подсветку // Создаем символ под номером 0 lcd.createChar (1, smile); lcd.setCursor (0, 0); // Устанавливаем курсор в начало 1 строки lcd.print ("\1" ); // Выводим смайлик (символ под номером 1) - "\1" } void loop () { }

Программка для легкого создания символов

В комментариях участник сообщества скинул ссылку на генератор символов