Về giao tiếp vi điều khiển với module I2C LCD mình đã viết ở phần vi điều khiển MS51FB9AE ở link:
http://vidieukhien.org/ms51fb9ae-lcd-16×02-voi-module-i2c.html
. Để hiển thị dùng STM32 thì chỉ cần viết lại thư viện I2C.
May mắn là thư viện đã có sẵn ở đây. Chỉ cần sửa lại nguyên mẫu hàm cho phù hợp là được. Link thư viện:
https://github.com/geoffreymbrown/STM32-Template/tree/master/Library
Sửa lại một chút như sau:
file i2c.h
#ifndef I2C_H #define I2C_H #include <stm32f10x_i2c.h> typedef enum {Error = 0, Success = !Error } Status; void My_I2C_Init(void); uint8_t I2C_Write(uint8_t Address, uint8_t *pData, uint8_t length); uint8_t I2C_Read(uint8_t Address, uint8_t *pData, uint8_t length); Status lib_I2C_Read(I2C_TypeDef* I2Cx, uint8_t* buf, uint32_t nbuf, uint8_t SlaveAddress); Status lib_I2C_Write(I2C_TypeDef* I2Cx, const uint8_t* buf, uint32_t nbuf, uint8_t SlaveAddress); void lib_I2C_LowLevel_Init(I2C_TypeDef* I2Cx, int ClockSpeed, int OwnAddress); #endif
file i2c.c
... #include "I2C.h" void My_I2C_Init(void) { lib_I2C_LowLevel_Init(I2C1, 100000, 0x00); } uint8_t I2C_Write(uint8_t Address, uint8_t *pData, uint8_t length) { return lib_I2C_Write(I2C1, pData, length, Address); } uint8_t I2C_Read(uint8_t Address, uint8_t *pData, uint8_t length) { return lib_I2C_Read(I2C1, pData, length, Address); } #define Timed(x) Timeout = 0xFFFF; while (x) { if (Timeout-- == 0) goto errReturn;} ...
Sử dụng thư viện.
file main.c
#include "stm32f10x.h" #include "delay.h" #include "i2c_lcd.h" void init(void); int main() { uint8_t test = 0; init(); Delay_Init(); I2C_LCD_Init(); I2C_LCD_Clear(); I2C_LCD_BackLight(1); while(1) { if (test) { test = 0; I2C_LCD_Clear(); I2C_LCD_Puts("STM32F103C8T6"); I2C_LCD_NewLine(); I2C_LCD_Puts("LCD I2C Test"); GPIO_ResetBits(GPIOC, GPIO_Pin_13); } else { test = 1; I2C_LCD_Clear(); I2C_LCD_Puts("Ngo Hung Cuong"); I2C_LCD_NewLine(); I2C_LCD_Puts("LCD I2C Library"); GPIO_SetBits(GPIOC, GPIO_Pin_13); } Delay_Ms(2000); } } void init(void) { GPIO_InitTypeDef gpioInit; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); gpioInit.GPIO_Mode=GPIO_Mode_Out_PP; gpioInit.GPIO_Speed=GPIO_Speed_50MHz; gpioInit.GPIO_Pin=GPIO_Pin_13; GPIO_Init(GPIOC, &gpioInit); }
Chân PB6 là chân CLK,
Chân PB7 là chân DATA,
Kết quả
Link Project:
https://drive.google.com/open?id=1X7SraW326M9VsVDNRA6_wA4tKo2pj020