HAL库IIC OLED程序
时间: 2023-11-07 07:59:04 浏览: 97
基于IIC的OLED显示程序
以下是使用HAL库控制I2C OLED显示屏的简单程序:
```c
#include "stm32f1xx_hal.h"
#define OLED_ADDR 0x78 // OLED地址
// OLED初始化函数
void OLED_Init(I2C_HandleTypeDef *hi2c)
{
uint8_t init_data[] = {
0xAE, // 关闭显示
0xD5, // 设置时钟分频因子,震荡频率
0x80, // 分频因子=1,震荡频率=默认
0xA8, // 设置驱动路数
0x3F, // 路数=63
0xD3, // 设置显示偏移
0x00, // 偏移=0
0x40, // 设置显示开始行 [5:0]
0x8D, // 电荷泵设置
0x14, // 使能电荷泵
0x20, // 设置内存地址模式
0x02, // 垂直寻址模式
0xA1, // 设置段重定向映射
0xC8, // 设置COM扫描方向
0xDA, // 设置COM硬件引脚配置
0x02, // 交替序列:(COM0~COM63)
0x81, // 对比度设置
0xCF, // 电荷泵电压设置
0xD9, // 设置预充电周期
0xF1, //
0xDB, // 设置VCOMH Deselect Level
0x40, //
0xA4, // 全屏显示开启
0xA6, // 设置正/反显
0xAF, // 开启显示
};
HAL_I2C_Master_Transmit(hi2c, OLED_ADDR, init_data, sizeof(init_data), 1000);
}
// 在指定位置写入一个字符
void OLED_WriteChar(I2C_HandleTypeDef *hi2c, uint8_t x, uint8_t y, uint8_t ch)
{
uint8_t data[2] = {0xB0 + y, ((x & 0xf) | 0x10)};
HAL_I2C_Master_Transmit(hi2c, OLED_ADDR, data, sizeof(data), 1000);
data[0] = 0x40;
data[1] = ch;
HAL_I2C_Master_Transmit(hi2c, OLED_ADDR, data, sizeof(data), 1000);
}
// 在指定位置写入字符串
void OLED_WriteString(I2C_HandleTypeDef *hi2c, uint8_t x, uint8_t y, char *str)
{
while (*str != '\0')
{
OLED_WriteChar(hi2c, x, y, *str++);
x += 8;
}
}
int main(void)
{
HAL_Init();
I2C_HandleTypeDef hi2c;
hi2c.Instance = I2C1;
hi2c.Init.ClockSpeed = 400000;
hi2c.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c.Init.OwnAddress1 = 0;
hi2c.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c.Init.OwnAddress2 = 0;
hi2c.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
if (HAL_I2C_Init(&hi2c) != HAL_OK)
{
Error_Handler();
}
OLED_Init(&hi2c);
OLED_WriteString(&hi2c, 0, 0, "Hello, world!");
while (1)
{
}
}
```
在上面的程序中,我们使用STM32F1系列的HAL库来控制I2C总线,通过I2C总线向OLED显示屏发送命令和数据。具体来说,我们定义了三个函数:
- `OLED_Init()`:用来初始化OLED显示屏,发送一系列命令来配置OLED显示屏的各种参数。
- `OLED_WriteChar()`:用来在指定位置写入一个字符。
- `OLED_WriteString()`:用来在指定位置写入一个字符串。
在`main()`函数中,我们首先初始化了I2C总线,然后初始化了OLED显示屏,并在(0,0)的位置写入了一个字符串"Hello, world!"。最后,程序进入了一个死循环,等待其他的操作。
阅读全文