STM32 实现 C51 IIC实验

函数封装

HAL_StatusTypeDef HAL_I2C_Mem_Write(
	I2C_HandleTypeDef *hi2c,  // 参数一
	uint16_t DevAddress,   // 参数二
	uint16_t MemAddress,   // 参数三
	uint16_t MemAddSize,  // 参数四
	uint8_t *pData,   // 参数五
	uint16_t Size,  // 参数六
	uint32_t Timeout  // 参数七
)

参数一:I2C_HandleTypeDef *hi2c,I2C设备句柄

参数二:uint16_t DevAddress,目标器件的地址,七位地址必须左对齐

参数三:uint16_t MemAddress,目标器件的目标寄存器地址

参数四:uint16_t MemAddSize,目标器件内部寄存器地址数据长度

参数五:uint8_t *pData,待写的数据首地址

参数六:uint16_t Size,待写的数据长度

参数七:uint32_t Timeout,超时时间

返回值:HAL_StatusTypeDef,HAL状态(OK,busy,ERROR,TIMEOUT)

OLED写命令的封装:

void Oled_Write_Cmd(uint8_t dataCmd)
{
	HAL_I2C_Mem_Write(
		&hi2c1, 
		0x78, 
		0x00, 
		I2C_MEMADD_SIZE_8BIT,
		&dataCmd, 
		1, 
		0xff
	);
}

OLED写数据的封装:

void Oled_Write_Data(uint8_t dataData)
{
	HAL_I2C_Mem_Write(
		&hi2c1, 
		0x78, 
		0x40, 
		I2C_MEMADD_SIZE_8BIT,
		&dataData, 
		1, 
		0xff
	);
}

接线

SCL – PB6

SDA – PB7
在这里插入图片描述
代码如下:

// 写命令
void Oled_Write_Cmd(uint8_t dataCmd)
{
	HAL_I2C_Mem_Write(
		&hi2c1,
		0x78,
		0x00,
		I2C_MEMADD_SIZE_8BIT,
		&dataCmd,
		1,
		0xff
	);
}
// 写数据
void Oled_Write_Data(uint8_t dataData)
{
	HAL_I2C_Mem_Write(
		&hi2c1,
		0x78,
		0x40,
		I2C_MEMADD_SIZE_8BIT,
		&dataData,
		1,
		0xff
	);
}
void Oled_Init(void){
	Oled_Write_Cmd(0xAE);//--display off
	Oled_Write_Cmd(0x00);//---set low column address
	Oled_Write_Cmd(0x10);//---set high column address
	Oled_Write_Cmd(0x40);//--set start line address
	Oled_Write_Cmd(0xB0);//--set page address
	Oled_Write_Cmd(0x81); // contract control
	Oled_Write_Cmd(0xFF);//--128
	Oled_Write_Cmd(0xA1);//set segment remap
	Oled_Write_Cmd(0xA6);//--normal / reverse
	Oled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)
	Oled_Write_Cmd(0x3F);//--1/32 duty
	Oled_Write_Cmd(0xC8);//Com scan direction
	Oled_Write_Cmd(0xD3);//-set display offset
	Oled_Write_Cmd(0x00);//
	Oled_Write_Cmd(0xD5);//set osc division
	Oled_Write_Cmd(0x80);//
	Oled_Write_Cmd(0xD8);//set area color mode off
	Oled_Write_Cmd(0x05);//
	Oled_Write_Cmd(0xD9);//Set Pre-Charge Period
	Oled_Write_Cmd(0xF1);//
	Oled_Write_Cmd(0xDA);//set com pin configuartion
	Oled_Write_Cmd(0x12);//
	Oled_Write_Cmd(0xDB);//set Vcomh
	Oled_Write_Cmd(0x30);//
	Oled_Write_Cmd(0x8D);//set charge pump enable
	Oled_Write_Cmd(0x14);//
	Oled_Write_Cmd(0xAF);//--turn on oled panel
}
// 清屏函数
void Oled_Clear()
{
	unsigned char i,j;  // -128 --- 127 
	for(i = 0; i < 8; i++){
		Oled_Write_Cmd(0xB0 + i);  // page0 - page7
		// 从每个page第0列开始
		Oled_Write_Cmd(0x00);
		Oled_Write_Cmd(0x10);
		// 每个page从0列到127列,以此写入0,每写入数据,列地址自动偏移
		for(j = 0; j < 128; j++){
			Oled_Write_Data(0);
		}
	}
}

/*--  文字:  A  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
char A1[8] = {0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00};

char A2[8] = {0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20};

// main.c
int i;

// 1. OLED初始化
Oled_Init();
	
// 2. 选择一个位置
Oled_Write_Cmd(0x20);
	
// 2.1 确认是页选址模式
Oled_Write_Cmd(0x02);
Oled_Clear();
// 2.2 选择PAGE0  1011 0000  0xB0
Oled_Write_Cmd(0xB0);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
for(i = 0; i < 8; i++){
	Oled_Write_Data(A1[i]);
}
	
Oled_Write_Cmd(0xB1);
Oled_Write_Cmd(0x00);
Oled_Write_Cmd(0x10);
for(i = 0; i < 8; i++){
	Oled_Write_Data(A2[i]);
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值