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


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