【STM32 HAL库】OLED显示模块

前言

本文为笔者学习 OLED 的总结,基于keysking的视频内容,如有错误,欢迎指正

理论

OLED基本参数

分辨率
在这里插入图片描述
常见的oled显示模块的分辨率为128*64,即横向128个像素点,纵向64个像素点

OLED基本驱动原理

在这里插入图片描述

OLED坐标轴

在这里插入图片描述

应用

CubeMx配置

在这里插入图片描述

底层函数代码

OLED驱动的底层函数代码通常由厂商提供,只需理解并调用相应函数即可
在这里我贴一下我使用的OLED_SSD1306驱动
,由keysking提供

高层封装函数

printf显示函数

/**
 * @brief 类似printf函数,在 OLED 指定行和列处打印格式化的字符串
 *
 * @param line OLED 显示的行数(从 0行 开始),每行高度为 16 像素
 * @param column OLED 显示的列号(从 0列 开始),每列宽度为 8 像素
 * @param format 格式化字符串,必须加双引号,类似 `printf` 的入参格式。
 * @param ... 可变参数,用于替换 `format` 字符串中的占位符。
 *
 * @note 该函数使用 `vsprintf` 进行字符串格式化,`buffer` 大小为 128 字节。`OLED_PrintString` 函数将最终的字符串显示在 OLED 上,使用 16x16 的字体和常规显示模式。
 */
void OLED_printf(uint8_t line, uint8_t column, const char *format, ...)
{
    uint8_t x = column * 8; // 将列号转换为像素坐标
    uint8_t y = line * 16;  // 将行号转换为像素坐标
    char buffer[128];       // 用于存储格式化后的字符串
    va_list args;           // 定义可变参数列表

    // 初始化可变参数列表
    va_start(args, format);
    
    // 使用 vsprintf 将格式化后的内容写入 buffer
    vsprintf(buffer, format, args);

    // 结束可变参数处理
    va_end(args);

    // 将格式化后的字符串显示在 OLED 上
    OLED_PrintString(x, y, buffer, &font16x16, OLED_COLOR_NORMAL);
}

接下来补充说明一下可变参数

... 为可变参数,... 本身并不是一种特定的类型,而是表示参数列表的可变性。允许在运行时接收任意数量和类型的参数,具体类型由传入的参数决定。
... 可接收任意数量和类型的参数,但参数与参数直接需用 , 分隔。
定义 argsva_list 类型(可变参数列表),用于存储任意数量和类型的可变参数。
va_start(args,format); 将可变参数列表 args 的开始索引指向 format 参数的下一位(下一位就是 ... 可变参数的原因与函数调用约定和栈布局有关,不用深究。
va_start(args, format); 初始化 args,将列表开始索引指向 format 参数的下一位,(表示这后续的参数都是 args
vsprintf(buffer, format, args); 先扫描 format 字符串并读取其占位符—>再读取 args 中的可变参数并填入占位符—>最后将格式化后的结果写入 buffer 字符串。
va_end(args); 用于结束可变参数处理,释放资源。为保证代码的可移植性和规范性,处理完可变参数后应调用。

<think>嗯,用户想找关于用STM32HAL驱动OLED屏幕的示例代码和教程。首先,我需要回忆之前提供的引用内容。引用[1]提到了一个项目地址,可能包含相关代码。而引用[2]是关于HAL的快速入门,可能涉及GPIO配置。 用户需要的是具体的驱动步骤和代码示例。我应该先介绍OLED的基本原理,比如通信方式,I2C或SPI。然后分步骤说明,从CubeMX配置到代码编写,再到显示函数的使用。需要确保每个步骤都清晰,比如配置GPIO、添加OLED驱动代码、初始化、显示字符串等部分。 还要注意用户提到的四脚OLED,可能使用的是I2C接口,所以需要配置相应的I2C外设。代码示例部分要包括发送命令和数据的函数,初始化序列,以及显示字符的实现。可能还需要提到字的问题,比如使用中文字需要更大的存储空间。 此外,用户可能需要优化建议,比如缓冲区和动态内容显示。最后,生成相关问题时要覆盖硬件连接、通信协议选择、多屏控制、显示优化、功耗以及中英文切换等方面。确保引用标记正确,比如项目地址和GPIO配置部分对应的引用[^1]和[^2]。</think>### STM32 HAL驱动OLED屏幕显示教程 ### 一、硬件准备 1. 四脚OLED屏幕(通常使用$I^2C$通信协议) 2. STM32开发板(建议F1/F4系列) 3. 杜邦线连接(SCL接PB6,SDA接PB7,具体引脚需根据原理图确认) ### 二、CubeMX配置步骤 1. 新建工程选择对应芯片型号 2. 配置$I^2C$接口: - 模式选择"I2C" - 时钟速度设置为400kHz - 配置SCL/SDA引脚 3. 配置GPIO(若需要复位引脚): ```c #define OLED_RST_Pin GPIO_PIN_8 #define OLED_RST_GPIO_Port GPIOA ``` ### 三、OLED驱动代码实现 ```c /* I2C发送函数 */ void OLED_WriteCmd(uint8_t cmd) { HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, 1, &cmd, 1, 100); } void OLED_WriteData(uint8_t data) { HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, 1, &data, 1, 100); } /* 初始化序列 */ void OLED_Init(void) { OLED_WriteCmd(0xAE); // 关闭显示 OLED_WriteCmd(0xD5); // 设置时钟分频 OLED_WriteCmd(0x80); // ...其他初始化命令 OLED_WriteCmd(0xAF); // 开启显示 } /* 显示字符串函数 */ void OLED_ShowString(uint8_t x, uint8_t y, char *str) { uint8_t i=0; while(str[i]) { OLED_ShowChar(x + i*6, y, str[i]); i++; } } ``` ### 四、中英文显示实现 1. 需要预置中文字(16x16点阵) 2. 使用Unicode编码转换 3. 实现字读取函数: ```c void OLED_DrawCNChar(uint16_t x, uint16_t y, uint8_t index) { uint16_t i; uint8_t temp; for(i=0;i<32;i++) { temp = HZK16[index*32+i]; OLED_DrawPoint(x+i%16, y+i/16, (temp>>(7-(i%8)))&0x01); } } ``` ### 五、工程部署建议 1. 将OLED驱动代码单独建立`oled.c`和`oled.h`文件 2. 在`main.c`中包含头文件: ```c #include "oled.h" #include "font.h" // 字文件 ``` 完整项目代码可参考开源项目地址:https://gitcode.com/open-source-toolkit/f1301 [^1] ### 六、显示优化技巧 1. 使用双缓冲机制避免闪烁 2. 对动态内容局部刷新 3. 合理设置屏幕刷新率(建议60Hz)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值