Update 11.05.2019: Виправив невиличку помилку, та додав підтримку дисплею LCD2004. Для використання дисплею 2004 в файлі "stm32_device.h" розкоментувати рядок з "#define USE_LCD2004".
Update 25.04.2022: Додано до бібліотеки підтримку декількох мікроконтролерів: STM32 HAL, PSoC PDL, Arduino framework.
Далі переходимо до файлу "stm32_device.h":
Де визначаємо що будемо використовувати шину 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"
Передмова
У попередній статті "STM32: Бібліотека для роботи з LCD WH1602(4) або іншим сумісним дисплеєм з контролером HD44780" надано бібліотеку для роботи з дисплеєм, виключно, по 4-х бітовій шині. На прохання моїх читачів, допрацював бібліотеку і для роботи з цими дисплеями по шині I2C. Підключення по шині I2C вигідно економить, як кількість з'єднань, так і ніжки мікроконтролеру. Ця бібліотека по своєму функціоналу повністю сумісна з попередньою. Додано і модифіковано тільки роботу з шиною I2C. В варіанті роботи з шиною I2C додається дві функції які вмикають і вимикають підсвітку дисплея. Обрати роботу по шині I2C чи 4-х бітний варіант можна в файлі налаштувань бібліотеки.
Компоненти проекту
- Дошка "Синя пігулка"
- ST-Link V2
- Дисплей LCD1602
- Адаптер I2C шини для дисплею PCF8574A
CubeMXforSTM32
В CubeMX створюємо новий проект. Обираємо свій мікроконтролер, або дошку розробника.
Налаштування шини I2C |
- Обираємо шину I2C до якої під'єднано дисплей - I2C1
- Режим шини - I2C
- Налаштування шини - за замовчуванням, нічого не міняв
- Дивимось розташування на шпильках сигналів 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 */
#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 LCD_I2C_PORT hi2c1" та "#define LCD_I2C_ADDRESS 0x3F".
Цього достатньо.
Якщо використовуєте дисплей LCD2004, то розкоментуйте рядок "#define USE_LCD2004" в файлі "stm32_device.h"
Демонстраційна програма
Демонстраційний код візьміть з GIT або з попередньої статті "STM32: Бібліотека для роботи з LCD WH1602(4) або іншим сумісним дисплеєм з контролером HD44780". Та пам'ятайте, що для увімкнення, або вимкнення підсвітки дисплею, в варіанті для шини I2C, є окремі функції в бібліотеці.
Архів з бібліотекою
Фото проекту
LCD1602 |
Адміністратор блогу видалив цей коментар.
ВідповістиВидалитиЯ вважаю потрібно доповнити статтю, описати заново функції бібліотеки. В мене наприклад проблема просто з самого початку, а саме не проходить компіляція через функцію ініціалізації дисплею, помилка: (/Core/Src/main.c:66:3: error: too few arguments to function 'lcdInit'). І в файлах бібліотеки немає (#define USE_I2C_BUS ; //#define USE_LCD2004), тобто #ifdef є, а дефайнів нема. Їх потрібно прописувати в main? На GitHab опису також немає. Я не спеціаліст і не надто прошарений в програмуванні, тому не зовсім розумію і самостійно розібратись не можу.
ВідповістиВидалитиПерепрошую замінив lcdInit(); на lcdInit(&lcdConfig);, хоча не розумію як працює вираз в дужках. Але тепер інша проблема, саме через неї я перейшов від бібліотеки з попередньої статті до цієї (основний код взятий з попередньої статті), а саме при ввімкнені на дисплеї замість написів які повинні бути каша з символів яка тим не менш рухається як має бути, це продовжується до моменту з "Бігучою людиною", потім усе як має бути, при перезавантаженні те ж саме. МК stm32f401ccu6.
ВидалитиВітаю. Дякую за цікавість. Відеопосібник в кінці статті вам допоможе. Статтю, як буде час, оновлю. Дякую.
Видалити