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