Подключение LCD 1602 по I2C интерфейсу

Подключение LCD 1602
LCD 1602 является широко распространенным и популярным дисплеем среди радиолюбителей, кроме этого, аналогичные дисплеи встраиваются в различные устройства серийного производства. Дисплей построен на базе контроллера HD44780 и его аналогах, широкая известность связана с его давним появлением на рынке, во времена стремительного развития электроники. В этой статье я расскажу про сопряжение интерфейса I2C и LCD 1602, с помощью микросхемы расширителя портов PCF8574.

В продаже имеется два типа дисплея, с зеленым экраном и темными символами (заказать можно здесь), а также с синим экраном и светлыми символами (заказать можно тут), как по мне, то светлый зеленый экран смотрится лучше.

Описание и команды управления LCD 1602

Дисплей содержит две строки, в каждой умещается по 16 символов, напряжение питания может находиться в пределах 4,5-5,5 В, ток потребления составляет 1,2 мА без учета подсветки, которая может потреблять значительный ток. Дисплей имеет достаточно много выводов, назначение которых приведено в следующей таблице:

Номер вывода Название Описание
1 Vss Вывод питания дисплея “-”
2 Vdd Вывод питания дисплея “+”
3 VO Вход регулировки контрастности дисплея
4 RS Вход выбора типа инструкций, 1 – данные, 0 – команда
5 R/W Вход направления передачи данных, 1 – запись данных в дисплей, 0 – чтение данных из дисплея
6 E Вход тактирования
7-14 DB0-DB7 Линии ввода/вывода данных
15 A Вывод питания подсветки “+”
16 K Вывод питания подсветки “-”

Вход VO предназначен для регулировки контрастности экрана, которая зависит от величины напряжения на входе, обычно для этих целей устанавливается переменный резистор сопротивлением 10-20 кОм, подключенный к линии питания. С помощью входов RS, R/W выбирается тип инструкций и направление передачи данных. Вход тактирования E предназначен для “защелкивания” (фиксации) состояний входов и линий ввода/вывода, ввод инструкций в контроллер дисплея, а также считывание данных происходит по спаду сигнала (задний фронт). Линии DB7-DB0 представляют собой 8-битный интерфейс ввода/вывода данных, за один период тактового импульса передается 1 байт данных. Выводы A и K представляют собой анод и катод светодиода подсветки, на плате дисплея установлен токоограничивающий резистор.

Ниже в таблице представлены команды для управления LCD 1602:

Описание инструкции Код инструкции Время выполнения
RS R/W DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
1 Очистка дисплея с установкой курсора в начало первой строки 0 0 0 0 0 0 0 0 0 1 1,53 мс
2 Установка курсора в начало первой строки 0 0 0 0 0 0 0 0 1 1,53 мс
3 Установка направления вывода символов, разрешение сдвига экрана 0 0 0 0 0 0 0 1 I/D SH 39 мкс
4 Управление режимом питания дисплея и отображением курсора 0 0 0 0 0 0 1 D C B 39 мкс
5 Команда сдвига курсора и экрана 0 0 0 0 0 1 S/C R/L 39 мкс
6 Настройка интерфейса ввода/вывода данных, количества строк для вывода символов, размера шрифта 0 0 0 0 1 DL N F 39 мкс
7 Запись адреса CGRAM памяти в адресный указатель 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 39 мкс
8 Запись адреса DDRAM памяти в адресный указатель 0 0 1 AC6 AC5 AC4 AC3 AC2 AC1 AC0 39 мкс
9 Команда чтения флага занятости и адресного указателя 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 0 мкс
10 Запись данных во внутреннюю память дисплея 1 0 D7 D6 D5 D4 D3 D2 D1 D0 43 мкс
11 Чтение данных из внутренней памяти дисплея 1 1 D7 D6 D5 D4 D3 D2 D1 D0 43 мкс

Назначение битов представлено в следующей таблице:

Бит Значение Описание
I/D 0 Вывод символов справа-налево, декремент адресного указателя DDRAM/CGRAM памяти
1 Вывод символов слева-направо, инкремент адресного указателя DDRAM/CGRAM памяти
SH 0 Запрет сдвига экрана при выводе символов
1 Разрешение сдвига экрана при выводе символов
D 0 Выключить экран дисплея, сегменты погашены, содержимое внутренней памяти сохраняется
1 Включить экран дисплея, нормальный режим работы
C 0 Отключить отображение курсора
1 Включить отображение курсора
B 0 Отключить функцию мигания курсора
1 Включить функцию мигания курсора
S/C 0 Выбрать курсор для сдвига
1 Выбрать экран (вместе с курсором) для сдвига
R/L 0 Сдвиг влево (только курсор или весь экран, зависит от бита S/C)
1 Сдвиг вправо (только курсор или весь экран, зависит от бита S/C)
DL 0 4-битный интерфейс ввода/вывода данных
1 8-битный интерфейс ввода/вывода данных
N 0 Использовать одну строку для вывода символов
1 Задействовать 2 строки для вывода символов
F 0 Размер шрифта 5×8 пикселей
1 Размер шрифта 5×11 пикселей
BF 0 Контроллер дисплея готов к обработке новой команды
1 Контроллер дисплея занят выполнением внутренних операций

Дисплей можно подключить к микроконтроллеру используя все линии ввода/вывода, то есть через 8-битный интерфейс, но для этого потребуется значительное количество выводов микроконтроллера. Можно сократить количество выводов, если переключиться на 4-битный интерфейс (инструкция №6 из таблицы), в этом режиме задействованы линии ввода/вывода DB7-DB4, линии DB3-DB0 становятся неактивными. В этом случае 1 байт данных передается за два тактовых импульса, сначала старшие 4 бита, затем младшие.

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

Внутренняя память LCD 1602 подразделяется на 3 вида: DDRAM, CGROM и CGRAM. Область DDRAM (Display Data RAM) памяти используется для хранения 8-битного кода ASCII символов, отображаемых на экране. Адреса регистров DDRAM памяти связаны с положением символов на экране, соответствие приведено в следующей таблице:

Адреса ячеек
1-я строка 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
2-я строка 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F

На каждой строке экрана умещается 16 символов, но это только видимая область, общий объем DDRAM памяти составляет 80 байт, то есть в каждую строку можно записать по 40 символов, и только 16 из них будут отображаться на экране, остальные символы останутся в невидимой области. С помощью команды сдвига экрана (инструкция №5) можно просмотреть все остальные символы, наподобие эффекта бегущей строки. Регистры с адресами 0x00-0x27 составляют первую строку, ячейки 0x40-0x67 вторую строку. Если задать только одну строку для вывода (бит N=0 в инструкции №6, при этом будет использована 1-я строка), то длина строки увеличиться, и будет вмещать 80 символов.

Память CGROM (Character Generator ROM) представляет собой знакогенератор и содержит данные для прорисовки ASCII символов. В памяти заложены спецзнаки, цифры, латинский алфавит, если не ошибаюсь, имеются китайские иероглифы, а также символы греческого алфавита, которые используются для обозначения физических величин. Каждый символ занимает 5 байт в памяти, что соответствует размеру шрифта 5×8 пикселей. На следующей картинке представлена таблица символов в соответствии с ASCII кодами:
LCD 1602 таблица символов
Кириллица в LCD 1602 не заложена, что не удивительно, ведь это китайский дисплей, но существуют аналогичные отечественные дисплеи фирмы МЭЛТ с поддержкой русского алфавита.

Для вывода символа необходимо записать адрес регистра DDRAM памяти в адресный указатель (инструкция №8), тем самым выбрав положение символа на экране, затем записать в выбранный регистр код ASCII символа (инструкция №10), исходя из полученного кода, контроллер дисплея извлекает данные из CGROM памяти для прорисовки символа в заданном положении на экране. После вывода символа, адресный указатель автоматически инкрементируется или декрементируется, в зависимости от того, какое значение было задано биту направления I/D. Таким образом, символы можно выводить последовательно, при этом корректировка адреса DDRAM памяти не требуется. Например, если первая строка полностью заполнится символами, то произойдет переход на вторую строку, и наоборот.

Энергонезависимая память CGRAM (Character Generator RAM) предназначена для создания уникальных символов под нужды разработчика. Объем памяти небольшой, и позволяет хранить 8 произвольных символов. Для создания одного символа размером 5×8 пикселей, необходимо передать 8 байт данных в регистры памяти. На картинке ниже изображена структура CGRAM памяти и пример расположения символов:
LCD 1602 CGRAM память
Перед созданием символа необходимо записать адрес регистра CGRAM памяти в адресный указатель (инструкция №8), далее передать байты данных, которые составят изображение символа (инструкция №10), адресный указатель автоматически инкрементируется/декрементируется (в зависимости от бита I/D), как и в случае DDRAM памяти. В создании символа участвуют только 5 младших битов байта данных. Символам присваиваются коды 0x00-0x07 в соответствии с их расположением в памяти CGRAM, они отображены в ранее приведенной таблице символов.

Инициализация LCD 1602

После подачи питания необходимо провести инициализацию дисплея для корректного функционирования, в этой статье я не стану рассматривать 8-битный интерфейс передачи данных, так как все операции с LCD 1602 по I2C интерфейсу выполняются в 4-битном режиме. Порядок инструкций для инициализации представлен на следующей картинке:
Инициализация LCD 1602
После инициализации дисплей настроен на использование 2-х строк, экран очищен от мусора, курсор установлен в начало первой строки (адрес DDRAM памяти 0x00), отображение курсора отключено, выбран шрифт 5×8 пикселей, направление вывода символов слева-направо, сдвиг экрана при выводе символов запрещен.

Если разрешить сдвиг экрана при выводе символов (бит SH=1), то с каждым новым символом экран будет сдвигаться в выбранном направлении, то есть новые символы будут появляться в заданном положении на экране, а остальные сдвигаться.

Дополнительно на экране можно включить отображение курсора (бит C=1), который выглядит в виде линии подчеркивания, и может мигать в зависимости от настроек. Положение курсора на экране соответствует текущему адресу DDRAM памяти в адресном указателе. Курсор можно сдвигать по экрану (инструкция №5), при этом адресный указатель будет инкрементироваться/декрементироваться в зависимости от направления сдвига.

Подключение LCD 1602 через I2C интерфейс

Специально для дисплея, в продаже имеется модуль-переходник на основе микросхемы PCF8574AT, которая предназначена для расширения количества линий ввода/вывода. Микросхема подключается по I2C интерфейсу и имеет порт из 8 линий ввода/вывода, принцип функционирования простой, при записи байта данных в микросхему, линии порта принимают уровни, соответствующие значениям битов полученного байта. Операция чтения возвращает байт данных, биты которого указывают состояние линий порта. Таким образом, микросхема позволяет расширить количество линий ввода/вывода, используя два управляющих провода. Фото модуля представлено ниже:
Модуль PCF8574 I2C
Заказать модуль можно тут. На модуле установлен подстроечный резистор для регулировки контрастности экрана, также имеется джампер (перемычка), разрешающий управление подсветкой дисплея, о котором будет сказано позже.

На следующей картинке приведена схема подключения LCD 1602 и I2C модуля:
Подключение LCD 1602 по I2C интерфейсу
Адрес микросхемы PCF8574AT на шине I2C можно настраивать, старшие 4 бита адреса фиксированы, и равны 0111, младшие 3 бита зависят от состояния входов микросхемы A2-A0. На модуле данные входы подтянуты к высокому уровню, соответственно адрес микросхемы принимает значение 0111111.

Как видно из схемы, к микросхеме подключена только часть линий ввода/вывода дисплея DB7-DB4, это означает, что управление дисплеем возможно только через 4-битный интерфейс. Для ввода инструкции в дисплей требуется 2 тактовых импульса на линии E, то есть последовательность уровней 1010 (“защелкивание” данных происходит по спаду уровня), в итоге необходимо записать в микросхему 4 байта для одной инструкции. На картинке ниже приведен пример записи инструкции в дисплей по интерфейсу I2C:
Передача данных LCD 1602 через PCF8574
Сначала передается старший полубайт инструкции с битом E=1, затем то же самое с битом E=0, при этом в дисплей передается первая половина инструкции. Далее таким же образом передается вторая половина (младший полубайт).

Для управления подсветкой дисплея, на плате модуля установлен транзистор, подключенный к линии P3 микросхемы. Таким образом, 3-й бит в байте данных управляет подсветкой, 0 – выключена, 1 – включена. При отсутствии джампера (о котором я писал выше) подсветка отключается, независимо от бита управления.

Я подключил дисплей с модулем к микроконтроллеру PIC16F628A, схема представлена ниже:
Схема подключения LCD 1602 по интерфейсу I2C
Кнопка SB1 управляет подсветкой дисплея, светодиод HL1 загорается в случае ошибки передачи данных. Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):

Микроконтроллер настроен на внутренний тактовый генератор с частотой 4 МГц. После настройки внутренних регистров, выполняется включение подсветки дисплея, после чего вызывается подпрограмма инициализации дисплея, порядок инструкций для инициализации я приводил выше. Далее в первой строке выводится надпись “Radiolaba.ru”, на второй строке “LCD 1602A”, затем выполняется сдвиг экрана влево на 16 позиций, то есть для отображения выбирается свободная область DDRAM памяти. Здесь в продолжение первой строки выводится надпись “PCF8574AT”, и для второй строки “I2C bus”. Далее выполняется круговой цикл, где экран поочередно сдвигается на 16 позиций вправо и влево. Таким образом, можно просмотреть все символы записанные в DDRAM память. Одновременно в цикле выполняется опрос кнопки подсветки SB1.

Для установки адреса DDRAM памяти (позиция на экране) вызывается подпрограмма lcd_adr, для записи данных в дисплей — подпрограмма lcd_dat. Подпрограмма lcd_comm используется для записи команды, для установки адреса CGRAM памяти – lcd_cgram. Включение и выключение подсветки – подпрограммы lcd_led_on и lcd_led_off.

Инструкции очистки дисплея и возврата курсора выполняются значительно дольше остальных, поэтому, после передачи этих инструкций в дисплей, в коде выполняется пауза на 2 мс.

У дисплея имеются некоторые особенности, при смене количества используемых строк, меняется контрастность экрана, то есть она не одинакова для однострочного и двухстрочного режима. Шрифт 5×10 в дисплее не заложен, хотя команда настройки размера имеется, судя по матрице, она физически не предназначена для такого шрифта.
LCD 1602 макетная плата
На следующем видеоролике представлен пример вывода символов на дисплей:

Прошивка МК и исходник для подключения LCD 1602

Последние записи:

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

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