Подключение LCD 1602 по I2C интерфейсу
Содержание
- Описание и команды управления LCD 1602
- Инициализация LCD 1602
- Подключение LCD 1602 через I2C интерфейс
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 не заложена, что не удивительно, ведь это китайский дисплей, но существуют аналогичные отечественные дисплеи фирмы МЭЛТ с поддержкой русского алфавита.
Для вывода символа необходимо записать адрес регистра DDRAM памяти в адресный указатель (инструкция №8), тем самым выбрав положение символа на экране, затем записать в выбранный регистр код ASCII символа (инструкция №10), исходя из полученного кода, контроллер дисплея извлекает данные из CGROM памяти для прорисовки символа в заданном положении на экране. После вывода символа, адресный указатель автоматически инкрементируется или декрементируется, в зависимости от того, какое значение было задано биту направления I/D. Таким образом, символы можно выводить последовательно, при этом корректировка адреса DDRAM памяти не требуется. Например, если первая строка полностью заполнится символами, то произойдет переход на вторую строку, и наоборот.
Энергонезависимая память CGRAM (Character Generator RAM) предназначена для создания уникальных символов под нужды разработчика. Объем памяти небольшой, и позволяет хранить 8 произвольных символов. Для создания одного символа размером 5×8 пикселей, необходимо передать 8 байт данных в регистры памяти. На картинке ниже изображена структура CGRAM памяти и пример расположения символов:
Перед созданием символа необходимо записать адрес регистра CGRAM памяти в адресный указатель (инструкция №8), далее передать байты данных, которые составят изображение символа (инструкция №10), адресный указатель автоматически инкрементируется/декрементируется (в зависимости от бита I/D), как и в случае DDRAM памяти. В создании символа участвуют только 5 младших битов байта данных. Символам присваиваются коды 0x00-0x07 в соответствии с их расположением в памяти CGRAM, они отображены в ранее приведенной таблице символов.
Инициализация LCD 1602
После подачи питания необходимо провести инициализацию дисплея для корректного функционирования, в этой статье я не стану рассматривать 8-битный интерфейс передачи данных, так как все операции с LCD 1602 по I2C интерфейсу выполняются в 4-битном режиме. Порядок инструкций для инициализации представлен на следующей картинке:
После инициализации дисплей настроен на использование 2-х строк, экран очищен от мусора, курсор установлен в начало первой строки (адрес DDRAM памяти 0x00), отображение курсора отключено, выбран шрифт 5×8 пикселей, направление вывода символов слева-направо, сдвиг экрана при выводе символов запрещен.
Если разрешить сдвиг экрана при выводе символов (бит SH=1), то с каждым новым символом экран будет сдвигаться в выбранном направлении, то есть новые символы будут появляться в заданном положении на экране, а остальные сдвигаться.
Дополнительно на экране можно включить отображение курсора (бит C=1), который выглядит в виде линии подчеркивания, и может мигать в зависимости от настроек. Положение курсора на экране соответствует текущему адресу DDRAM памяти в адресном указателе. Курсор можно сдвигать по экрану (инструкция №5), при этом адресный указатель будет инкрементироваться/декрементироваться в зависимости от направления сдвига.
Подключение LCD 1602 через I2C интерфейс
Специально для дисплея, в продаже имеется модуль-переходник на основе микросхемы PCF8574AT, которая предназначена для расширения количества линий ввода/вывода. Микросхема подключается по I2C интерфейсу и имеет порт из 8 линий ввода/вывода, принцип функционирования простой, при записи байта данных в микросхему, линии порта принимают уровни, соответствующие значениям битов полученного байта. Операция чтения возвращает байт данных, биты которого указывают состояние линий порта. Таким образом, микросхема позволяет расширить количество линий ввода/вывода, используя два управляющих провода. Фото модуля представлено ниже:
Заказать модуль можно тут . На модуле установлен подстроечный резистор для регулировки контрастности экрана, также имеется джампер (перемычка), разрешающий управление подсветкой дисплея, о котором будет сказано позже.
На следующей картинке приведена схема подключения LCD 1602 и I2C модуля:
Адрес микросхемы PCF8574AT на шине I2C можно настраивать, старшие 4 бита адреса фиксированы, и равны 0111, младшие 3 бита зависят от состояния входов микросхемы A2-A0. На модуле данные входы подтянуты к высокому уровню, соответственно адрес микросхемы принимает значение 0111111.
Как видно из схемы, к микросхеме подключена только часть линий ввода/вывода дисплея DB7-DB4, это означает, что управление дисплеем возможно только через 4-битный интерфейс. Для ввода инструкции в дисплей требуется 2 тактовых импульса на линии E, то есть последовательность уровней 1010 (“защелкивание” данных происходит по спаду уровня), в итоге необходимо записать в микросхему 4 байта для одной инструкции. На картинке ниже приведен пример записи инструкции в дисплей по интерфейсу I2C:
Сначала передается старший полубайт инструкции с битом E=1, затем то же самое с битом E=0, при этом в дисплей передается первая половина инструкции. Далее таким же образом передается вторая половина (младший полубайт).
Для управления подсветкой дисплея, на плате модуля установлен транзистор, подключенный к линии P3 микросхемы. Таким образом, 3-й бит в байте данных управляет подсветкой, 0 – выключена, 1 – включена. При отсутствии джампера (о котором я писал выше) подсветка отключается, независимо от бита управления.
Я подключил дисплей с модулем к микроконтроллеру PIC16F628A, схема представлена ниже:
Кнопка SB1 управляет подсветкой дисплея, светодиод HL1 загорается в случае ошибки передачи данных. Неполный код программы приведен ниже (полную версию можно скачать в конце статьи):
Источник: