基于STM32F1的0.96寸OLED显示屏驱动程序,支持硬件/软件I2C

💡 原文中文,约55200字,阅读约需132分钟。
📝

内容提要

该文章介绍了基于STM32F103的0.96寸OLED显示屏驱动程序,支持硬件IIC/软件IIC接口,显示多种内容和图形,同时介绍了I2C通信协议的原理和使用方法。

🔎

延伸解读

硬件I2C与软件I2C的切换与配置

该驱动通过宏定义OLED_USE_HW_I2C和OLED_USE_SW_I2C选择通信方式,默认启用硬件I2C。硬件I2C使用STM32的I2C外设,需将GPIO配置为复用开漏模式,并初始化I2C参数如时钟频率、地址等;软件I2C则通过普通GPIO模拟时序,配置为开漏输出。切换时需注意不能同时启用两个宏,且硬件I2C的引脚固定为I2C1的PB6/PB7,软件I2C可自定义引脚。

通信速率实测与稳定性建议

文章实测硬件I2C在STM32F103C8T6上最高速率可达1.3Mbit/s,而AIR32F103CBT6最高仅600kbit/s。代码中默认设置为600kHz,并建议使用400kHz以保证稳定性。读者在移植时需根据实际MCU调整I2C_ClockSpeed,过高的速率可能导致通信失败,尤其在长导线或干扰环境下应适当降低速率。

显存机制与更新函数的使用要点

所有显示和绘图函数仅操作全局显存数组OLED_DisplayBuf,不会立即刷新屏幕。必须调用OLED_Update或OLED_UpdateArea将显存数据发送到OLED。这种设计允许先构建完整画面再一次性更新,避免闪烁。注意OLED_UpdateArea按页更新,若指定区域跨页,同页剩余部分也会被更新,可能影响其他内容。

汉字显示与字模库的依赖关系

OLED_ShowChinese函数依赖OLED_Data.c中的OLED_CF16x16数组存储汉字字模。若显示的汉字未在数组中定义,会显示默认的方框问号图形。因此,要显示自定义汉字,需先使用取模软件生成字模并添加到该数组。此外,汉字串必须全部为汉字或全角字符,不能混入半角字符,否则解析会出错。

❓

Q&A

这个OLED驱动程序支持哪些显示内容和绘图功能?

支持显示英文、整数、浮点数、汉字、图像、二进制数、十六进制数等内容,还可以画点、直线、矩形、圆、椭圆、三角形等,支持多种字体,相当于一个简易版图形库。

如何在硬件I2C和软件I2C之间切换?

在OLED.c文件中通过宏定义选择:默认使用硬件I2C(#define OLED_USE_HW_I2C),如果要使用软件I2C,则将硬件I2C那行的宏定义注释掉,将软件I2C那行的注释取消(#define OLED_USE_SW_I2C)。注意不能同时取消注释两个。

这个驱动程序在哪些硬件上测试过?通信速率如何?

测试硬件为STM32F103C8T6和AIR32F103CBT6。使用硬件I2C时,STM32F103最高通信速率可达1.3Mbit/s,AIR32F103最高只能达到600kbit/s。

I2C通信协议有哪些主要特点?

I2C使用两条总线线路:双向串行数据线SDA和串行时钟线SCL,支持多设备连接,采用半双工通信方式。总线通过上拉电阻接到电源,设备空闲时输出高阻态。通信时GPIO口必须设置为开漏输出。

这个驱动程序是基于什么代码修改的?修改了哪些内容?

该程序基于江协科技的代码进行二次修改,原版程序只支持软件I2C,修改后增加了对硬件I2C的支持,并可通过修改宏定义选择使用硬件或软件I2C。

如何获取完整的驱动程序代码和工程文件?

完整工程下载地址:百度网盘链接(提取码: wgc3)和123网盘链接(提取码: m7sp)。工程使用Keil5创建,也可用Vscode+EIDE开发,文件全部使用UTF-8编码。

🏷️

标签

➡️

继续阅读