STM32F103C8T6 – Hiển thị LCD1602 với module mở rộng chân I2C PCF8574

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
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


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;}
...
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX


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);
}
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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