Универсальная библиотека LiquidCrystal_I2C на базе расширителя портов PCF8574

Sep 04, 2016 22:58

Плод месячного курения манула на Hitachi HD44780U и ему подобным клонам. А их не мало - S6A0069, KS0066U, NT3881D, LC7985, ST7066, SPLC780, WH160xB, AIP31066... Библиотека работает с любыми модулями на PCF8574 и PCF8574A.





внешний вид китайского модуля на PCF8574



схема китайского модуля на PCF8574



нумерация и описание портов Hitachi HD4478U
Моя писанина получилась компактнее и на 25% быстрее многочисленной копипасты с GitHub-а. С AVR-ом на 16МГц и частотой I2C шины 100КГц выдает 1088мкс. Копипаста из менеджера закачек только 1458мкс. Еще одно достоинство универсальность - можно переназначать контакты, если у вас нестандартный модуль или экран.

Рассмотрим строку инициализации поближе:

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 4, 5, 6, 16, 11, 12, 13, 14, POSITIVE);

Запись означает:
- 4-й пин LCD подключен к поту P0 (4 ноге) PCF8574
- 5-й пин LCD подключен к поту P1 (5 ноге) PCF8574
- 6-й пин LCD подключен к поту P2 (6 ноге) PCF8574
- 16-й пин LCD подключен к поту P3 (7 ноге) PCF8574
- и тд ...

Теперь представим, что на вашем модуле перепутаны два контакта:
- 14-й пин LCD подключен к поту P0 (4 ноге) PCF8574
‐ 4-й пин LCD подключен к поту P7 (12 ноге) PCF8574

Тогда строка инициализации модуля будет выглядеть так:

LiquidCrystal_I2C lcd(PCF8574_ADDR_A21_A11_A01, 14, 5, 6, 16, 11, 12, 13, 4, POSITIVE);

Переменная "POSITIVE" означает, что транзистор Q1 типа NPN и для включения подсветки нужен положительный потенциал. Если не зажглась, то скорее всего у вас PNP транзистор и нужно заменить переменную "POSITIVE" на "NEGATIVE".

В библиотеке забиты все возможные адреса для чипов PCF8574 и PCF8574A:

PCF8574_ADDR_A21_A11_A01
PCF8574_ADDR_A21_A11_A00
PCF8574_ADDR_A21_A10_A01
PCF8574_ADDR_A21_A10_A00
PCF8574_ADDR_A20_A11_A01
PCF8574_ADDR_A20_A11_A00
PCF8574_ADDR_A20_A10_A01
PCF8574_ADDR_A20_A10_A00

PCF8574A_ADDR_A21_A11_A01
PCF8574A_ADDR_A21_A11_A00
....
....
....
PCF8574A_ADDR_A20_A10_A00

Разберем, что это значит. В правом нижнем углу модуля есть 3-и контактные площадки A0, A1, A2. Теперь глянем на схему модуля, по умолчанию эти контакты подтянуты к питанию через резисторы R4, R5, R6. Это соответствует логической единице на всех трех пинах - A0=1, A1=1, A2=1. Для такой конфигурации текущий адрес будет:

PCF8574_ADDR_A21_A11_A01

Если соединить верхнюю и нижнюю контактную площадки A2, то мы закоротим ее на землю и получаем логический ноль. Состояние на всех трех контактах - A0=1, A1=1, A2=0. Текущий адрес:

PCF8574_ADDR_A20_A11_A01

Написал сумбурно, но пока так. Будет время добавлю про плюшки подробнее. Больше примеров в библиотеке. Забирать тут.

UDP: Оказывается у дисплея есть тестовый режим. Если подключить только питание, на исправном экране должны появиться прямоугольники. Только в первой строке - дисплей не инициализирован. Если в двух/четырех - инициализация прошла, но слишком большая контрастность.



тестовый режим HD44780

UDP: В качества ликбеза очень полезная статья про подтяжку линий SDA и SCL.

UDP: Исправил мелкие баги, чуть-чуть уменьшил код, добавил поддержку Arduino STM32.

UDP: Похоже многие свалились с луны и не знают, что для нормальной работы I2C шины линии SDA и SCL должны быть подтянуты к питанию. Почему, читаем тут и тут.

UDP: Just for fun писал в дисплей на больших скоростях. Мой экземпляр спокойно переварил 600КГц.

UDP: Библиотека умеет регулировать яркость подсветки с помощью ШИМ-а. Что куда подключать смотри тут.

#arduino, arduino, #товарыизкитая

Previous post Next post
Up