пʼятниця, 1 березня 2019 р.

STM32: Бібліотека для роботи з LCD WH1602(4) або іншим сумісним дисплеєм з контролером HD44780 по I2C шині, або по 4-х бітній шині


Update 11.05.2019: Виправив невиличку помилку, та додав підтримку дисплею LCD2004. Для використання дисплею 2004 в файлі "stm32_device.h" розкоментувати рядок з "#define USE_LCD2004".

Update 25.04.2022: Додано до бібліотеки підтримку декількох мікроконтролерів: STM32 HAL, PSoC PDL, Arduino framework. 

Передмова

У попередній статті "STM32: Бібліотека для роботи з LCD WH1602(4) або іншим сумісним дисплеєм з контролером HD44780" надано бібліотеку для роботи з дисплеєм, виключно, по 4-х бітовій шині. На прохання моїх читачів, допрацював бібліотеку і для роботи з цими дисплеями по шині I2C. Підключення по шині I2C вигідно економить, як кількість з'єднань, так і ніжки мікроконтролеру. Ця бібліотека по своєму функціоналу повністю сумісна з попередньою. Додано і модифіковано тільки роботу з шиною I2C. В варіанті роботи з шиною I2C додається дві функції які вмикають і вимикають підсвітку дисплея. Обрати роботу по шині I2C чи 4-х бітний варіант можна в файлі налаштувань бібліотеки.

Компоненти проекту

  1. Дошка "Синя пігулка"
  2. ST-Link V2
  3. Дисплей LCD1602
  4. Адаптер I2C шини для дисплею PCF8574A

CubeMXforSTM32

В CubeMX створюємо новий проект. Обираємо свій мікроконтролер, або дошку розробника. 
Налаштування шини I2C
  1. Обираємо шину I2C до якої під'єднано дисплей - I2C1
  2. Режим шини - I2C
  3. Налаштування шини - за замовчуванням, нічого не міняв
  4. Дивимось розташування на шпильках сигналів SDA і SCL
Генеруємо проект. Називаємо його, наприклад "STM32F103C8T6_I2C_LCD1602". По завершенню генерації відкриваємо свій засіб розробки.

STM32CubeIDE

Додаємо до проекту файли бібліотеки. Файли "stm32_device.h" та "hd44780.h" до теки "inc" проекту, а файл "hd44780.c" до теки "src" проекту.
Відкриваємо файл проекту "main.c", та підключаємо до головного файлу заголовний файл бібліотеки "hd44780.h" та файл "stm32_device.h"
/* USER CODE BEGIN Includes */
#include "hd44780.h"
#include "stm32_device.h"
/* USER CODE END Includes */
Далі переходимо до файлу "stm32_device.h":
#include "main.h"

#define USE_I2C_BUS
//#define USE_LCD2004

//-------------------------------
/* SET LCD<->MCU CONNECTIONS */
//-------------------------------
#ifdef USE_I2C_BUS

#define LCD_I2C_PORT  hi2c1
#define LCD_I2C_ADDRESS  0x3F

#define LCD_I2C_ADDRESS_8B (LCD_I2C_ADDRESS << 1)
#define PIN_RS      (1 << 0)
#define PIN_EN      (1 << 2)
#define BACKLIGHT   3

extern I2C_HandleTypeDef LCD_I2C_PORT;

#else
Де визначаємо що будемо використовувати шину I2C "#define USE_I2C_BUS". Як потрібна робота з 4-х бітною шиною, то цей рядок потрібно за коментувати і діяти по інструкції з попередньої статті "STM32: Бібліотека для роботи з LCD WH1602(4) або іншим сумісним дисплеєм з контролером HD44780".
Далі налаштовуємо до якого саме порту під'єднано дисплей і яку адресу має дисплей на шині I2C - це рядки "#define LCD_I2C_PORT hi2c1" та "#define LCD_I2C_ADDRESS 0x3F".
Цього достатньо.
Якщо використовуєте дисплей LCD2004, то розкоментуйте рядок "#define USE_LCD2004" в файлі "stm32_device.h"

Демонстраційна програма

Демонстраційний код візьміть з GIT або з попередньої статті "STM32: Бібліотека для роботи з LCD WH1602(4) або іншим сумісним дисплеєм з контролером HD44780". Та пам'ятайте, що для увімкнення, або вимкнення підсвітки дисплею, в варіанті для шини I2C, є окремі функції в бібліотеці.

Архів з бібліотекою

Фото проекту

LCD1602
LCD2004

Відео посібник



4 коментарі:

  1. Адміністратор блогу видалив цей коментар.

    ВідповістиВидалити
  2. Я вважаю потрібно доповнити статтю, описати заново функції бібліотеки. В мене наприклад проблема просто з самого початку, а саме не проходить компіляція через функцію ініціалізації дисплею, помилка: (/Core/Src/main.c:66:3: error: too few arguments to function 'lcdInit'). І в файлах бібліотеки немає (#define USE_I2C_BUS ; //#define USE_LCD2004), тобто #ifdef є, а дефайнів нема. Їх потрібно прописувати в main? На GitHab опису також немає. Я не спеціаліст і не надто прошарений в програмуванні, тому не зовсім розумію і самостійно розібратись не можу.

    ВідповістиВидалити
    Відповіді
    1. Перепрошую замінив lcdInit(); на lcdInit(&lcdConfig);, хоча не розумію як працює вираз в дужках. Але тепер інша проблема, саме через неї я перейшов від бібліотеки з попередньої статті до цієї (основний код взятий з попередньої статті), а саме при ввімкнені на дисплеї замість написів які повинні бути каша з символів яка тим не менш рухається як має бути, це продовжується до моменту з "Бігучою людиною", потім усе як має бути, при перезавантаженні те ж саме. МК stm32f401ccu6.

      Видалити
    2. Вітаю. Дякую за цікавість. Відеопосібник в кінці статті вам допоможе. Статтю, як буде час, оновлю. Дякую.

      Видалити