STM32驱动OLED显示汉字与图片的完整实现解析(下) | 零基础入门STM32第五十五步

主题内容教学目的/扩展视频
OLED显示屏重点课程电路原理,手册分析,驱动程序。初始化,清屏,ASCII字库,显示分区。调用显示函数。做带有加入图形和汉字显示的RTC时钟界面。讲字库的设计原理。

师从洋桃电子,杜洋老师



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


一、OLED显示系统架构

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

二、显示原理与数据准备

2.1 OLED显存结构

  • 128x64分辨率分为8页(Page0-Page7)
  • 每页包含128列,每列8个像素点(纵向存储)
  • 数据排列方式:纵向8点下高位模式

2.2 数据生成工具

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

  • ASCII字库:8x16像素,共256字符
  • 汉字字库:16x16像素,GB2312编码
  • 全屏图片:128x64像素,二进制格式

示例取模设置:

(图1:ASCII字库设置示意图)
(图2:汉字字库设置示意图)
(图3:全屏图片设置示意图)

三、关键代码解析

3.1 16x16汉字显示函数

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]);
        }
    }
}

数据存储特点

  • 图片数据总长度:128x8=1024字节
  • 存储顺序:从左到右、从上到下逐页存储

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

四、数据存储方式对比

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

五、扩展应用实践

  1. 添加新汉字

    • 使用取模软件生成字模数据
    • 追加到CHS_16x16.h数组末尾
    • 调用时使用新的索引值
  2. 多图片切换

// 定义图片数组指针
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. 花屏现象:

    • 确保初始化序列完整
    • 检查I2C时序是否符合规格
    • 验证电源稳定性(3.3V最佳)
  3. 字符缺失:

    • 确认字库包含目标字符
    • 检查索引计算是否正确

七、性能优化建议

  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屏进行测试。


💬 技术讨论(请在评论区留言~)

📌 下期预告:下一期将探讨继电器的原理与驱动程序,欢迎持续关注!

点击查阅🔍往期【STM32专栏】文章

版权声明:本文采用[CC BY-NC-SA 4.0]协议,转载请注明来源
实测开发版:洋桃1号开发版(基于STM32F103C8T6)
更新日志

  • v1.0 初始版本(2025-03-08)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值