当前位置: 首页 > article >正文

手把手教你用STM32F103的GPIO口模拟IIC驱动0.96寸OLED(附完整代码和字模提取教程)

STM32F103实战GPIO模拟IIC驱动0.96寸OLED全流程解析1. 项目背景与硬件准备在嵌入式开发中OLED显示屏因其高对比度、低功耗和轻薄特性成为人机交互的首选方案。对于STM32F103这类基础型MCU通过GPIO模拟IIC协议驱动OLED是一种高性价比的解决方案。本教程将使用STM32F103C8T6最小系统板俗称蓝莓派和4针0.96寸OLED模块SSD1306驱动芯片仅需两根信号线即可实现显示控制。所需硬件清单STM32F103C8T6开发板0.96寸OLED模块分辨率128×64杜邦线若干USB转TTL模块用于程序下载注意OLED模块供电电压为3.3V直接连接5V系统可能导致器件损坏。建议使用万用表确认开发板GPIO电压电平。2. 硬件连接与工程搭建2.1 引脚连接方案采用GPIO模拟IIC只需连接4根线OLED引脚STM32引脚功能说明GNDGND地线VCC3.3V电源SCLPB6时钟线SDAPB7数据线电路连接要点推荐在SCL/SDA线上添加4.7K上拉电阻长距离传输时可适当降低IIC速率确保共地连接避免信号干扰2.2 开发环境配置使用Keil MDK创建新工程选择STM32F103C8系列芯片启用GPIOB时钟RCC配置添加必要的库文件#include stm32f10x.h #include delay.h // 需自行实现微秒级延时3. IIC协议模拟实现3.1 GPIO初始化配置// myiic.h 引脚定义 #define IIC_SCL_PIN GPIO_Pin_6 #define IIC_SDA_PIN GPIO_Pin_7 #define IIC_PORT GPIOB // myiic.c 初始化函数 void IIC_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // SCL配置为开漏输出 GPIO_InitStructure.GPIO_Pin IIC_SCL_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(IIC_PORT, GPIO_InitStructure); // SDA配置为开漏输出 GPIO_InitStructure.GPIO_Pin IIC_SDA_PIN; GPIO_Init(IIC_PORT, GPIO_InitStructure); IIC_SCL 1; IIC_SDA 1; }3.2 关键时序函数实现IIC协议的核心是严格的时序控制以下是典型实现// 起始信号 void IIC_Start(void) { SDA_OUT(); IIC_SDA 1; IIC_SCL 1; delay_us(4); IIC_SDA 0; delay_us(4); IIC_SCL 0; } // 停止信号 void IIC_Stop(void) { SDA_OUT(); IIC_SCL 0; IIC_SDA 0; delay_us(4); IIC_SCL 1; IIC_SDA 1; delay_us(4); } // 等待应答 u8 IIC_Wait_Ack(void) { u8 timeout 0; SDA_IN(); IIC_SDA 1; delay_us(1); IIC_SCL 1; delay_us(1); while(READ_SDA) { if(timeout 250) { IIC_Stop(); return 1; } } IIC_SCL 0; return 0; }时序参数优化技巧标准模式(100kHz)下时钟高/低电平保持4μs快速模式(400kHz)可缩短至1μs实际应用中需用示波器验证信号质量4. OLED驱动开发4.1 初始化序列SSD1306需要特定的初始化命令序列void OLED_Init(void) { delay_ms(200); // 电源稳定等待 OLED_WR_Byte(0xAE, OLED_CMD); // 关闭显示 OLED_WR_Byte(0xD5, OLED_CMD); // 设置时钟分频 OLED_WR_Byte(0x80, OLED_CMD); // 建议值 OLED_WR_Byte(0xA8, OLED_CMD); // 多路复用比例 OLED_WR_Byte(0x3F, OLED_CMD); // 1/64 duty OLED_WR_Byte(0xD3, OLED_CMD); // 显示偏移 OLED_WR_Byte(0x00, OLED_CMD); // 无偏移 // ... 其他初始化命令 OLED_WR_Byte(0xAF, OLED_CMD); // 开启显示 }4.2 显存管理机制SSD1306采用分页式显存结构8页×128列u8 OLED_GRAM[128][8]; // 定义显存数组 // 更新显存到OLED void OLED_Refresh(void) { for(u8 i0; i8; i) { OLED_WR_Byte(0xB0i, OLED_CMD); // 设置页地址 OLED_WR_Byte(0x00, OLED_CMD); // 列低地址 OLED_WR_Byte(0x10, OLED_CMD); // 列高地址 for(u8 n0; n128; n) { OLED_WR_Byte(OLED_GRAM[n][i], OLED_DATA); } } }4.3 基础绘图函数实现点、线、矩形等基本图形// 画点函数 void OLED_DrawPoint(u8 x, u8 y, u8 mode) { if(x127 || y63) return; u8 page y / 8; u8 bit_mask 1 (y % 8); if(mode) OLED_GRAM[x][page] | bit_mask; else OLED_GRAM[x][page] ~bit_mask; } // Bresenham画线算法 void OLED_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2) { int dx abs(x2-x1), sx x1x2 ? 1 : -1; int dy abs(y2-y1), sy y1y2 ? 1 : -1; int err (dxdy ? dx : -dy)/2, e2; while(1){ OLED_DrawPoint(x1, y1, 1); if(x1x2 y1y2) break; e2 err; if(e2 -dx) { err - dy; x1 sx; } if(e2 dy) { err dx; y1 sy; } } }5. 字模提取与中文显示5.1 使用PCtoLCD2002取模打开软件选择字符模式设置参数点阵格式阴码取模方式逐列式取模走向逆向输出格式C51格式生成字模后保存为oledfont.h5.2 汉字显示实现// 显示16×16汉字 void OLED_ShowCHinese(u8 x, u8 y, u8 no) { u8 t; OLED_Set_Pos(x, y); for(t0; t16; t) { OLED_WR_Byte(Hzk[2*no][t], OLED_DATA); } OLED_Set_Pos(x, y1); for(t0; t16; t) { OLED_WR_Byte(Hzk[2*no1][t], OLED_DATA); } } // 调用示例 OLED_ShowCHinese(0, 0, 0); // 显示字库中第0个汉字5.3 字符串显示优化void OLED_ShowString(u8 x, u8 y, const u8 *str, u8 size) { while(*str ! \0) { if(x 120) { x 0; y 2; } OLED_ShowChar(x, y, *str, size); x size/2; str; } }6. 高级功能实现6.1 图片显示void OLED_DrawBMP(u8 x0, u8 y0, u8 x1, u8 y1, const u8 *bmp) { u32 j 0; u8 x, y; for(yy0; yy1; y) { OLED_Set_Pos(x0, y); for(xx0; xx1; x) { OLED_WR_Byte(bmp[j], OLED_DATA); } } }6.2 动画效果实现// 进度条动画 void OLED_ProgressBar(u8 x, u8 y, u8 width, u8 height, u8 progress) { // 绘制边框 OLED_DrawRect(x, y, width, height); // 计算填充宽度 u8 fill (width-2) * progress / 100; // 填充区域 for(u8 i1; iheight-1; i) { OLED_DrawLine(x1, yi, x1fill, yi); } // 百分比显示 char buf[5]; sprintf(buf, %d%%, progress); OLED_ShowString(xwidth2, y, (u8*)buf, 12); }7. 性能优化与调试技巧7.1 常见问题排查现象可能原因解决方案屏幕无显示电源未接通检查VCC/GND连接显示乱码初始化序列错误核对SSD1306手册内容闪烁刷新速率过低优化刷新逻辑IIC无响应上拉电阻缺失添加4.7K上拉7.2 性能优化建议局部刷新仅更新变化区域显存void OLED_PartialRefresh(u8 x0, u8 y0, u8 x1, u8 y1) { // 实现指定区域刷新 }双缓冲机制减少视觉闪烁指令打包合并连续命令传输8. 项目扩展与进阶8.1 多级菜单实现typedef struct { u8 current; u8 max_items; const char **items; void (*action)(u8); } Menu; void OLED_ShowMenu(Menu *menu) { OLED_Clear(); for(u8 i0; imenu-max_items; i) { if(i menu-current) { OLED_ShowString(0, i*2, , 16); } OLED_ShowString(10, i*2, menu-items[i], 16); } }8.2 硬件IIC对比虽然GPIO模拟灵活但硬件IIC更有优势特性模拟IIC硬件IIC速度≤400kHz≤1MHzCPU占用高低稳定性依赖延时精度硬件保证引脚占用任意GPIO固定引脚移植到硬件IIC只需修改底层传输函数void I2C_WriteByte(uint8_t addr, uint8_t data) { I2C_GenerateSTART(I2C1, ENABLE); while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // ...硬件IIC操作序列 }

相关文章:

手把手教你用STM32F103的GPIO口模拟IIC驱动0.96寸OLED(附完整代码和字模提取教程)

STM32F103实战:GPIO模拟IIC驱动0.96寸OLED全流程解析 1. 项目背景与硬件准备 在嵌入式开发中,OLED显示屏因其高对比度、低功耗和轻薄特性成为人机交互的首选方案。对于STM32F103这类基础型MCU,通过GPIO模拟IIC协议驱动OLED是一种高性价比的解…...

AI开发环境革命:基于Docker的AI-OS项目实战与架构解析

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫samirsawarkar/ai-os。光看这个名字,可能很多人会联想到科幻电影里的“人工智能操作系统”,觉得是不是一个能自己思考、管理硬件的庞然大物。但实际点开仓库,你会发…...

5分钟掌握Blender 3MF插件:释放3D打印的完整潜力

5分钟掌握Blender 3MF插件:释放3D打印的完整潜力 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 想要在Blender中无缝处理3D打印文件吗?Blender3m…...

如何快速修复损坏的MP4视频:免费高效的终极解决方案

如何快速修复损坏的MP4视频:免费高效的终极解决方案 【免费下载链接】untrunc Restore a truncated mp4/mov. Improved version of ponchio/untrunc 项目地址: https://gitcode.com/gh_mirrors/un/untrunc 你是否曾经遇到过珍贵的视频文件突然无法播放&#…...

孤能子视角:跨域联接之异质大模型同构验证“避坑六原则“

(这个是从头条豆包分析点评"周易"一文引起的。Kimi、信兄参与其中。姑且当科幻小说看)(继续观察AI耦合,比较长)(最后给出百度文心分析点评)豆包对"周易"一文的分析好,我先完整吃透孤能子EIS理论核心,再用它的内部逻辑判断…...

决策树处理非结构化数据的3大策略与实战应用

1. 决策树:超越表格数据的全能选手第一次接触决策树时,我和大多数人一样,认为它只能处理规整的Excel表格数据。直到在一次客户投诉分析项目中,我不得不处理混杂着工单文本、时间序列日志和结构化数据的复杂数据集,才真…...

FanControl终极风扇控制指南:Windows系统智能散热完整解决方案

FanControl终极风扇控制指南:Windows系统智能散热完整解决方案 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Tre…...

用STM32的PWM驱动AT8870控制直流电机:从电平控制到精准调速的保姆级代码解析

STM32与AT8870的深度协同:从基础PWM到电机控制库封装实战 在智能小车和机器人开发中,直流电机控制往往是核心环节之一。AT8870作为一款性价比极高的H桥驱动芯片,配合STM32的PWM功能可以实现从简单转向到精准调速的全套控制方案。本文将带您从…...

FanControl终极指南:彻底解决Windows电脑风扇噪音的免费神器

FanControl终极指南:彻底解决Windows电脑风扇噪音的免费神器 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trend…...

从零构建CNN模型解决CIFAR-10图像分类实战指南

1. 从零构建CNN模型解决CIFAR-10图像分类的完整指南在计算机视觉领域,CIFAR-10数据集就像新手的"Hello World",但真正从零开始构建卷积神经网络(CNN)解决这个经典问题,远比调用现成模型复杂得多。我花了三周时间反复调试模型结构&a…...

如何彻底清理macOS应用残留文件:Pearcleaner终极指南

如何彻底清理macOS应用残留文件:Pearcleaner终极指南 【免费下载链接】Pearcleaner A free, source-available and fair-code licensed mac app cleaner 项目地址: https://gitcode.com/gh_mirrors/pe/Pearcleaner 你是否曾经在macOS上删除应用后&#xff0c…...

轻松驾驭AI专著写作:选对工具,20万字专著瞬间生成!

撰写学术专著是一项挑战,尤其在“内容深度”和“覆盖广度”之间找到合适的平衡,对许多研究人员而言,这是一个难以逾越的障碍。从深度来看,AI写专著的过程中,核心观点需要具备较强的学术性,不单要明确“是什…...

Cursor AI助手最佳实践:通过规则配置提升代码质量与团队协作

1. 项目概述:为什么我们需要一套“最佳”的Cursor规则?如果你是一名开发者,并且最近开始使用Cursor——这款集成了AI编程助手的现代编辑器,那么你很可能已经体会过那种“又爱又恨”的感觉。爱的是,它确实能极大地提升编…...

OpenClaw/Hermes Agent如何安装?2026年必备知识

OpenClaw/Hermes Agent如何安装?2026年必备知识。OpenClaw和Hermes Agent是什么?OpenClaw和Hermes Agent怎么部署?如何部署OpenClaw/Hermes Agent?2026年还在为部署OpenClaw和Hermes Agent到处找教程踩坑吗?别再瞎折腾…...

ExplorerBlurMica:让Windows资源管理器焕发毛玻璃新生的神奇工具

ExplorerBlurMica:让Windows资源管理器焕发毛玻璃新生的神奇工具 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlu…...

FPGA当交换机?基于10G Ethernet Subsystem主从模式实现多光口UDP转发实战

FPGA构建10G以太网交换机的核心技术解析与实现 在高速网络设备开发领域,FPGA正逐渐成为传统ASIC和商用交换芯片的有力替代方案。本文将深入探讨如何利用Xilinx 7系列FPGA的10G Ethernet Subsystem IP核,构建一个具备多端口数据交换能力的硬件平台。不同于…...

音乐人做编曲伴奏没思路?2026年度甄选5款AI编曲软件总结,解决歌曲的告高质量编曲伴奏的创作难题

在音乐创作领域,很多音乐人常常面临编曲思路匮乏的难题。尤其是在创作过程中,可能有了歌词和大致的曲子框架,却不知道如何将其完善成完整动听的歌曲。传统的编曲方式不仅需要音乐人具备专业的乐理知识,还得熟练操作复杂的编曲软件…...

终极指南:如何用C++逆向工程打造《赛博朋克2077》专业存档编辑器

终极指南:如何用C逆向工程打造《赛博朋克2077》专业存档编辑器 【免费下载链接】CyberpunkSaveEditor A tool to edit Cyberpunk 2077 sav.dat files 项目地址: https://gitcode.com/gh_mirrors/cy/CyberpunkSaveEditor 你是否曾想过深入《赛博朋克2077》的游…...

创新智能抢票引擎:cppTickerBuy如何让CPP漫展门票轻松到手

创新智能抢票引擎:cppTickerBuy如何让CPP漫展门票轻松到手 【免费下载链接】cppTickerBuy cpp cp30 漫展 活动 抢票 无差别 同人展 项目地址: https://gitcode.com/gh_mirrors/cp/cppTickerBuy 还在为热门漫展门票秒光而烦恼吗?传统手动抢票总在最…...

从静态3D生成到交互式物理仿真的技术突破

1. 项目概述:从静态3D生成到交互式物理仿真的技术跃迁在3D内容创作领域,我们正经历一场从静态重建到动态交互的范式转变。传统3D生成技术如神经辐射场(NeRF)和3D高斯泼溅(3DGS)已经能够生成令人惊叹的静态模…...

Android截屏限制终极破解:Enable Screenshot模块完整使用指南

Android截屏限制终极破解:Enable Screenshot模块完整使用指南 【免费下载链接】DisableFlagSecure 项目地址: https://gitcode.com/gh_mirrors/dis/DisableFlagSecure 你是否曾经遇到过想要截图保存重要信息,却被系统提示"无法截屏"的…...

5分钟快速上手taskt:免费开源的终极RPA办公自动化神器

5分钟快速上手taskt:免费开源的终极RPA办公自动化神器 【免费下载链接】taskt taskt (pronounced tasked and formely sharpRPA) is free and open-source robotic process automation (rpa) built in C# powered by the .NET Framework 项目地址: https://gitcod…...

Stable Diffusion Forge终极指南:3步搭建高效AI图像生成平台

Stable Diffusion Forge终极指南:3步搭建高效AI图像生成平台 【免费下载链接】stable-diffusion-webui-forge 项目地址: https://gitcode.com/GitHub_Trending/st/stable-diffusion-webui-forge Stable Diffusion Forge是基于Stable Diffusion WebUI的强大增…...

AI智能体安全守护:agent-guardian的内存限制与行为监控实战

1. 项目概述与核心价值如果你正在开发或使用基于大语言模型的AI智能体,那么“失控”这个词可能已经让你头疼过不止一次了。想象一下,你部署了一个自动处理任务的AI助手,结果它因为一个无限循环的指令,或者一个意外触发的复杂任务链…...

边缘AI抓取机器人:zeptoclaw项目解析与轻量级视觉抓取实践

1. 项目概述:从“zeptoclaw”看边缘AI抓取机器人的新范式 最近在机器人开源社区里,一个名为“bkataru/zeptoclaw”的项目引起了我的注意。乍一看这个标题,可能会觉得有点陌生,但拆解一下就能发现它的野心不小。“Zepto”是国际单位…...

S32K146 ADC实战:从EB Tresos配置到数据读取,一个真实电池电压采集项目的完整流程

S32K146 ADC实战:从EB Tresos配置到数据读取,一个真实电池电压采集项目的完整流程 在嵌入式系统开发中,电池电压监测是一个基础但至关重要的功能。无论是新能源汽车的BMS系统,还是便携式设备的电源管理,精准的电压采集…...

【Hot 100 刷题计划】 LeetCode 2. 两数相加 | C++ 分支迭代法

LeetCode 2. 两数相加 📌 题目描述 题目级别:中等 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示…...

Go JSON 序列化与反序列化性能对比

Go JSON序列化与反序列化性能对比 在现代Web开发和微服务架构中,JSON作为轻量级的数据交换格式被广泛应用。Go语言以其高效的并发性能和简洁的语法,成为许多开发者的首选。在处理JSON数据时,序列化与反序列化的性能直接影响系统的响应速度和…...

扩散大语言模型在CUDA代码生成中的创新应用

1. 扩散大语言模型在代码生成领域的突破作为一名长期从事高性能计算和AI模型优化的工程师,我见证了从传统编程到AI辅助代码生成的范式转变。扩散大语言模型(dLLMs)的出现,为代码生成领域带来了全新的可能性。与常见的自回归模型&a…...

Element Plus的el-upload组件,如何优雅集成阿里云OSS分片上传与进度条?

Element Plus与阿里云OSS分片上传深度实践:打造高可靠大文件上传方案 在当今数字化办公场景中,视频素材、设计原稿等大文件上传已成为内容管理系统的标配需求。传统单次上传在面对数百MB甚至GB级文件时,往往面临网络波动中断、进度反馈缺失、…...