【已验证】STM32驱动OLED(SSD1306)显示字符 📅 发布时间:2026/7/12 23:05:38 👁️ 浏览次数: 本文介绍如何使用STM32F103C8T6蓝板通过软件模拟IIC协议驱动0.96英寸OLED驱动芯片SSD1306这个小屏幕相信每一个朋友在大学生活里都不会错过也是很多课设毕设显示需求的首选我一向喜欢直接干咱们也不说那些原理啥的直接站在前人的肩膀优化进而形成自己的框架。1. 硬件连接OLED引脚STM32引脚VCC3.3VGNDGNDSCLPB6SDAPB7可根据实际修改引脚只需在代码中对应修改即可。2. 驱动架构代码分为三个文件oled.h引脚定义、函数声明oled_font.h存放所有字库数据6x8 ASCII、8x16 ASCII、16x16汉字oled.cIIC模拟、OLED初始化、显示函数实现这种结构将字库与驱动分离便于维护和扩充汉字。3. 关键代码实现3.1 引脚定义与IIC宏// oled.h #define OLED_SCL_PORT GPIOB #define OLED_SCL_PIN GPIO_PIN_6 #define OLED_SDA_PORT GPIOB #define OLED_SDA_PIN GPIO_PIN_7 #define OLED_SCL_H HAL_GPIO_WritePin(OLED_SCL_PORT, OLED_SCL_PIN, GPIO_PIN_SET) #define OLED_SCL_L HAL_GPIO_WritePin(OLED_SCL_PORT, OLED_SCL_PIN, GPIO_PIN_RESET) #define OLED_SDA_H HAL_GPIO_WritePin(OLED_SDA_PORT, OLED_SDA_PIN, GPIO_PIN_SET) #define OLED_SDA_L HAL_GPIO_WritePin(OLED_SDA_PORT, OLED_SDA_PIN, GPIO_PIN_RESET)3.2 软件IIC核心函数// oled.c static void IIC_Start(void) { OLED_SDA_H; OLED_SCL_H; delay_us(5); OLED_SDA_L; delay_us(5); OLED_SCL_L; } static void IIC_Stop(void) { OLED_SCL_L; OLED_SDA_L; delay_us(5); OLED_SCL_H; delay_us(5); OLED_SDA_H; } static void IIC_SendByte(uint8_t byte) { for(uint8_t i0; i8; i) { if(byte 0x80) OLED_SDA_H; else OLED_SDA_L; byte 1; delay_us(2); OLED_SCL_H; delay_us(2); OLED_SCL_L; delay_us(2); } } static void OLED_WriteCmd(uint8_t cmd) { IIC_Start(); IIC_SendByte(0x78); // 写地址 IIC_WaitAck(); IIC_SendByte(0x00); // 命令模式 IIC_WaitAck(); IIC_SendByte(cmd); IIC_WaitAck(); IIC_Stop(); }3.3 SSD1306初始化序列void OLED_Init(void) { // 初始化GPIO使能时钟开漏输出 OLED_WriteCmd(0xAE); // 关闭显示 OLED_WriteCmd(0x81); // 对比度设置 OLED_WriteCmd(0xFF); OLED_WriteCmd(0xA4); // 正常显示 OLED_WriteCmd(0xA6); // 正显0亮1灭 OLED_WriteCmd(0x20); // 寻址模式 OLED_WriteCmd(0x10); // 页寻址模式 OLED_WriteCmd(0xB0); // 起始页0 OLED_WriteCmd(0x00); // 起始列低4位 OLED_WriteCmd(0x10); // 起始列高4位 OLED_WriteCmd(0x40); // 起始行 OLED_WriteCmd(0xA1); // 列重映射SEG0-列127 OLED_WriteCmd(0xA8); // 多路复用比 OLED_WriteCmd(0x3F); OLED_WriteCmd(0xC8); // COM扫描方向反向 OLED_WriteCmd(0xD3); // 显示偏移 OLED_WriteCmd(0x00); OLED_WriteCmd(0xDA); // COM引脚配置 OLED_WriteCmd(0x12); OLED_WriteCmd(0xD9); // 预充电周期 OLED_WriteCmd(0x22); OLED_WriteCmd(0xDB); // VCOMH电压 OLED_WriteCmd(0x20); OLED_WriteCmd(0x8D); // 电荷泵 OLED_WriteCmd(0x14); OLED_WriteCmd(0xAF); // 开启显示 }3.4 显示字符// 6x8 ASCII显示 void OLED_ShowChar_6x8(uint8_t x, uint8_t y, uint8_t ch) { uint8_t c ch - 32; OLED_SetPos(x, y); for(uint8_t i0; i6; i) OLED_WriteData(F6x8[c][i]); } // 8x16 ASCII显示 void OLED_ShowChar_8x16(uint8_t x, uint8_t y, uint8_t ch) { uint8_t c ch - 32; OLED_SetPos(x, y); for(uint8_t i0; i8; i) OLED_WriteData(F8X16[c*16 i]); OLED_SetPos(x, y1); for(uint8_t i0; i8; i) OLED_WriteData(F8X16[c*16 i 8]); }3.5 显示汉字16x16void OLED_ShowChinese(uint8_t x, uint8_t y, uint8_t index) { uint16_t addr index * 32; // 每个汉字32字节 OLED_SetPos(x, y); for(uint8_t i0; i16; i) OLED_WriteData(F16x16[addr i]); OLED_SetPos(x, y1); for(uint8_t i0; i16; i) OLED_WriteData(F16x16[addr 16 i]); }5. 字库说明6x8 ASCII共95个字符每个6字节适合显示简单英文。8x16 ASCII共95个字符每个16字节高度为16可显示更清晰的英文。16x16汉字用户可自行添加汉字每个汉字32字节列行式逆向输出。示例中内置了“野火电子”四个汉字可根据需要扩充。字库数据存放在独立的头文件oled_font.h中便于维护和替换。6. 效果展示通过网盘分享的文件STM32_OLED_SoftIIC.zip链接: https://pan.baidu.com/s/1CdxPxJS3hajggX4NcLUoxQ?pwdrxnz 提取码: rxnz--来自百度网盘超级会员v8的分享
5大核心价值重构云游戏体验:Sunshine让你的游戏突破硬件与空间限制 5大核心价值重构云游戏体验:Sunshine让你的游戏突破硬件与空间限制 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 在数字娱乐日益碎片化的今天,玩家们面临… 2026/4/1 0:51:53
AVR机器人固件基座:负熵架构与确定性调度 1. 项目概述“Negentropic Base”是一个面向AVR微控制器平台的嵌入式固件基础框架,专为移动机器人(尤其是轮式探测车、自主巡线小车、轻量级自主导航平台)设计。其名称中的“Negentropic”(负熵)并非玄学术语ÿ… 2026/4/1 0:50:10
网易云音乐直链解析技术方案:打造稳定访问的音乐资源管理解决方案 网易云音乐直链解析技术方案:打造稳定访问的音乐资源管理解决方案 【免费下载链接】netease-cloud-music-api 网易云音乐直链解析 API 项目地址: https://gitcode.com/gh_mirrors/ne/netease-cloud-music-api 在数字音乐收藏与分享过程中,音乐爱好… 2026/4/1 0:48:59
第6章数据库设计基础知识 第6章 数据库设计基础知识 6.1 数据库基本概念 核心概念 数据库系统(DBS):由数据库(DB)、数据库管理系统(DBMS)、数据库管理员(DBA)、应用程序与用户、数据五部分组成。三… 2026/7/12 23:03:01
GTA5线上小助手:如何用免费开源工具彻底改变你的游戏体验? GTA5线上小助手:如何用免费开源工具彻底改变你的游戏体验? 【免费下载链接】GTA5OnlineTools GTA5线上小助手 项目地址: https://gitcode.com/gh_mirrors/gt/GTA5OnlineTools 还在为GTA5线上模式中的重复任务、有限的自定义选项和繁琐的操作感到困… 2026/7/12 23:00:59
基于HarmonyOS的情侣美食管理应用开发实战(十三)- 修复主页菜谱列表不显示问题 基于HarmonyOS的情侣美食管理应用开发实战(一)- 修复主页菜谱列表不显示问题 问题现象 在 HarmonyOS 应用开发过程中,遇到了一个奇怪的问题: 主页"我的菜谱"模块:显示"共4个",但列表… 2026/7/12 23:00:59
Creative View Pager深度解析:10个高级定制技巧与最佳实践 Creative View Pager深度解析:10个高级定制技巧与最佳实践 【免费下载链接】creative-viewpager Creative View Pager easy to use in Android 项目地址: https://gitcode.com/gh_mirrors/cr/creative-viewpager Creative View Pager是一个功能强大的Android… 2026/7/12 22:58:58
WebSocket 异常处理最佳实践:基于 gh_mirrors/webso/websocket-client 的完整指南 [特殊字符] WebSocket 异常处理最佳实践:基于 gh_mirrors/webso/websocket-client 的完整指南 🚀 【免费下载链接】websocket-client 🔧 .NET/C# websocket client library 项目地址: https://gitcode.com/gh_mirrors/webso/websocket-client 在实… 2026/7/12 22:58:58
YOLO11 改进 - 特征融合 | SMMM结构感知多尺度掩码模块,筛除冗余、强化边界与语义交互,助力图像分割高效涨点 | AAAI 2026 前言 本文介绍了结构感知多尺度掩码模块——SMMM,用于优化编码器与解码器之间的特征融合。该方法通过多尺度深度可分离卷积捕获不同感受野下的边缘、纹理与结构信息,并利用结构显著性掩码对关键区域进行自适应筛选,抑制背景噪声与冗余特征。… 2026/7/12 22:58:58
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14