函数封装
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]);
}