Дисплей 1601 распиновка

Arduino, MK-90 и другие

Программирование Arduino, оживление микроэвм Электроника МК-90, аппаратный хакинг.

Страницы

23.05.2010

Однострочный LCD в двухстрочном режиме

С помощью библиотеки LiquidCrystal, входящей в стандартный комплект ArduinoIDE 0018, можно выводить алфавитно-цифровую информацию на LCD-дисплеи, совместимые с контроллером HD44780U. В Россию, например, импортируется большое количество дисплеев WinStar — они доступны по цене и неприхотливы в использовании.

Однако, существует пара досадных проблем, среди которых отсутствие поддержки русских букв (вроде как решена) и плохая работа с однострочными дисплеями — именно про нее пойдет повествование ;)

Дело в том, что у HD44780U максимальный размер алфавитно-цифрового дисплея составляет 80 знакомест. И хотя производители изготавливают дисплеи на любой вкус (2 строки по 20 символов, 1 строка по 16, 2 по 8 и т.д.), контроллер всегда оперирует памятью DDRAM размером в 80 байт. А вот по поводу того, сколько на самом деле физический дисплей имеет строк и колонок, должен заботиться программист: например, записывать символы только в те ячейки памяти, за которыми закреплены физические знакоместа в ЖКИ.

Всё это было мне невдомек, пока однажды я не познакомился с дисплеем WH1601A-NGG-CT, 16 знакомест в один ряд:

У него есть небольшая особенность — логически он представляет собой двухстрочный дисплей по восемь символов в строке. На это красноречиво указывает документация, просто надо внимательно читать перед покупкой:

Таким образом, интуитивно правильно написанный скетч (вариация на тему примера «HelloWorld» к библиотеке LiquidCrystal):

Дает вот такой огорчающий результат:

Как я уже упоминал, дисплей логически работает в двухстрочном режиме, поэтому для отображения второй половины надо обязательно вызывать конструктор как lcd.begin(16, 2) , в противном случае мы вообще никогда ничего во второй половине не увидим. Зато можно разбивать все строки попалам и перед отображением второй половины ставить lcd.setCursor(0, 1) , хотя, на мой взгляд — это насилие над личностью программиста. Про что-то подобное возмущался пользователь abend в форуме arduino, его направили читать документацию — и, видимо, он до сих пор ее читает.

Так как же быть? Если бы это был логически однострочный дисплей, то вывод в ячейки памяти DDRAM с адресами 0x0 — 0x0f отобразился бы на экране. У нас же диапазон прерывается — сначала от 0x0 до 0x7 , а далее — от 0x40 до 0x47 . Всё, что потребуется — «подменить» обращения к адресам 0x08-0x0f на 0x40 — 0x47 , но так, чтобы основная программа ни о чем не догадалась. Неприятный момент заключается в том, что адресный регистр работает в режиме автоинкремента и придется перед каждым выводом в память проверять, не попали ли мы в запрещенный диапазон 0x08-0x0f — иначе говоря, читать содержимое адресного регистра.

С точки зрения схемы, потребуется подключить пин RW к какому-то из свободных цифровых выходов Arduino, потому что именно он управляет направлением передачи данных по шине. Если раньше можно было спокойно вешать его на GND (всегда вывод в дисплей), теперь про такую экономию придется забыть.

Библиотечное API расширено функцией setDRAMModel(uint8_t) , которой надо передать в качестве аргумента константу режима трансляции — в данном случае — LCD_DRAM_WH1601 , после чего результат команды print будет уже гораздо более ожидаемым:

В остальном — функциональность в точности соответствует оригинальной библиотеке. Кстати, там есть чего оптимизировать и я этим воспользовался, чтобы прирост размера был не очень заметен.

Файл-архив LiquidCrystal-WH1601-0018.zip надо распаковать в arduino-0018/libraries/, желательно предварительно сохранив старый каталог LiquidCrystal — на всякий случай.

Источник

ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ

Блог технической поддержки моих разработок

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

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

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

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.

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

Резисторы 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

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)

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

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

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[3]= <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) размером 5×8 пикселей. Изображение символа задается массивом размерностью 8 байт. 5 младших битов каждого байта определяют состояние пикселей строки.

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

// создание пользовательского символа
#include

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.

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

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

// вывод кириллицы кодами символов
#include

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 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()

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

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

Источник

Adblock
detector