stm32中驱动oled显示字符和数据的代码模版
时间: 2024-05-04 12:19:59 浏览: 108
oled.rar_STM32驱动OLED_oled
以下是一个基于STM32 HAL库的OLED显示字符和数据的代码模板:
```c
#include "stm32f4xx_hal.h"
// OLED的I2C地址
#define OLED_ADDRESS 0x78
// OLED的分辨率
#define OLED_WIDTH 128
#define OLED_HEIGHT 64
// OLED的缓冲区
uint8_t OLED_Buffer[1024];
I2C_HandleTypeDef hi2c1; // I2C1的句柄
void OLED_Init(void)
{
// 以下是初始化OLED的I2C通信
HAL_I2C_Init(&hi2c1);
// 以下是初始化OLED的命令
uint8_t OLED_InitCmd[] = {
0xAE, // 关闭OLED显示
0xD5, 0x80, // 设置时钟分频因子,震荡频率
0xA8, 0x3F, // 设置驱动路数
0xD3, 0x00, // 设置显示偏移
0x40, // 设置显示开始行 [5:0],这个值默认为0
0x8D, 0x14, // 设置内存地址模式
0x20, 0x00, // 设置内存地址模式为水平模式
0xA0, // 设置列地址的扫描方向
0xC0, // 设置行地址的扫描方向
0xDA, 0x12, // 设置COM硬件引脚配置
0x81, 0xCF, // 设置对比度
0xD9, 0xF1, // 设置预充电周期
0xDB, 0x40, // 设置VCOMH Deselect Level
0xA4, // 全局显示开启,显示指令开启
0xA6, // 设置显示方式,A6为反相显示,A7为正常显示
0xAF // 打开OLED显示
};
HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x00, 1, OLED_InitCmd, sizeof(OLED_InitCmd), 1000);
}
void OLED_Clear(void)
{
memset(OLED_Buffer, 0x00, sizeof(OLED_Buffer)); // 清空缓冲区
OLED_Update(); // 更新OLED屏幕
}
void OLED_Update(void)
{
uint8_t OLED_DataCmd[] = {
0x40, // 数据写入命令
};
// 分别将每行数据发送给OLED
for (uint8_t y = 0; y < OLED_HEIGHT / 8; y++) {
uint8_t OLED_PageCmd[] = {
0xB0 + y, // 设置页地址
0x00, // 设置列地址低位
0x10, // 设置列地址高位
};
HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x00, 1, OLED_PageCmd, sizeof(OLED_PageCmd), 1000);
HAL_I2C_Mem_Write(&hi2c1, OLED_ADDRESS, 0x40, 1, &OLED_Buffer[y * OLED_WIDTH], OLED_WIDTH, 1000);
}
}
void OLED_DrawPixel(uint8_t x, uint8_t y)
{
if (x >= OLED_WIDTH || y >= OLED_HEIGHT) {
return;
}
OLED_Buffer[x + (y / 8) * OLED_WIDTH] |= 1 << (y % 8);
}
void OLED_DrawChar(uint8_t x, uint8_t y, char c)
{
if (x >= OLED_WIDTH || y >= OLED_HEIGHT) {
return;
}
for (uint8_t i = 0; i < 8; i++) {
OLED_Buffer[x + (y / 8) * OLED_WIDTH + i * OLED_WIDTH] = Font8x8[c][i];
}
}
void OLED_DrawString(uint8_t x, uint8_t y, const char *str)
{
if (x >= OLED_WIDTH || y >= OLED_HEIGHT) {
return;
}
while (*str) {
OLED_DrawChar(x, y, *str++);
x += 8;
}
}
```
其中,`OLED_Init()`函数用于初始化OLED屏幕;`OLED_Clear()`函数用于清空屏幕;`OLED_Update()`函数用于更新屏幕,需要在修改了缓冲区之后调用;`OLED_DrawPixel()`函数用于在指定位置绘制一个像素;`OLED_DrawChar()`函数用于在指定位置绘制一个字符;`OLED_DrawString()`函数用于在指定位置绘制一个字符串。在使用这些函数之前,需要先定义好OLED的I2C地址和分辨率,并且需要引入一个8x8的字体数组(例如`Font8x8`)。
阅读全文