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

在嵌入式开发领域,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!= '\0')​

    {​

    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 显示屏的驱动,能够显示字符和字符串。在实际项目中,还可以进一步扩展功能,如显示图形、图片、实时数据等。希望本文能为你的嵌入式开发

    作者:姚晓财

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32嵌入式开发中OLED显示屏驱动详解

    发表回复