单片机
返回首页

STM32嵌入式开发中OLED显示屏驱动详解

2025-09-25 来源:cnblogs

在嵌入式开发领域,OLED(有机发光二极管)显示屏凭借其自发光、高对比度、视角广、厚度薄等优势,成为众多项目中显示模块的热门选择。本文将详细介绍如何在 STM32 微控制器上驱动 OLED 显示屏,涵盖原理、硬件连接、代码实现以及调试技巧,助力开发者快速上手。

一、OLED 显示屏原理概述

OLED 显示屏主要分为 PMOLED(被动矩阵 OLED)和 AMOLED(主动矩阵 OLED),在嵌入式开发中常用的是 PMOLED。其核心原理基于有机材料在电场作用下自发光,每个像素点可独立控制发光,无需背光源。常见的 OLED 显示屏采用 I²C 或 SPI 通信协议与微控制器进行数据传输,本文以 I²C 协议为例展开讲解,该协议只需两根线(SDA 数据线和 SCL 时钟线)即可完成数据通信,节省硬件资源且便于布线。

二、硬件连接

1. 硬件准备

  • STM32 微控制器:本文以 STM32F103 系列为例,读者可根据实际项目需求选择其他型号。

  • OLED 显示屏:选用 0.96 寸 I²C 接口的 OLED 显示屏,分辨率为 128×64。

  • 开发板:可使用官方开发板或自制开发板。

  • 其他:杜邦线若干、电源等。

  • 2. 连接方式

    将 OLED 显示屏与 STM32 微控制器通过杜邦线进行连接,具体连接关系如下:


    OLED 引脚

    STM32 引脚

    说明

    VCC

    3.3V

    电源正极

    GND

    GND

    电源负极

    SDA

    PB7

    I²C 数据线

    SCL

    PB6

    I²C 时钟线



    三、代码实现

    1. 配置 STM32 的 I²C 外设

    在 STM32CubeMX 中进行配置:

    1. 打开 STM32CubeMX,选择对应的 STM32 芯片型号。

    1. 配置 RCC 时钟,使能 HSE(高速外部时钟)。

    1. 配置 I²C 外设,选择 I²C1(根据实际连接引脚选择),设置模式为 I²C 模式,时钟频率可设置为 100kHz(标准模式)。

    1. 生成初始化代码,选择对应的开发环境(如 Keil MDK)。

    2. 编写 OLED 驱动代码

    在生成的工程中,创建oled.c和oled.h文件用于存放 OLED 驱动代码。

    (1)初始化函数


    TypeScript

    复制

    void OLED_Init(void)

    {

    // 复位OLED

    OLED_RST_Clr();

    HAL_Delay(100);

    OLED_RST_Set();

    HAL_Delay(100);


    // 发送初始化命令

    OLED_WR_Byte(0xAE, OLED_CMD); // 关闭显示

    OLED_WR_Byte(0x00, OLED_CMD); // 设置低列地址

    OLED_WR_Byte(0x10, OLED_CMD); // 设置高列地址

    OLED_WR_Byte(0x40, OLED_CMD); // 设置起始行地址

    OLED_WR_Byte(0x81, OLED_CMD); // 设置对比度控制

    OLED_WR_Byte(0xCF, OLED_CMD);

    OLED_WR_Byte(0xA1, OLED_CMD); // 设置段重定义

    OLED_WR_Byte(0xA6, OLED_CMD); // 设置正常显示

    OLED_WR_Byte(0xA8, OLED_CMD); // 设置多路复用率

    OLED_WR_Byte(0x3F, OLED_CMD);

    OLED_WR_Byte(0xC8, OLED_CMD); // 设置COM输出扫描方向

    OLED_WR_Byte(0xD3, OLED_CMD); // 设置显示偏移

    OLED_WR_Byte(0x00, OLED_CMD);

    OLED_WR_Byte(0xD5, OLED_CMD); // 设置显示时钟分频比/振荡器频率

    OLED_WR_Byte(0x80, OLED_CMD);

    OLED_WR_Byte(0xD9, OLED_CMD); // 设置预充电周期

    OLED_WR_Byte(0xF1, OLED_CMD);

    OLED_WR_Byte(0xDA, OLED_CMD); // 设置COM引脚硬件配置

    OLED_WR_Byte(0x12, OLED_CMD);

    OLED_WR_Byte(0xDB, OLED_CMD); // 设置VCOMH电压等级

    OLED_WR_Byte(0x40, OLED_CMD);

    OLED_WR_Byte(0x8D, OLED_CMD); // 设置电荷泵使能

    OLED_WR_Byte(0x14, OLED_CMD);

    OLED_WR_Byte(0xAF, OLED_CMD); // 开启显示

    }


    (2)写数据和命令函数


    TypeScript

    复制

    void OLED_WR_Byte(uint8_t dat, uint8_t cmd)

    {

    I2C_HandleTypeDef hi2c1 = OLED_I2C; // 假设OLED_I2C为I²C句柄

    uint8_t data[2];

    data[0] = cmd? 0x40 : 0x00;

    data[1] = dat;

    HAL_I2C_Master_Transmit(&hi2c1, OLED_ADDRESS, data, 2, 1000);

    }


    (3)清屏函数


    TypeScript

    复制

    void OLED_Clear(void)

    {

    uint8_t i, n;

    for (i = 0; i < 8; i++)

    {

    OLED_WR_Byte(0xb0 + i, OLED_CMD);

    OLED_WR_Byte(0x00, OLED_CMD);

    OLED_WR_Byte(0x10, OLED_CMD);

    for (n = 0; n < 128; n++)

    OLED_WR_Byte(0x00, OLED_DATA);

    }

    }


    (4)显示字符和字符串函数


    TypeScript

    复制

    void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size)

    {

    // 实现字符显示逻辑,此处省略具体代码

    }


    void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *p, uint8_t Char_Size)

    {

    while (*p!= '')

    {

    OLED_ShowChar(x, y, *p, Char_Size);

    x += 8;

    if (x > 120)

    {

    x = 0;

    y += 2;

    }

    p++;

    }

    }


    3. 在主函数中调用

    在main.c文件中,包含oled.h头文件,并在main函数中调用初始化和显示函数:



    #include 'oled.h'


    int main(void)

    {

    HAL_Init();

    SystemClock_Config();

    MX_GPIO_Init();

    MX_I2C1_Init();

    OLED_Init();

    OLED_Clear();

    OLED_ShowString(0, 0, 'Hello, OLED!', 16);

    while (1)

    {

    // 主循环逻辑

    }

    }


    四、调试与常见问题解决

    1. 调试工具

    在调试过程中,可使用串口打印调试信息,或者利用 STM32 的调试器(如 ST-Link)进行单步调试,观察变量值和函数执行流程。

    2. 常见问题及解决方法

  • 显示屏无显示:检查硬件连接是否正确,电源是否正常,I²C 通信是否成功(可通过示波器观察 SDA 和 SCL 信号)。

  • 显示乱码:确认初始化命令是否正确发送,显示函数的参数设置是否合理,如字符大小、坐标等。

  • 通信失败:检查 I²C 的时钟频率设置是否与 OLED 显示屏兼容,排查 I²C 引脚是否被其他外设复用。

  • 通过以上步骤,我们成功实现了 STM32 对 OLED 显示屏的驱动,能够显示字符和字符串。在实际项目中,还可以进一步扩展功能,如显示图形、图片、实时数据等。希望本文能为你的嵌入式开发


进入单片机查看更多内容>>
相关视频
  • 【TI MSPM0 应用实战】智能小车+工业角度编码器+血氧仪+烟雾探测器!硬核参考设计详解!

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

  • 直播回放: Microchip Timberwolf™ 音频处理器在线研讨会

  • 基于灵动MM32W0系列MCU的指夹血氧仪控制及OTA升级应用方案分享

精选电路图
  • 以太网控制器

  • 便携式耳机放大器

  • 最简单的调频接收机

  • PLL调谐模块

  • 简易调频接收机

  • 铃声发生器

    相关电子头条文章