STM32芯片驱动的OLED显示屏驱动库设计与实现
一、驱动库概述
在STM32项目中,OLED显示屏(如0.96寸SSD1306)是常用的可视化组件,其驱动库需实现初始化、字符/图形显示、屏幕刷新等核心功能。本驱动库基于STM32 HAL库开发,支持I2C接口的SSD1306 OLED(128×64分辨率),具有轻量级、易移植、高兼容性特点,适用于STM32F1/F4系列单片机(如STM32F103C8T6、STM32F407ZGT6)。
二、核心参数与兼容性
| 参数 | 说明 |
|---|---|
| OLED型号 | 0.96寸SSD1306(128×64像素,I2C接口) |
| 接口类型 | I2C(默认地址:0x3C或0x3D,取决于硬件焊接) |
| 分辨率 | 128列×64行(每页8行,共8页) |
| 工作电压 | 3.3V(与STM32共地) |
| 驱动库名称 | ssd1306.h(含ssd1306.c实现文件) |
| 依赖库 | STM32 HAL库(I2C、GPIO、延时函数) |
三、驱动库核心功能
驱动库采用模块化设计,主要包含以下功能:
1. 初始化函数
-
SSD1306_Init(void):初始化I2C接口、配置SSD1306寄存器(如设置显示模式、对比度、扫描方向),清屏并开启显示。 -
关键步骤:发送初始化命令(如
0xAE关闭显示、0xD5设置时钟分频、0x81设置对比度); -
支持I2C地址自动检测(尝试0x3C/0x3D,成功则返回0)。
2. 显示控制函数
-
SSD1306_Clear(void):清屏(所有像素置0),需配合SSD1306_UpdateScreen生效; -
SSD1306_UpdateScreen(void):将显存(缓冲区)数据刷新到OLED屏幕(I2C传输); -
SSD1306_GotoXY(uint8_t x, uint8_t y):设置光标位置(x:0-127列,y:0-7页,每页8行); -
SSD1306_Puts(char \*str, FontDef \*font, uint8_t color):显示字符串(str:字符串,font:字体,color:颜色(0=黑,1=白)); -
SSD1306_DrawPixel(uint8_t x, uint8_t y, uint8_t color):画单个像素(x:0-127,y:0-63)。
3. 字体与图形支持
-
内置字体:提供
Font_7x10(7列×10行,适合小屏幕)、Font_11x18(11列×18行)等常用字体; -
图形绘制:支持画直线(
SSD1306_DrawLine)、矩形(SSD1306_DrawRectangle)、圆形(SSD1306_DrawCircle)等(需自行扩展)。
四、驱动库使用示例(STM32 HAL库)
1. 硬件接线
| OLED引脚 | STM32引脚 | 功能 |
|---|---|---|
| VCC | 3.3V | 电源 |
| GND | GND | 地 |
| SCL | PB8(I2C1) | I2C时钟 |
| SDA | PB9(I2C1) | I2C数据 |
2. 代码实现
(1)初始化I2C与OLED
#include "stm32f1xx_hal.h"
#include "ssd1306.h"
I2C_HandleTypeDef hi2c1; // I2C1句柄
void I2C1_Init(void) {
hi2c1.Instance = I2C1;
hi2c1.Init.ClockSpeed = 100000; // 100kHz
hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;
hi2c1.Init.OwnAddress1 = 0;
hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
HAL_I2C_Init(&hi2c1);
}
int main(void) {
HAL_Init();
SystemClock_Config();
I2C1_Init();
// 初始化SSD1306(I2C地址0x3C)
if (SSD1306_Init(0x3C) != 0) {
Error_Handler(); // 初始化失败
}
SSD1306_Clear(); // 清屏
SSD1306_UpdateScreen(); // 刷新
while (1) {
// 显示示例
Display_Example();
HAL_Delay(1000);
}
}
(2)显示温湿度数据(参考“STM32驱动DHT11”项目)
#include "ssd1306.h"
#include "font.h" // 包含Font_7x10定义
void Display_Data(uint8_t temp_int, uint8_t temp_dec, uint8_t humi_int, uint8_t humi_dec) {
char buf[20];
// 显示温度(如“T:25.0℃”)
sprintf(buf, "T:%d.%dC", temp_int, temp_dec);
SSD1306_GotoXY(0, 0); // 第0页(0-7行)、第0列
SSD1306_Puts(buf, &Font_7x10, SSD1306_COLOR_WHITE);
// 显示湿度(如“H:60%”)
sprintf(buf, "H:%d.%d%%", humi_int, humi_dec);
SSD1306_GotoXY(0, 2); // 第2页(16-23行)、第0列
SSD1306_Puts(buf, &Font_7x10, SSD1306_COLOR_WHITE);
SSD1306_UpdateScreen(); // 刷新屏幕
}
参考代码 STM32芯片驱动的OLED显示屏驱动库 www.youwenfan.com/contentcnu/183224.html
五、驱动库扩展与优化
-
SPI接口支持:若OLED为SPI接口(如1.3寸SSD1306),可修改
ssd1306.c中的通信函数(用SPI替代I2C); -
低功耗优化:空闲时关闭OLED显示(
SSD1306_DisplayOff),需要时再开启; -
图形库扩展:添加
bmp.h头文件,支持显示位图(如公司logo); -
滚动文本:实现
SSD1306_ScrollHorizontal(水平滚动)、SSD1306_ScrollVertical(垂直滚动)。
六、总结
本驱动库是STM32驱动SSD1306 OLED的基础方案,通过I2C通信实现高效显示,支持字符串、图形、像素级操作,适用于环境监测、智能手表、工业仪表等场景。其易移植性(仅需修改I2C引脚)与低资源占用(RAM<2KB)使其成为STM32项目的首选OLED驱动方案。
浙公网安备 33010602011771号