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

五、驱动库扩展与优化

  1. SPI接口支持:若OLED为SPI接口(如1.3寸SSD1306),可修改ssd1306.c中的通信函数(用SPI替代I2C);

  2. 低功耗优化:空闲时关闭OLED显示(SSD1306_DisplayOff),需要时再开启;

  3. 图形库扩展:添加bmp.h头文件,支持显示位图(如公司logo);

  4. 滚动文本:实现SSD1306_ScrollHorizontal(水平滚动)、SSD1306_ScrollVertical(垂直滚动)。

六、总结

本驱动库是STM32驱动SSD1306 OLED的基础方案,通过I2C通信实现高效显示,支持字符串、图形、像素级操作,适用于环境监测、智能手表、工业仪表等场景。其易移植性(仅需修改I2C引脚)与低资源占用(RAM<2KB)使其成为STM32项目的首选OLED驱动方案。

posted @ 2026-05-06 16:01  小前端攻城狮  阅读(0)  评论(0)    收藏  举报