单片机
返回首页

STM32驱动OLED显示汉字与图片全面解析(下)——零基础入门指南,第55步实战教程

2025-10-20 来源:cnblogs

▲ 回顾上期????STM32驱动OLED屏幕全解析:从原理到温度显示实战(中) | 零基础入门STM32第五十四步


一、OLED显示系统架构

+-------------------+       +-----------------+
|     主程序         |       |   OLED驱动层    |
| (main.c)          |<----->| (oled0561.c/h)  |
+-------------------+       +-----------------+
       |                          |
       v                          v
+-------------------+       +-----------------+
| 温度传感器驱动     |       | 字库/图片数据层  |
| (lm75a.c/h)       |       | (ASCII/CHS/PIC) |
+-------------------+       +-----------------+

二、显示原理与数据准备

2.1 OLED显存结构

  • 128×64分辨率分为8页(Page0-Page7)

  • 每页包含128列,每列8个像素点(纵向存储)

  • 数据排列方式:纵向8点下高位模式

  • 2.2 数据生成工具

    使用液晶汉字模提取(下方资料提供)等取模软件生成:

  • ASCII字库:8×16像素,共256字符

  • 汉字字库:16×16像素,GB2312编码

  • 全屏图片:128×64像素,二进制格式

  • 示例取模设置:


    (图1:ASCII字库设置示意图)

    (图2:汉字字库设置示意图)

    (图3:全屏图片设置示意图)

    三、关键代码解析

    3.1 16×16汉字显示函数

    void OLED_DISPLAY_16x16(u8 x, u8 y, u16 w) {
        u8 j,t,c=0;
        for(t=0;t<2;t++){ // 分上下两部分
            // 设置显示位置
            I2C_SAND_BYTE(OLED_ADD, COM, 0xb0+x); 
            I2C_SAND_BYTE(OLED_ADD, COM, y/16+0x10);
            I2C_SAND_BYTE(OLED_ADD, COM, y%16);
            
            // 写入16字节数据
            for(j=0;j<16;j++){ 
                I2C_SAND_BYTE(OLED_ADD, DAT, GB_16[w*32 + c]);
                c++;
            }
            x++; // 换到下一页
        }
    }


    参数解析:

  • x:页地址(0-7)

  • y:列坐标(需16对齐)

  • w:汉字在字库中的索引

  • 3.2 全屏图片显示函数

    void OLED_DISPLAY_PIC1(void) {
        u8 m,i;
        for(m=0;m<8;m++){ // 遍历8页
            // 设置页地址
            I2C_SAND_BYTE(OLED_ADD, COM, 0xb0+m);
            // 设置列地址(固定偏移2)
            I2C_SAND_BYTE(OLED_ADD, COM, 0x10); 
            I2C_SAND_BYTE(OLED_ADD, COM, 0x02);
            
            // 写入128列数据
            for(i=0;i<128;i++){
                I2C_SAND_BYTE(OLED_ADD, DAT, PIC1[i + m*128]);
            }
        }
    }

    数据存储特点:

  • 图片数据总长度:128×8=1024字节

  • 存储顺序:从左到右、从上到下逐页存储

  • 说明:PIC1数组的数据量是128列x8页x每页8行=128×64像素,每个字节对应8个垂直像素。每个像素用1位表示,总数据量是128*64/8=1024字节。

    四、数据存储方式对比

    数据类型存储结构示例头文件
    ASCII字符按ASCII码顺序排列ASCII_8x16.h
    汉字字库按自定义编码顺序排列CHS_16x16.h
    全屏图片按页-列顺序存储PIC1.h

    五、扩展应用实践

    1. 添加新汉字:

    2. 使用取模软件生成字模数据

    3. 追加到CHS_16x16.h数组末尾

    4. 调用时使用新的索引值

    5. 多图片切换:

    // 定义图片数组指针
    const u8* PIC_TABLE[] = {PIC1, PIC2, PIC3};
    
    void ShowPic(u8 index) {
        u8 m,i;
        for(m=0;m<8;m++){
            // ...设置地址...
            for(i=0;i<128;i++)
                I2C_SAND_BYTE(OLED_ADD, DAT, PIC_TABLE[index][i+m*128]);
        }
    }
    1. 动态效果优化:

  • 使用双缓冲机制

  • 局部刷新代替全屏刷新

  • 利用硬件SPI加速传输

  • 六、常见问题排查

    1. 显示错位:

    2. 检查坐标计算是否包含+2偏移

    3. 验证取模方向设置是否正确

    4. 花屏现象:

    5. 确保初始化序列完整

    6. 检查I2C时序是否符合规格

    7. 验证电源稳定性(3.3V最佳)

    8. 字符缺失:

    9. 确认字库包含目标字符

    10. 检查索引计算是否正确

    七、性能优化建议

    1. 批量传输优化:

    // 改进后的单页传输(示例)
    void SendPage(u8 page, u8* data) {
        I2C_Start();
        I2C_SendByte(OLED_ADD);
        I2C_SendByte(0x00); // Command mode
        I2C_SendByte(0xB0 | page);
        I2C_SendByte(0x10);
        I2C_SendByte(0x02);
        I2C_Stop();
        
        I2C_Start();
        I2C_SendByte(OLED_ADD);
        I2C_SendByte(0x40); // Data mode
        for(int i=0;i<128;i++)
            I2C_SendByte(data[i]);
        I2C_Stop();
    }
    1. 内存优化策略:

  • 使用压缩字库(Huffman编码)


  • 分页加载大尺寸图片

  • 动态生成简单图形


  • 八、相关资源

    [1] 洋桃电子B站课程-STM32入门100步
    [2] STM32F103xx官方数据手册
    [3] STM32F103X8-B数据手册(中文)
    [4] STM32F103固件函数库用户手册(中文)
    [5] OLED12864显示屏数据手册
    [6] OLED屏驱动程序分析.pptx
    [7] OLED屏汉字与图片显示程序
    [8] LCD汉字取模板软件(中文版)


    总结


    本文实现的显示系统已通过STM32F103C8T6验证,配套资源包含:

  • 完整工程代码

  • 取模软件配置模板

  • 常用汉字字库集

  • 图片转换工具链

  • 通过灵活运用本文介绍的方法,可以快速构建各种OLED显示界面,结合传感器数据实现丰富的物联网设备人机交互界面。

    可直接将代码复制到STM32工程中使用,注意根据实际硬件调整I2C地址和引脚配置。建议使用Keil MDK或PlatformIO进行编译,推荐搭配0.96寸SSD1306 OLED屏进行测试。


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

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

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

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

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

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

精选电路图
  • 便携式混音器

  • 18W乙类音频放大器

  • 6晶体管H桥

  • USB LED调光器

  • USB自供电声卡

  • AVR LCD温度计—LM35

    相关电子头条文章