Підключення LCD екрану LCM1602 з I2C до Arduino. Підключення LCD екрану LCM1602 з I2C до Arduino Підключення lcd 1602 по i2c інтерфейсу

LCD дисплей- Частий гість у проектах Ардуїно. Але в складних схемах у нас може виникнути проблема нестачі портів Arduino через необхідність підключити екран, який має дуже багато контактів. Виходом у цій ситуації може стати I2C /IICперехідник, який підключає практично стандартний для Arduino екран 1602 до плат Uno, Nano або Mega лише за допомогою 4 пінів. У цій статті ми подивимося, як можна підключити LCD екран з інтерфейсом I2C, які можна використовувати бібліотеки, напишемо короткий приклад і розберемо типові помилки.

Рідкокристалічний дисплей (Liquid Crystal Display) LCD 1602є гарним вибором для виведення рядків символів у різних проектах. Він коштує недорого, є різні модифікації з різними кольорами підсвічування, ви можете легко завантажити готові бібліотеки для скетч Ардуїно. Але найголовнішим недоліком цього екрану є той факт, що дисплей має 16 цифрових висновків, з яких обов'язковими є мінімум 6. Тому використання цього екрану LCD без i2c додає серйозні обмеження для плат Arduino Uno або Nano. Якщо контактів не вистачає, вам доведеться купувати плату Arduino Mega або ж заощадити контакти, в тому числі за рахунок підключення дисплея через i2c.

Короткий опис пінів LCD 1602

Давайте подивимося на висновки LCD1602 уважніше:

Кожен із висновків має своє призначення:

  1. Земля GND;
  2. Харчування 5;
  3. Встановлення контрастності монітора;
  4. Команда, дані;
  5. Записування та читання даних;
  6. Enable;

7-14. Лінії даних;

  1. Плюс підсвічування;
  2. Мінус підсвічування.

Технічні характеристики дисплея:

  • Символьний тип відображення є можливість завантаження символів;
  • Світлодіодна підсвітка;
  • Контролер HD44780;
  • Напруга живлення 5В;
  • Формат 16х2 символів;
  • Діапазон робочих температур від -20°С до +70°С, діапазон температур зберігання від -30°С до +80°С;
  • Кут огляду 180 градусів.

Схема підключення LCD до плати Ардуїно без i2C

Стандартна схема приєднання монітора безпосередньо до мікроконтролера Ардуїно без I2C виглядає так.

Через велику кількість контактів, що підключаються, може не вистачити місця для приєднання потрібних елементів. Використання I2C зменшує кількість дротів до 4, а зайнятих пінів до 2.

Де купити LCD екрани та шилди для ардуїно

LCD екран 1602 (і варіант 2004) досить популярний, тому ви без проблем зможете знайти його як у вітчизняних інтернет магазинах, так і на закордонних майданчиках. Наведемо кілька посилань на найдоступніші варіанти:

Модуль LCD1602+I2C із синім екраном, сумісний з Arduino Простий дисплей LCD1602 (зелене підсвічування) дешевше 80 рублів Великий екран LCD2004 з I2C HD44780 для ардуїно (синє та зелене підсвічування)
Дисплей 1602 з IIC адаптером та синім підсвічуванням Ще один варіант LCD1602 із впаяним I2C модулем Модуль адаптера Port IIC/I2C/TWI/SPI для екрана 1602, сумісний з Ардуїно
Дисплей з RGB-підсвічуванням! LCD 16×2 + keypad +Buzzer Shield for Arduino Шилд для Ардуїно з кнопками та екраном LCD1602 LCD 1602 LCD дисплей для 3D принтера (Smart Controller for RAMPS 1.4, Text LCD 20×4), модулем кардрідера SD та MicroSD-

Опис протоколу I2C

Перш ніж обговорювати підключення дисплея до ардуїно через i2c-перехідник, коротко поговоримо про сам протокол i2C.

I2C/IIC(Inter-Integrated Circuit) – це протокол, що спочатку створювався для зв'язку інтегральних мікросхем усередині електронного пристрою. Розробка належить фірмі Philips. В основі i2c протоколу є використання 8-бітної шини, яка потрібна для зв'язку блоків в електроніці, що управляє, і системі адресації, завдяки якій можна спілкуватися по одним і тим же проводам з декількома пристроями. Ми просто надаємо дані то одному, то іншому пристрою, додаючи до пакетів даних ідентифікатор потрібного елемента.

Найпростіша схема I2C може містити один провідний пристрій (найчастіше це мікроконтролер Ардуїно) та кілька ведених (наприклад, дисплей LCD). Кожен пристрій має адресу в діапазоні від 7 до 127. Двох пристроїв з однаковою адресою в одній схемі не повинно бути.

Плата Arduino підтримує i2c на апаратному рівні. Ви можете використовувати піни A4 та A5 для підключення пристроїв за цим протоколом.

У роботі I2C можна виділити кілька переваг:

  • Для роботи потрібно лише 2 лінії – SDA (лінія даних) та SCL (лінія синхронізації).
  • Підключення великої кількості провідних приладів.
  • Зменшення часу розробки.
  • Для керування всім набором пристроїв потрібен лише один мікроконтролер.
  • Можливе число мікросхем, що підключаються, до однієї шини обмежується тільки граничною ємністю.
  • Висока ступінь збереження даних через спеціальний фільтр пригнічує сплески, вбудованого в схеми.
  • Проста процедура діагностики збоїв, що виникають, швидке налагодження несправностей.
  • Шина вже інтегрована в саму Arduino, тому не потрібно додатково розробляти шинний інтерфейс.

Недоліки:

  • Існує ємнісне обмеження на лінії – 400 пФ.
  • Важке програмування контролера I2C, якщо на шині є кілька різних пристроїв.
  • При велику кількість пристроїв виникає труднощі локалізації збою, якщо один з них помилково встановлює стан низького рівня.

Модуль i2c для LCD 1602 Arduino

Найшвидший та найзручніший спосіб використання i2c дисплея в ардуїно – це покупка готового екрану з вбудованою підтримкою протоколу. Але таких екранів не дуже вистають вони не дешево. А ось різноманітних стандартних екранів випущено вже величезну кількість. Тому найдоступнішим і найпопулярнішим сьогодні варіантом є купівля та використання окремого I2C модуля – перехідника, який виглядає ось так:

З одного боку модуля ми бачимо висновки i2c – земля, живлення та 2 для передачі даних. З іншого перехідника бачимо роз'єми зовнішнього живлення. І, природно, на платі є безліч ніжок, за допомогою яких модуль припаює до стандартних висновків екрану.


Для підключення до плати Ардуїно використовуються i2c виходи. Якщо потрібно, підключаємо зовнішнє живлення для підсвічування. За допомогою вбудованого підстроювального резистора ми можемо налаштувати настроювання контрастності J

На ринку можна зустріти LCD 1602 модулі з припаяними перехідниками, їх використання максимально упощено. Якщо ви купили окремий перехідник, потрібно буде заздалегідь припаяти його до модуля.

Підключення РК екрану до Ардуїно за I2C

Для підключення необхідні сама плата Ардуїно, дисплей, макетна плата, з'єднувальні дроти та потенціометр.

Якщо ви використовуєте спеціальний окремий i2c перехідник, потрібно спочатку припаяти його до модуля екрана. Помилитись там важко, можете керуватися такою схемою.


Рідкокристалічний монітор з підтримкою i2c підключається до плати за допомогою чотирьох дротів – два дроти для даних, два дроти для живлення.

  • Висновок GND підключається до GND на платі.
  • Висновок VCC – на 5V.
  • SCL підключається до піну A5.
  • SDA підключається до піну A.

І це все! Жодних павутин проводів, в яких дуже легко заплутатися. При цьому всю складність реалізації протоколу i2C ми можемо просто довірити бібліотекам.

Бібліотеки для роботи з i2c LCD дисплеєм

Для взаємодії Arduino c LCD 1602 по шині I2C вам знадобиться як мінімум дві бібліотеки:

  • Бібліотека Wire.h для роботи з I2C вже є у стандартній програмі Arduino IDE.
  • Бібліотека LiquidCrystal_I2C.h, яка включає велику різноманітність команд для управління монітором по шині I2C і дозволяє зробити скетч простіше і коротше. Потрібно додатково встановити бібліотеку Після підключення екрана потрібно додатково встановити бібліотеку LiquidCrystal_I2C.h

Після підключення до скетчу всіх необхідних бібліотек ми створюємо об'єкт і можемо використовувати його функції. Для тестування завантажимо наступний стандартний скетч з прикладу.

#include #include // Підключення бібліотеки //#include // Підключення альтернативної бібліотеки LiquidCrystal_I2C lcd(0x27,16,2); // Вказуємо I2C адресу (найпоширеніше значення), і навіть параметри екрана (у разі LCD 1602 - 2 рядки по 16 символів у кожному //LiquidCrystal_PCF8574 lcd(0x27); // Варіант для бібліотеки PCF8574 void setup() ( lcd.init (); // Ініціалізація дисплея lcd.backlight(); // Підключення підсвічування lcd.setCursor(0,0); // Встановлення курсору на початок першого рядка lcd.print("Hello"); // Набір тексту на першому рядку lcd.setCursor(0,1); // Встановлення курсору на початок другого рядка lcd.print("ArduinoMaster"); // Набір тексту на другому рядку ) void loop() ( )

Опис функцій та методів бібліотеки LiquidCrystal_I2C:

  • home() і clear() – перша функція дозволяє повернути курсор на початок екрана, друга теж, але при цьому видаляє все, що було на моніторі до цього.
  • write(ch) – дозволяє вивести одиночний символ ch на екран.
  • cursor() та noCursor() – показує/приховує курсор на екрані.
  • blink() і noBlink() – курсор блимає/не блимає (якщо раніше було включено його відображення).
  • display() та noDisplay() – дозволяє підключити/вимкнути дисплей.
  • scrollDisplayLeft() та scrollDisplayRight() – прокручує екран на один знак ліворуч/праворуч.
  • autoscroll() та noAutoscroll() – дозволяє увімкнути/вимкнути режим автопрокручування. У цьому режимі кожен новий символ записується в тому самому місці, витісняючи раніше написане на екрані.
  • leftToRight() і rightToLeft() – Встановлення напряму виведеного тексту – зліва направо або праворуч наліво.
  • createChar(ch, bitmap) – створює символ із кодом ch (0 – 7), використовуючи масив бітових масок bitmap для створення чорних та білих точок.

Альтернативна бібліотека для роботи з дисплеєм i2c

У деяких випадках при використанні зазначеної бібліотеки з пристроями, оснащеними контролерами PCF8574, можуть виникати помилки. У цьому випадку альтернативою можна запропонувати бібліотеку LiquidCrystal_PCF8574.h. Вона розширює LiquidCrystal_I2C, тому проблем із її використанням не повинно бути.

Проблеми підключення i2c lcd дисплея

Якщо після завантаження скетча у вас не з'явиться жодного напису на дисплеї, спробуйте виконати такі дії.

По-перше, можна збільшити чи зменшити контрастність монітора. Часто символи просто не видно через режим контрастності та підсвічування.

Якщо це не допомогло, перевірте правильність підключення контактів, чи підключено живлення підсвічування. Якщо ви використовували окремий i2c перехідник, перевірте ще раз якість паяння контактів.

Іншою частою причиною відсутності тексту на екрані може стати неправильна i2c адреса. Спробуйте спочатку поміняти в скетчі адресу пристрою з 0x27 0x20 або 0x3F. У різних виробників можуть бути різні адреси за замовчуванням. Якщо це не допомогло, можете запустити скетч i2c сканера, який переглядає всі підключені пристрої та визначає їх адресу методом перебору. Приклад скетчу i2c сканера.

Якщо екран все ще залишиться неробочим, спробуйте відпаяти перехідник та підключити LCD звичайним чином.

Висновок

У цій статті ми розглянули основні питання використання LCD екрану у складних проектах Ардуїно, коли нам потрібно економити вільні піни на платі. Простий і недорогий перехідник i2c дозволить підключити LCD екран 1602, займаючи всього 2 аналогові піни. У багатьох ситуаціях це може бути дуже важливим. Плата за зручність – необхідність використання додаткового модуля – конвертера та бібліотеки. На наш погляд, зовсім не висока ціна за зручність і ми рекомендуємо використовувати цю можливість у проектах.

LCD I2C модуль дозволить підключити символьний дисплей до плати Arduino лише за двома сигнальними проводами.

Використовувані компоненти (купити у Китаї):

. Керівна плата

. З'єднувальні дроти

Основні технічні характеристики:

Дисплей: Символьний 16х02 або 20x04
. Підсвічування: Синє з білими символами
. Контраст: Налаштовується потенціометром
. Напруга живлення: 5В
. Інтерфейс: I2C
. I2C адреса: 0x27
. Розміри: 82мм x 35мм x 18мм

Підключення до Arduino

Модуль обладнаний чотири-піновим роз'ємом стандарту 2.54мм

SCL: послідовна лінія тактування (Serial CLock)

SDA: послідовна лінія даних (Serial DAta)

VCC: "+" харчування

GND: "-" живлення

Висновки відповідають за інтерфейс I2C на платах Arduino на базі різних контролерів різняться

Для роботи з цим модулем необхідно встановити бібліотеку LiquidCrystal_I2C1602V1

Завантажуємо, розпаковуємо та закидаємо в папку libraries у папці Arduino. Якщо на момент додавання бібліотеки, Arduino IDE була відкритою, перезавантажуємо середовище.

Переходимо безпосередньо до скетчу. У цьому прикладі виведемо стандартний "Hello, world!" і на адресу нашої спільноти.

приклад програмного коду:

#include #include LiquidCrystal_I2C lcd(0x27,16,2); /* Задаємо адресу та розмірність дисплея. При використанні LCD I2C модуля з дисплеєм 20х04 нічого в коді змінювати не потрібно, слід тільки задати правильну розмірність */ void setup() (lcd.init(); // Ініціалізація lcd lcd.backlight(); // Включаємо підсвічування // Курсор знаходиться на початку 1 рядка lcd.print ("Hello, world!"); // Виводимо текст lcd.setCursor (0, 1); // Встановлюємо курсор на початок 2 рядка lcd.print ("сайт"); // Виводимо текст) void loop () { }

Створення власних символів

З виведенням тексту розібралися, літери англійського алфавіту зашиті в пам'ять контролера всередині дисплея і проблем немає. А ось що робити, якщо потрібного символу в пам'яті контролера немає?

Не біда, потрібний символ можна зробити вручну. Даний спосіб частково, обмеження 7 символів, допоможе вирішити проблему виведення.

Комірка, в дисплеях, що розглядаються нами, має роздільну здатність 5х8 крапок. Все, до чого зводиться завдання створення символу, це написати бітову маску і розставити в ній одиниці в місцях, де мають горіти точки і нулі де немає.

У наведеному нижче прикладі намалюємо смайлик.

приклад програмного коду:

//Тестувалося на Arduino IDE 1.0.5 // Додаємо необхідні бібліотеки#include #include // Побутова маска символу посмішки byte smile = (B00010, B00001, B11001, B00001, B11001, B00001, B00010,); LiquidCrystal_I2C lcd(0x27,20,4); // Задаємо адресу та розмірність дисплея. void setup() (lcd.init(); // Ініціалізація lcd lcd.backlight(); // Включаємо підсвічування // Створюємо символ під номером 0 lcd.createChar (1, smile); lcd.setCursor (0, 0); // Встановлюємо курсор на початок 1 рядка lcd.print ("\1"); // Виводимо смайлик (символ під номером 1) - "\1") void loop () { }

Програма для створення символів

У коментарях учасник спільноти скинув посилання на генератор символів

Придбав я тут від гарного магазину Чіп Резістор черговий девайс для вивчення та застосування у корисних пристроях. Цей девайс виявився заточений для керування ЖК-дисплеєм під керуванням контролера HD44780, в 4-бітному режимі. Для цієї мети на платі встановлена ​​мікросхема , яка є перетворювачем шини I2C паралельний 8 бітний порт.

Плата розведена таким чином, щоб її можна було відразу схрестити з РК-дисплеєм. На вхід подається живлення та лінії I2C. На платі відразу встановлені підтягуючі резистори на лініях SCL та SDA, потенціометр для регулювання контрастності та живлення самого дисплея.

Джампер справа вмикає/вимикає підсвічування. Далі озброївшись тестером, була складена наступна табличка. Після вивчення модуля було виявлено що P3керує підсвічуванням. Якщо джампер встановлений, 1 включає підсвічування, а 0 вимикає. При знятому джампері підсвічування завжди вимкнене. Далі було прийнято рішення доповнити бібліотеку axlib функціями для роботи з шиною I2C (програмна реалізація) та функціями для керування мікросхемою PCF8574. Двома словами як працює модуль. Для того щоб вивести паралельно байт, для цього потрібно послати в шину I2C адресу мікросхеми (за умовчанням він дорівнює 0x4E. Також можна змінювати адресу методом впаювання перемичок на платі і змінюючи значення трьох молодших розрядів адреси), потім після отримання ACK посилається байт даних. Після того, як мікросхема відповідає ACK, байт з'являється на паралельному порту мікросхеми. Для управління РК-дисплеєм я взяв функції з бібліотеки axlib і трохи переробив їх для роботи з шиною I2C. #include #include #include #include #define ADD 0x4E // Адреса мікросхеми /* LCD Мікросхема RS P0 RW P1 EN P2 D4 P4 D5 P5 D6 P6 D7 P7 На ніжці P3 підключено підсвічування. 1 вкл., 0 вимк. */ // Виведення даних com | = 0x04; // Е в одиницю pcf8574_byte_out(com, ADD); // Виведення даних com &= 0xFB; // Є в нуль pcf8574_byte_out(com, ADD); // Виведення даних) void init (void) (_delay_ms (30); com(0x30); _delay_us(40); com(0x30); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x30); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x20); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x20); // Встановлення параметрів com(0x80); // Встановлення параметрів com(0x00); // Вимикаємо дисплей com(0x80); // Вимикаємо дисплей com(0x00); // Очищаємо дисплей com(0x10); // Очищаємо дисплей com(0x00); com(0x60); // Встановлюємо режим введення даних com(0x00); com(0xC0); // Включаємо дисплей з вибраним курсором) void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Передача старших 4 біт data_h |= 0x04; pcf8574_byte_out(data_h, ADD)); // Передача старших 4 біт // Передача старших 4 біт // Передача молодших 4 біт // Передача молодших 4 біт // Передача молодших 4 біт) void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) ) int main(void) ( init(); str_out("ЁPҐBET MҐP!" );while(1) ( ) )Власне, що тут відбувається. Спочатку підключаємо бібліотеки для I2C та PCF8574. Про I2C я писав вже, тому розпинатися ще раз на буду, а ось що в PCF8574.h я розповім. До складу бібліотеки увійшли лише три функції.
BYTE pcf8574_test(BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); i2c_stop(); return ask; )Першу функцію було написано для перевірки наявності пристрою на шині. В принципі її можна застосовувати для пошуку будь-якого пристрою, що знаходиться на шині. Функція приймає адресу пристрою і якщо він відповідає, то повертає нуль. Якщо пристрій з такою адресою немає на шині, поверне одиницю.
BYTE pcf8574_byte_out(BYTE data, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); if(!ask) ask = i2c_send_byte(data); )Ця функція вже заточена виключно під цю мікросхему. Як аргументи їй передаються байт для передачі в шину та адресу мікросхеми. Функція спочатку запросить мікросхему за адресою, а потім надішле байт. Якщо мікросхема отримала байт і відповіла ACK, то функція закінчить роботу з мікросхемою і поверне нуль, як вдала посилка байта. А мікросхема тим часом виведе цей байт у свій паралельний порт. Інакше отримаємо NACK та повернемо одиницю, передача провалилася.
BYTE pcf8574_str_out(BYTE *data, BYTE col, BYTE add) ( BYTE ask = ACK; add &= 0xFE; i2c_start(); ask = i2c_send_byte(add); for(BYTE i=0; i Ця функція призначена для експерименту. Приймає покажчик на масив однобайтових даних, кількість цих байт та адресу мікросхеми. Власне, спроба передати всі дані однією сесією, а не одним байтом за сесію. Функція працює, але так для РК-дисплея і не підійшла. А тепер повернімося до основної програми. Після підключення бібліотек прописуємо адресу мікросхеми. Далі створюємо три функції за аналогією з lcd.h. Відмінність лише у принципі передачі.
void com (BYTE com) (com | = 0x08; // Р3 на одиницю, щоб горіло підсвічування pcf8574_byte_out(com, ADD); // Виведення даних com | = 0x04; // Е в одиницю pcf8574_byte_out(com, ADD); // Виведення даних com &= 0xFB; // Є в нуль pcf8574_byte_out(com, ADD); // Виведення даних } Ця функція передає лише команди дисплея. Звідси з'явився перший рядок із логічним додаванням команди з 0х08. Ця бяка потрібна через те, що ми передаємо байт не прямо в порт РК-дисплея, а через наш ретранслятор. Тобто якщо ми подали байт, а потім нам потрібно вивести лише один біт, то будьте ласкаві до попереднього байта привласнить потрібний біт і вже його знову відправити в порт. Ось така проблема. Додавання з 0х08 необхідне постійного утримання одиниці третьому розряді. Пам'ятаєте про підсвічування? Ось саме це додавання і включає підсвічування. Після цього викликаємо функцію передачі байта в шину. Про неї написано вище. Потім передаємо байт по шині мікросхему. Далі слід виставити в одиницю Е, чим займається логічне складання байта з 0х04. Після обнулення Е. Таким чином можна надіслати будь-яку команду дисплею лише передавши як аргумент саму команду. void init(void) (_delay_ms(30); // Пауза після подачі харчування com(0x30); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x30); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x30); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x20); // Перехід у 4-бітний режим _delay_us(40); // Затримка до виконання команди com(0x20); // Встановлення параметрів com(0x80); // Встановлення параметрів com(0x00); // Вимикаємо дисплей com(0x80); // Вимикаємо дисплей com(0x00); // Очищаємо дисплей com(0x10); // Очищаємо дисплей com(0x00); // Встановлюємо режим введення даних com(0x60); // Встановлюємо режим введення даних com(0x00); // Включаємо дисплей з вибраним курсором com(0xC0); // Включаємо дисплей з вибраним курсором } Ця функція займається лише ініціалізацією дисплея. Послідовність команд взята з даташита на РК-дисплей. void char_out(BYTE data) ( BYTE data_h = ((data & 0xF0) + 0x09); BYTE data_l = ((data // Передача старших 4 біт data_h |= 0x04; pcf8574_byte_out(data_h, ADD)); // Передача старших 4 біт data_h &= 0xF9; pcf8574_byte_out(data_h, ADD); // Передача старших 4 біт pcf8574_byte_out(data_l, ADD); // Передача молодших 4 біт data_l | = 0x04; pcf8574_byte_out(data_l, ADD); // Передача молодших 4 біт data_l &= 0xF9; pcf8574_byte_out(data_l, ADD); // Передача молодших 4 біт } Ця функція передає дані РК дисплею. Виконується так само, як і команди за винятком того, що передача байта йде спочатку старшим напівбайтом, а потім молодшим. А решта теж саме. void str_out(BYTE *str) ( while((*str) != "\0") ( char_out(*str); str++; ) )Ну а ця функція чисто для передачі рядка дисплею. Власне до нашої теми вона жодного стосунку не має.

Проект для AtmelStudio 6.2 

Грамотний 01.08.15 17:11

Кома пропущена. Правильно: "ПРИВІТ, СВІТ!" І цей аксесуар заточений не тільки для HD44780. Підтягуючі резистори ставляться з боку майстра. Відповідно до специфікації, запис даних у контролер LCD йде за спадом Е. Звідси перша ж функція спрощується: void com (BYTE com) (com | = 0x08; // підсвічування pcf8574_byte_out (com | 0x04, ADD); // Виведення даних pcf8574_byte_out , ADD);// Е в нуль) Та й інші теж істотно менше можуть бути. Наприклад, void char_out(BYTE data) буде всього з двох викликів, і особливо без додаткових змінних. Ініціалізація LCD виконана із порушеннями специфікації таймінгів.

Олексій 02.08.15 19:11

Через відсутність коми, дисплей не постраждає. Цей девайc заточений саме під дисплеї з таким, або аналогічним контролером. А ось саме мікросхема справді простий розширювач порту. Щодо Є я згоден. Додаткові змінні необхідні. Якщо передати функції аргумент з виконанням деяких дій з логікою, можуть з'явитися глюки. Вже з таким стикався. Ініціалізація виконується без порушень тайменгів. У документації сказано, що між командами ставиться пауза 40 мкс. Через те, що передача йде по шині i2c, а та в свою чергу програмна та повільна, то періоди виконуються з лишком. Якщо все ж Вам не ліньки, то напишіть свій варіант і надішліть мені. Я його опублікую. Зрештою даний сайт призначений на аматорську аудиторію і кожен, хто хоче, може висловити свою думку та бачення на життя МК.

Олексій 06.08.15 09:14

Додані тайменги при ініціалізації дисплея за зауваженням "Грамотного"

Дмитро 14.06.16 21:57

Доброго дня Олексій. Можна в генератор коду додати бібліотеку для роботи з PCF8574.

Олексій 14.06.16 22:32

Я подумаю.))

ruslan 21.12.16 19:54
Олексій 21.12.16 21:53

О так. Особливо код на асмі. Ардуїнщики оцінять по повній)))

Пи.си.
Навіть якщо не дивитися на асм, то там прога написана під контролер PIC. Для AVRщиків це "дуже" корисна інформація? особливо початківцям))) Я нічого не маю проти PIC, але навіть асм у PIC та AVR різний. А з приводу подробиць роботи РК дисплея, то можна глянути))) Правда я її ще писав під CVAVR але всі команди розібрані та розкладені по поличках. Але у будь-якому випадку вирішуйте самі де зрозуміліше написано))) Автор пише, читач обирає.

GeK 04.01.17 12:52

"I2C адреса мікросхеми (за умовчанням він дорівнює 0x4E")

Старші 4 біти адреси фіксовані,
префікс У PCF8574 дорівнює 0100, а PCF8574A - 0111
Молодші 3 біти залежить від стану входів мікросхеми A2-A0. За замовчуванням всі 3 перемички розімкнені, відповідно адреса мікросхеми набуває значення 0111111.
// A2 A1 A0 PCF8574 PCF8574A
// 1 1 1 0x20 0x38
// 1 1 0 0x21 0x39
// 1 0 1 0x22 0x3A
// 1 0 0 0x23 0x3B
// 0 1 1 0x24 0x3C
// 0 1 0 0x25 0x3D
// 0 0 1 0x26 0x3E
// 0 0 0 0x27 0x3F

Олексій 04.01.17 14:27

Щось ви переплутали.
Витяг з документації на мікросхему

0b01001110 це 0x4E
Так що тут все правильно. А якщо потрібно змінити адресу, то лише потрібно її поміняти в дефайні.

Юрій 14.12.17 21:26

Доброго вам дня! А можна ще код функції lcdgotoxy та lcdclear для роботи з перехідником на PCF8574.

Олександр 20.05.18 18:14

Доброго вам дня! як ви виводите російську текст.

Олексій 20.05.18 23:04

Це вітчизняний дисплей від фірми МЕЛТ. У нього в пам'яті зашита кирилиця.

Олександр 21.05.18 04:55

Доброго вам дня! Я пиши як у вас у Проект для AtmelStudio 6.2 " ЁPҐBET MҐP!" то виводить нормально
а якщо пиши "ПРИВІТ СВІТ!" виводить нісенітницю всяку. у мене два
варіанти дисплеїв в одного зашита кирилиця. другий китайський.

Олексій 21.05.18 09:22

Я б спершу написав би тестову програму. Перебір усієї пам'яті з відображенням символів та їх адрес. А потім уже з'ясовувати у чому проблема. Швидше за все, таблиця символів не збігається з таблицею ascii.

Андрій 03.09.18 08:32

Доброго дня!

А схемку під Proteus не можете підкинути?

Андрій 03.09.18 10:22

Чи в Proteuse ніхто не перевіряв?

Андрій 03.09.18 10:56

Розібрався main_init

Павло 30.05.19 23:35

Цікава річ, адреса дисплея 0х4Е, а якщо той самий дисплей підключити до ардуїнки то адреса 0х27

Павло 31.05.19 11:04

Дякую за Вашу роботу! Перерив весь інтернет, жоден із наведених прикладів, крім Вашого, не заробив. Єдине, в архіві проекту функції ініціалізації дисплея не прописані затримки _delay_, і він відповідно не працює

Олексій 01.06.19 09:52

Ну, це більше демонстраційний проект. По хорошому потрібно бібліотеку axlib переписувати, але з урахуванням того, що STM32 і STM8 рухається семимильними кроками, сенсу в AVR вже немає взагалі.

Павло 05.06.19 12:57

STM не має DIP корпусів, складніше робити друковані плати. Для моїх проектів можливостей AVR вистачає із запасом, на одній Atmega 8 дуже багато можна вмістити

Олексій 05.06.19 15:20

Так, але скільки коштує Atmega8 та stm8s003)))

Дмитро 07.06.19 00:41

Привіт, Олексію.
Підкажи, будь ласка, як потрібно читати з pcf8574 стан порту?
Хочу зробити зовнішній блок, 8 GPIO по шині i2c – саме воно.

Дмитро 07.06.19 17:56

Сам собі відповім
Функція повертає байт – стан портів мікросхеми
uint8_t pcf8574_byte_rcv(uint8_t addr)
{
uint8_t ask = ACK;
addr | = 0b01; //READ
uint8_t data=0;
i2c_start();
ask = i2c_send_byte(addr);
if(!ask) data = i2c_read_byte(NACK);
i2c_stop();

Return data;
}

Павло 07.06.19 20:37

Скільки коштує, 150 рублів, за ціною релюшки загалом), а як ви розводите плати під STM? ЛУТ ненадійний, ЧПУ фрезер не впевнений, що візьме (не пробував)

  • Модуль FC-113 зроблено на базі мікросхеми PCF8574T, яка є 8-бітовим зсувним регістром - «розширювачем» входів-виходів для послідовної шини I2C. На малюнку мікросхема позначено DD1.
  • R1 – підстроювальний резистор для регулювання контрастності РК дисплея.
  • Джампер J1 використовується для увімкнення підсвічування дисплея.
  • Висновки 1…16 служать підключення модуля до висновків LCD дисплея.
  • Контактні майданчики А1…А3 потрібні зміни адреси I2C пристрою. Запаюючи відповідні перемички, можна змінювати адресу пристрою. У таблиці наведено відповідність адрес та перемичок: "0" відповідає розриву ланцюга, "1" - встановленої перемичці. За замовчуванням усі 3 перемички розімкнені та адреса пристрою 0x27.

2 Схема підключення РК дисплея до Arduinoза протоколом I2C

Підключення модуля Arduino здійснюється стандартно для шини I2C: висновок SDA модуля підключається до аналогового порту A4, висновок SCL - до аналогового порту A5 Ардуіно. Живлення модуля здійснюється напругою +5 від Arduino. Сам модуль з'єднується висновками 1…16 із відповідними висновками 1…16 на РК дисплеї.


3 Бібліотека для роботиза протоколом I2C

Тепер потрібна бібліотека для роботи з LCD за інтерфейсом I2C. Можна скористатися, наприклад, ось цим (посилання у рядку "Download Sample code and library").

Завантажений архів LiquidCrystal_I2Cv1-1.rarрозархівуємо в папку \libraries\яка знаходиться в директорії Arduino IDE.

Бібліотека підтримує набір стандартних функцій для екранів LCD:

ФункціяПризначення
LiquidCrystal() створює змінну типу LiquidCrystal та приймає параметри підключення дисплея (номери висновків);
begin() ініціалізація LCD дисплея, завдання параметрів (кількість рядків і символів);
clear() очищення екрана та повернення курсору в початкову позицію;
home() повернення курсору у початкову позицію;
setCursor() встановлення курсору на задану позицію;
write() виводить символ на РК екран;
print() виводить текст на РК екран;
cursor() показує курсор, тобто. підкреслення під місцем наступного символу;
noCursor() ховає курсор;
blink() миготіння курсору;
noBlink() скасування миготіння;
noDisplay() вимкнення дисплея зі збереженням всієї інформації, що відображається;
display() включення дисплея зі збереженням всієї інформації, що відображається;
scrollDisplayLeft() прокручування вмісту дисплея на 1 позицію вліво;
scrollDisplayRight() прокручування вмісту дисплея на 1 позицію праворуч;
autoscroll() включення автопрокручування;
noAutoscroll() вимикання автопрокрутки;
leftToRight() задає напрямок тексту зліва направо;
rightToLeft() направлення тексту праворуч наліво;
createChar() створює символ користувача для LCD-екрана.

4 Скетч для виведення текстуна LCD екран по шині I2C

Відкриємо зразок: Файл Зразки LiquidCrystal_I2C CustomCharsі трохи його переробимо. Виведемо повідомлення, в кінці якого буде миготливий символ. У коментарях до коду прокоментовано всі нюанси скетчу.

#include // Підключаємо бібліотеку Wire #include // Підключаємо бібліотеку РК#define printByte(args) write(args); // uint8_t heart = (0x0,0xa,0x1f,0x1f,0xe,0x4,0x0); // бітова маска символу "серце" LiquidCrystal_I2C lcd(0x27, 16, 2); // Задаємо адресу 0x27 для LCD дисплея 16x2 void setup() ( lcd.init(); // ініціалізація РК дисплея lcd.backlight(); // Увімкнення підсвічування дисплея lcd.createChar(3, heart); // Створюємо символ «серце» в 3 осередку пам'яті lcd.home(); // ставимо курсор у лівий верхній кут, у позицію (0,0) lcd.!"); // друкуємо рядок тексту lcd.setCursor(0, 1); // переклад курсора на рядок 2, символ 1 lcd.print( "i"); // друкуємо повідомлення на рядку 2 lcd.printByte(3); // друкуємо символ «серце», що знаходиться в 3-му осередку lcd.print("Arduino"); } void loop() (// блимання останнього символу lcd.setCursor(13, 1); // Переклад курсору на рядок 2, символ 1 lcd.print("\t"); delay(500); lcd.setCursor(13, 1); // Переклад курсора на рядок 2, символ 1 lcd.print(" "); delay(500); }

До речі, символи, записані командою lcd.createChar();, залишаються у пам'яті дисплея після вимкнення живлення, т.к. записуються у ПЗУ дисплея 1602.

5 Створення власних символівдля РК дисплея

Дещо докладніше розглянемо питання створення власних символів для РК екранів. Кожен символ на екрані складається з 35-ти точок: 5 завширшки і 7 заввишки (+1 резервний рядок для підкреслення). У рядку 6 наведеного скетчу ми задаємо масив із 7-ми чисел: (0x0, 0xa, 0x1f, 0x1f, 0xe, 0x4, 0x0). Перетворимо 16-річні числа на бінарні: {00000, 01010, 11111, 11111, 01110, 00100, 00000} . Ці числа - не що інше, як бітові маски для кожного з 7 рядків символу, де "0" позначають світлу точку, а "1" - темну. Наприклад, символ серця, заданий у вигляді маски біта, буде виглядати на екрані так, як показано на малюнку.

6 Управління РК екраномпо шині I2C

Завантажимо скетч до Arduino. На екрані з'явиться заданий нами з миготливим курсором в кінці.


7 Що знаходиться «за»шиною I2C

Як бонус розглянемо тимчасову діаграму виведення латинських символів "A", "B" та "С" на РК дисплей. Ці символи є в дисплеї ПЗУ і виводяться на екран просто передачею дисплею їх адреси. Діаграма знята з висновків RS, RW, E, D4, D5, D6 та D7 дисплея, тобто. вже після перетворювача FC-113 "I2C паралельна шина". Можна сказати, що ми поринаємо трохи «глибше» в «залізо».


Тимчасова діаграма виведення латинських символів "A", "B" та "С" на LCD дисплей 1602

На діаграмі видно, що символи, що є в ПЗУ дисплея (див. стор.11 даташита, посилання нижче), передаються двома напівбайтами, перший з яких визначає номер стовпця таблиці, а другий номер рядка. При цьому дані «клацаються» по фронту сигналу на лінії E(Enable), а лінія RS(Register select, вибір регістру) перебуває у стані логічної одиниці, що означає передачу даних. Низький стан лінії RS означає передачу вказівок, що ми бачимо перед передачею кожного символу. У цьому випадку передається код інструкції повернення каретки на позицію (0, 0) РК дисплея, про що також можна дізнатися, вивчивши технічний опис дисплея.

І ще один приклад. На цій часовій діаграмі показано виведення символу «Серце» на РК-дисплей.


Знову, перші два імпульси Enableвідповідають інструкції Home()(0000 0010 2) - повернення каретки на позицію (0; 0), а другі два - виведення на РК дисплей, що зберігається в комірці пам'яті 3 10 (0000 0011 2) символ «Серце» (інструкція lcd.createChar(3, heart);скетчу).

Мабуть один із найпопулярніших екранів на ринку. Зібраний на популярному контролері HD44780U. З назви моделі випливає, що екран складається із двох рядків по 16 символів. Підтримки російської мови у цій конкретній моделі немає.

Шина даних ш2с дозволяє по двох дротах підключати до 127 пристроїв, причому одночасно. Цей I2C реалізований на чіпі PCF8574T.

Схема підключення:

Синя штука - змінний опір, що дозволяє налаштувати контрастність екрану.

Перемичка зліва – відповідає за підсвічування екрана.

Блок з 4-х контактів підключається до arduino так:

GND - GND
VCC - 5V
SDA - A4 (якщо Arduino MEGA, то до D20)
SCL - A5 (якщо Arduino MEGA, то до D21)

Бібліотека

Скетч

У дисплея може бути інша IIC адреса, замість 0x27 може виявитися 0x3F. Щоб точно визначити адресу, можна скористатися сканером i2c пристроїв.

#include #include //задаємо адресу LCD екрану 0x27, 16 символів, 2 рядки LiquidCrystal_I2C lcd(0x27, 16, 2); void setup () (lcd.init(); // Ініціалізуємо екран //включаємо підсвічування lcd.backlight(); //Встановлюємо позицію з якої виводиться текст. lcd.setCursor (2, 0); //виводимо рядок 1 lcd.print ("Hello, World!"); //аналогічно виводимо другий рядок lcd.setCursor (1, 1); lcd.print ("www.сайт"); ) void loop () ( )

Провайдери