Ардуино дисплей 1604 подключение. Arduino и символьный LCD-дисплей

Ардуино дисплей 1604 подключение. Arduino и символьный LCD-дисплей

В уроке поговорим о знакосинтезирующих жидкокристаллических индикаторах, о подключении их к плате Ардуино и управлении индикаторами с помощью библиотек 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, например LCD I2C модуль и LCD Keypad Shield.

Данная статья подробно с изображениями рассказывает, как подключить LCD к Arduino и отобразить информацию.

Шаг 1: LCD-дисплей 1602 для Ардуино

Дисплеи 1602 имеют два различных исполнения :

Жёлтая подсветка с чёрными буквами
- либо (это бывает гораздо чаще) синяя подсветка с белыми.

Размерность дисплеев на HD44780 контроллере бывает самой разной, а управляются они одинаково. Наиболее распространённые из размерностей – 16 на 02 (то есть по 16 символов в двух строках) или 20 на 04. Сами же символы имеют разрешение в 5 на 8 точек.

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

На дисплее есть 16-PIN разъём для подключения. Выводы имеют маркировку с тыльной стороны платы , она следующая:

1 (VSS) – питание на минус для контроллера.
2 (VDD) – питание на плюс для контроллера.
3 (VO) – настройки управления контрастом.
4 (RS) – выбор для регистра.
5 (R/W) – чтение и запись, в частности, запись при соединении с землёй.
6 (E) – активация (enable).
7–10 (DB0-DB3) – младшие биты от восьмибитного интерфейса.
11–14 (DB4-DB7) – старшие биты от интерфейса
15 (A) – положительный анод на питание подсветки.
16 (K) – отрицательный катод на питание подсветки.

Шаг 2: Подключаем ЖК-дисплей

Перед тем как подключать дисплей и передавать на него информацию, стоит проверить его работоспособность. Сперва подайте напряжение на VSS и VDD контроллер, запитайте подсветку (A, K), далее настройте контрастность. Для таких настроек подойдёт потенциометр с 10 кОм, форма его не важна. На крайние ноги подают +5V и GND, а ножку по центру соединяют с VO выводом.

Когда на схему подаётся питание, нужно добиться необходимого контраста, если он настраивается неправильно, то и изображение на экране видно не будет. Чтобы настроить контраст, нужно «поиграть» с потенциометром. Когда схема будет собрана правильно и контраст настроен верно, верхняя строка на экране должна заполниться прямоугольниками.

Чтобы дисплей работал, применяется встроенная в Arduino IDE среду специальная библиотека LiquidCrystal.h, о которой я напишу ниже. Он может действовать в 8-битном и в 4-битном режиме. В первом варианте применяют лишь младшие и старшие биты (BB0-DB7), во втором – только младшие (BB4-DB7).

Но применение 8-битного режима в этом дисплее – неправильное решение, преимущества в скорости почти нет, поскольку частота обновления у него всегда меньше 10 раз за секунду. Чтобы выводился текст, надо присоединить выводы DB7, DB6, DB5, DB4, E и RS к выводам контроллера. Присоединять их допустимо к любым пинам Arduino, главное – задание верной последовательности в коде.

Если необходимого символа пока что нет в памяти контроллера, то можно его определить вручную (всего до семи символов). Ячейка в рассматриваемых дисплеях имеет расширение в пять на восемь точек. Задача создания символа в том, чтобы написать битовую маску и расставить единички в местах, где точки должны гореть, а нолики – где не должны.

Рассмотренная выше схема подключения не всегда хороша, т. к. на Arduino занимается минимум шесть цифровых выходов.

Шаг 3: Схема обхода

Изучим вариант, как обойти это и обойтись только двумя. Нужен добавочный модуль-конвертор для LCD в IIC/I2C. Как он припаивается к дисплею и присоединяется к Arduino, можно увидеть на изображениях ниже.

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

Шаг 4: Библиотека LiquidCrystal.h

Библиотеку LiquidCrystal.h можно скачать с официального ресурса - . Также вы можете скачать ниже по ссылкам:

Скетч

После того, как вы скачали архив замените папку LiquidCrystal в папке с библиотеками вашего каталога установки Arduino.

Вы можете увидеть примерный скетч в Файл -> Примеры -> LiquidCrystal -> HelloWorld_SPI (File -> Examples -> LiquidCrystal -> HelloWorld_SPI).

На этом наш очередной урок завершен. Желаем вам качественных проектов!

За все время увлечения электроникой мне довелось пользоваться ЖКД от нескольких производителей - DataVision, WINSTAR, Uniworld Technology Corp . Они отличались типом контроллера, количеством выводов и длинною строк, но при этом все имели одинаковую схему подключения, систему команд и обслуживались одной и той же программой со стороны микроконтроллера. Поэтому, хотя речь сейчас пойдет о дисплее WH0802A фирмы WINSTAR , все ниже сказанное применимо к символьным ЖК-дисплеям и других фирм.

Итак, подключаем дисплей WH0802A-YGH-CT к микроконтроллеру

WH0802A – двухстрочный символьный дисплей на 8 знакомест со встроенным управляющим контроллером KS0066.
Разбираем назначение выводов дисплея.

У некоторых дисплеев есть два дополнительных вывода – выводы подсветки +LED и –LED. Причем если выводы есть – это еще не означает что есть и подсветка. Как и наоборот. У моего дисплея подсветка есть, а выводов управления нет.

По умолчанию подсветка у дисплея WH0802A-YGH-CT отключена. Чтобы ее включить, нужно проделать парочку нехитрых манипуляций, а именно – установить две перемычки и впаять токоограничительный резистор (смотри на фотке RK, JF и RA соответственно).

Схема подключения дисплея

Это типовая схема включения символьных LCD. Схему управления подсветкой дисплея мы задействовать не будем, но я ее на всякий случай нарисовал.

Начальный код

Подав питание на схему, нужно покрутить регулятор контраста (резистор R1). Если на экранчике появилась верхняя строка, значит, он живой и самое время приступать к написанию кода. На начальном этапе мы будем использовать 8-ми разрядную шину. Чтобы получить первые результаты, нам понадобится написать две функции – функцию записи данных и функцию записи команд. Отличаются они всего одной строчкой – когда записываются данные, сигнал RS должен быть 1, когда записывается команда, RS должен быть 0. Функции чтения мы пока использовать не будем, поэтому сигнал R/W будет всегда 0.

Цикл записи для 8-ми разрядной шины выглядит следующим образом:
1. Установить RS (0 - команда, 1 – данные)
2. Вывести значение байта данных на шину DB7…DB0
3. Установить E=1
4. Программная задержка 1
5. Установить E=0
6. Программная задержка 2

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

Вообще у контроллера дисплея есть так называемый флаг занятости – BF. Если флаг в 1 – контроллер занят, если в 0 – свободен. Вместо второй программной задержки можно читать флаг занятости и проверять, когда контроллер дисплея освободится. Но поскольку мы хотим быстро получить первые результаты, с флагом занятости будем разбираться потом.

//подключаем символьный ЖК-дисплей к AVR
#include
#include

//порт к которому подключена шина данных ЖКД
#define PORT_DATA PORTD
#define PIN_DATA PIND
#define DDRX_DATA DDRD

//порт к которому подключены управляющие выводы
#define PORT_SIG PORTB
#define PIN_SIG PINB
#define DDRX_SIG DDRB

//номера выводов микроконтроллера
//к которым подключены управляющие выводы ЖКД
#define RS 5
#define RW 6
#define EN 7

//макросы для работы с битами
#define ClearBit(reg, bit) reg &= (~(1<<(bit)))
#define SetBit(reg, bit) reg |= (1<<(bit))

#define F_CPU 8000000
#define _delay_us(us) __delay_cycles ((F_CPU / 1000000) * (us));
#define _delay_ms(ms) __delay_cycles ((F_CPU / 1000) * (ms));

//функция записи команды
void LcdWriteCom(unsigned char data)
{
ClearBit(PORT_SIG, RS); // устанавливаем RS в 0
PORT_DATA = data; // выводим данные на шину
SetBit(PORT_SIG, EN); // устанавливаем Е в 1
_delay_us (2);
ClearBit(PORT_SIG, EN); // устанавливаем Е в 0
_delay_us(40);

//функция записи данных

void LcdWriteData(unsigned char data)
{
SetBit(PORT_SIG, RS); //устанавливаем RS в 1
PORT_DATA = data; //выводим данные на шину
SetBit(PORT_SIG, EN); //устанавливаем Е в 1
_delay_us (2);

ClearBit(PORT_SIG, EN); // устанавливаем Е в 0

Delay_us(40);
}

int main(void )
{
while (1);
return 0;
}

Здесь нет сложных мест, все должно быть понятно. Идем дальше.

Любой ЖК-дисплей перед использованием нужно инициализировать. Процесс инициализации обычно описан в datasheet`е на контроллер дисплея. Но даже если там и нет информации, последовательность, скорее всего, будет такая.

1. Подаем питание

2. Ждем >40 мс

3. Подаем команду Function set

DL – бит установки разрядности шины
0 – 4 разрядная шина, 1 – 8 разрядная шина

N – бит установки количества строк дисплея
0 – однострочный режим, 1 – двухстрочный режим

F – бит установки шрифта
0 – формат 5*8, 1 – формат 5*11

* - не важно что будет в этих битах

4. Подаем команду Display ON/OFF

D – бит включения/выключения дисплея
0 – дисплей выключен, 1 – дисплей включен

C – бит включения/выключения курсора
0 – курсор выключен, 1 – курсор включен

B – бит включения мерцания
0 – мерцающий курсор включен, 1 – мерцающий курсор выключен

5. Подаем команду Clear Display


6. Ждем > 1,5 ms

7. Подаем команду Entry Mode Set

I/D – порядок увеличения/уменьшения адреса DDRAM(ОЗУ данных дисплея)
0 – курсор движется влево, адрес уменьшается на 1, 1 – курсор движется вправо, адрес увеличивается на 1

SH – порядок сдвига всего дисплея
0 – сдвига нет, 1 – сдвиг происходит согласно сигналу I/D – если он 0 – дисплей сдвигается вправо, 1 – дисплей сдвигается влево

Для нашего примера функция инициализации будет выглядеть так

Как подружить плату Ардуино с символьным дисплеем? Довольно просто! Все ниже по порядку и с подробностями.

Если есть желание получать информацию от Ардуино без подключения к компьютеру и вывода на серийный порт, можно использовать символьный дисплей. Сделать это не так сложно. Полученное удобство от общения неоценимо.
Для работы я использовал символьный LCD-дисплей J204A на базе чипа HD44780, на eBay часто встречается как LCD2004. 4 строки по 20 символов, инвертированный. Куплен с кучей других на eBay, за сущие копейки, от 60 до 100 рублей за штуку. Русский язык не поддерживается по-умолчанию, но это решаемая проблема, об этом как нибудь в следующий раз. И еще коннекторы на схеме не распаяны, придется поработать паяльником.
Для работы с дисплеями используется библиотека LiquidCrystal.h входящая в дефолтную постаку Arduino IDE.

А вот даташита по дисплею LCD2004 я не нашел, но зато в интернетах полным полно таблиц по дисплею . Но они практически не отличаются друг от друга. По управлению и подключению полностью идентичны. Отличие только в количестве строк/символов на дисплее. Но это абсолютно не повлияет если у вас 1602.

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

# Контакты Для чего используется Примечание
1 VSS (VSS) GND. Земля. Питание микроконтроллера дисплея. 0V
2 VDD (VCC) Питающее напряжение для микроконтроллера дисплея. +5V
3 V0 (VEE) Контраст символов на дисплее. Подключать лучше через потенциометр. от 0v до +5V
4 RS (RS) Выбор регистра.
5 RW (R/W) Переключение режима чтения/записи. Утянем на землю, нам нужно только передавать информацию на дисплей. 0-запись +5V-чтение
6 E Тактирование
7 D0 (DB0) Данные
8 D1 (DB1) Передача данных. (Не будем использовать) Данные
9 D2 (DB2) Передача данных. (Не будем использовать) Данные
10 D3 (DB3) Передача данных. (Не будем использовать) Данные
11 D4 (DB4) Данные
12 D5 (DB5) Передача данных. (Задействуется) Данные
13 D6 (DB6) Передача данных. (Задействуется) Данные
14 D7 (DB7) Передача данных. (Задействуется) Данные
15 A (LED+) +5V Напряжение, подсветка дисплея, через потенциометр можно регулировать яркость дисплея. +5V
16 K (LED-) GND Земля, подсветка дисплея 0V

v

Передача данных к дисплею возможна в двух вариантах: по 8 и по 4 бит за такт. Т.к. Ардуино имеет мало контактов, мы будем использовать 4 — этого с лихвой хватает, чтоб обновлять информацию на дисплее с запредельной для восприятия скоростью.

Вот так все это дело у меня подключено. Возможно кажется что это хаос, но тут есть система. Можно выделить красные, зеленые, желтые и оранжевые провода. Красные всегда идут на +5V, зеленые — GND, а желтые и оранжевые — это провода для подключения к Ардуино, по которым идут данные.

Самая важная часть — физическое подключение дисплея. По клику открывается в большом разрешении, где все хорошо видно.
R1 — Резистор 200OM. Сопротивление ограничивающее ток, проходящий через подсветку дисплея.
R2 — Потенциометр с сопротивлением до 10kOM. Кутим ручку, подбираем контраст символов.


И крайне простой скетч, для вывода на экран пары строк.

H> // Подключаем библиотеку для работы с дисплеем. /* Командой LiquidCrystal lcd(rs, enable, d4, d5, d6, d7); создаем переменную типа LiquidCrystal И определяем через какие контакты Ардуино рабоает с дисплеем. подробнее про эту команду тут http://arduino.cc/en/Reference/LiquidCrystalConstructor */ LiquidCrystal lcd(6, 7, 8, 9, 10, 11); void setup() { lcd.begin(20, 4); // определяем характеристики дисплея (20 Символов в строке, 4 строки) // Для дисплея 1602 надо указывать lcd.begin(16, 2); lcd.setCursor(1, 1); // Указываем с какой позиции начать выводить текст. строки и символы начинаются с 0!!! // 1 уже отодвинет каретку на одно деление от начала экрана и сдвинет текст на одну строку ниже lcd.print("compblog.vlukyanov"); // выводим текст начиная с указанной позиции. lcd.setCursor(7, 2); // выводим с 8го символа на экране в третьей строке. lcd.print(".com"); // текст для вывода. } void loop() { // в цикле ни чего больше не делаем все уже сделано во время инициализации платы. }

Результат. Если знать, как все это подключается и как написать код, то время на все работы 5 минут.

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

Например:

  • Скролить текст;
  • Мигать позицией курсора;
  • Включаться/выключаться.

А теперь бонус!
Подсветка дисплея тратит энергию, которую, при питании от батареи, например, хотелось бы экономить. Я сделал для себя такой вариант — при нажатии на кнопку, включается подсветка дисплея на 5 секунд.

H> // Подключаем библиотеку для работы с дисплеем. int buttonInt = 0; // Номер прерывания, которое будет вызыватся. int screenLed = 4; // Номер пина к которому подключен экран. +5V volatile long x = 5000; // переменная для хранения времени LiquidCrystal lcd(6, 7, 8, 9, 10, 11); void setup() { attachInterrupt(buttonInt, screenon, FALLING); // параметры прерывания lcd.begin(20, 4); pinMode(screenLed, OUTPUT); digitalWrite(screenLed,HIGH); // включаем дисплей lcd.setCursor(0, 0); lcd.print("Start screenon test!"); } // Функция которая будет выполнятся при нажатии на кнопку. void screenon() { x = millis()+5000; // Запоминаем время, когда надо выключить подсветку. Текущее время работы +5 секунд. digitalWrite(screenLed,HIGH); // Подаем напряжение на подсветку дисплея. } void loop() { lcd.setCursor(0, 2); // переходим к третей строке lcd.print(x); // и выводим время когда дисплей выключится lcd.setCursor(0, 3); // переходим к четвертой строке lcd.print(millis()); // печатаем текущее время работы if (x < millis()) // если время работы выключения наступило > { digitalWrite(screenLed,LOW); // то гасим дисплей } }

И результат:

При сборке своего металлоискателя у меня на руках оказался LCD дисплей 1602, построенный на контроллера HD44780. Решил не упустить возможность и подключить его к своему китайскому аналогу Arduino UNO.

Вот такой дисплей 1602 будем сегодня подключать к Arduino.

Цифры «1602» говорят о том, что дисплей состоит из 2-х строк, по 16 символов. Это довольно распространённый экран, с применением которого народ конструирует часы, тестеры и прочие гаджеты. Дисплей бывает с зелёной и голубой подсветкой.

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

Подключать дисплей 1602 к Arduino будем через 4-битный вариант параллельного интерфейса. Существует вариант и 8-битного интерфейса, но при нём задействуется больше проводов, а выигрыша в этом мы не увидим.

Кроме дисплея и Arduino, нам понадобятся провода и переменный резистор на 10кОм. Резистор подойдёт любой марки, лишь бы был необходимого номинала.

Питание на дисплей подаётся через 1-й (VSS) и 2-й (VDD) выводы. К выводам 15 (А) и 16 (K) - подаётся питание на подсветку дисплея. Поскольку для питания и подсветки используется одно напряжение +5В, запитаем их от пинов Arduino «5V» и «GND» . Главное не перепутать полярность, иначе можно спалить электронику дисплея.

3-й вывод (V0) подключаем к ножке переменного резистора, им будем управлять контрастностью дисплея. Резистор можно не использовать, а вывод «V0» подключить к GND . В таком случае контрастность будет максимальной и не будет возможности её плавной регулировки.

5-й вывод (RW) используется для чтения с дисплея либо для записи в него. Поскольку мы будем только писать в дисплей, соединим этот вывод с землёй (GND) .

Выводы: 4-й (RS) , 6-й (E) , 11-й (D4) , 12-й (D5) , 13-й (D6) , 14-й (D7) подключаем к цифровым пинам Arduino. Не обязательно использовать пины те же что и у меня, можно подключить к любым цифровым, главное затем правильно их выставить в скетче.

Моя подключённая Ардуина, осталось соединить её с компьютером через USB и залить скетч.

В примете будем использовать скетч из стандартного набора.

В Arduino IDE выбираем «Файл» - «Образцы» - «LiquidCrystal» - «HelloWorld» .

Давайте посмотрим на код скетча.

В строке «LiquidCrystal lcd» , в скобках, выставлены цифровые пины, которые задействованы на Arduino. Пины выставляются в такой последовательности: RS, E, DB4, DB5, DB6, DB7 . Если вы задействовали другие цифровые пины, при подключении дисплея, впишите их в нужной последовательности в скобках.

В строке «lcd.print("hello, world!");» выводится приветствие на дисплей, по-умолчанию это надпись «hello, world!» , её можно поменять на любую свою, пишем на латинице.

Загружаем скетч в Arduino и вот результат. Вместо «hello, world!» я вписал свой сайт. Строкой ниже, таймер производит отсчёт времени.


Самое обсуждаемое
Как добиться максимальной экономии заряда батареи на андроиде Как добиться максимальной экономии заряда батареи на андроиде
Дисплей IPS или TFT лучше? Дисплей IPS или TFT лучше?
Лучшие игры для VR Очки виртуальной реальности список игр Лучшие игры для VR Очки виртуальной реальности список игр


top