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

STM32F103软件模拟IIC驱动0.96寸OLED:从零搭建与界面交互优化

1. 硬件准备与接线指南拿到STM32F103核心板和0.96寸OLED模块时我第一反应是翻看引脚定义。这块4针OLED通常采用IIC接口接线其实特别简单只需要4根线VCC、GND、SCL、SDA。但要注意供电电压我刚开始用5V供电结果屏幕发烫后来才发现这类OLED多数是3.3V供电的。具体接线时建议用杜邦线按这个方案连接OLED_VCC → 开发板3.3VOLED_GND → 开发板GNDOLED_SCL → 任意GPIO如PB6OLED_SDA → 任意GPIO如PB7这里有个坑要注意软件模拟IIC不限制引脚但硬件IIC有固定引脚。我推荐用PB6/PB7这样以后切到硬件IIC也方便。接线完成后建议用万用表测下通断有次我就因为杜邦线接触不良折腾了半天。2. 软件模拟IIC协议实现2.1 IIC时序模拟关键点模拟IIC最核心的就是时序控制这里我总结出三个关键时间参数起始信号SCL高电平时SDA从高到低跳变停止信号SCL高电平时SDA从低到高跳变数据有效性SCL上升沿采样数据用GPIO模拟的代码框架如下// 定义GPIO操作宏 #define OLED_SCL_H() GPIO_SetBits(GPIOB, GPIO_Pin_6) #define OLED_SCL_L() GPIO_ResetBits(GPIOB, GPIO_Pin_6) #define OLED_SDA_H() GPIO_SetBits(GPIOB, GPIO_Pin_7) #define OLED_SDA_L() GPIO_ResetBits(GPIOB, GPIO_Pin_7) void IIC_Start() { OLED_SDA_H(); OLED_SCL_H(); delay_us(5); OLED_SDA_L(); delay_us(5); OLED_SCL_L(); }2.2 典型问题排查调试时我用逻辑分析仪抓波形发现两个常见问题时序过快STM32F103主频72MHz直接操作GPIO太快需要加delay_us(5)延时应答异常从设备无响应时建议在IIC_Wait_Ack()里加超时判断我设置的300ms超时3. OLED驱动库开发3.1 显示基础功能封装构建驱动库时我采用分层设计底层IIC读写函数Write_IIC_Command/Data中间层基本绘图画点、线、清屏应用层字符、汉字、图片显示显示字符的函数实现很有讲究void OLED_ShowChar(u8 x, u8 y, u8 chr, u8 size) { u8 c chr - ; // ASCII码偏移 if(size 16) { OLED_Set_Pos(x, y); for(u8 i0; i8; i) OLED_WR_Byte(F8X16[c*16i], OLED_DATA); OLED_Set_Pos(x, y1); for(u8 i0; i8; i) OLED_WR_Byte(F8X16[c*16i8], OLED_DATA); } else { /* 8x6字体处理 */ } }3.2 汉字显示方案显示汉字需要字库支持我试过三种方案直接烧录字库到Flash占用空间大外挂SPI Flash存储字库成本高只提取需要的汉字推荐第三种方案最实用用PCtoLCD2005工具生成特定汉字的点阵数据const u8 Hzk[][16] { {0x00,0x40,0x42,0xCC,0x00,0x00,0x00,0xFC,0x04,0x04,0xFC,0x00,0x00,0x00,0x00,0x00}, //中,0 {0x10,0x10,0xD0,0x3F,0x10,0x10,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} //文,1 };4. 界面交互优化实战4.1 多页面管理系统实现按键翻页时我设计了一个状态机模型typedef enum { PAGE_HOME, PAGE_SETTING, PAGE_INFO } PageType; PageType currentPage PAGE_HOME; void Page_Switch(PageType newPage) { OLED_Clear(); switch(newPage) { case PAGE_HOME: OLED_ShowString(0, 0, Main Menu, 16); break; case PAGE_SETTING: OLED_ShowString(0, 0, Settings, 16); break; } currentPage newPage; }4.2 按键消抖处理按键检测我用的是状态机方式比简单延时更可靠#define KEY_DEBOUNCE_TIME 20 u8 KEY_Scan(u8 mode) { static u8 key_up 1; static u16 debounce_cnt 0; if(mode) key_up 1; if(key_up (KEY00 || KEY10 || WK_UP1)) { debounce_cnt; if(debounce_cnt KEY_DEBOUNCE_TIME) { key_up 0; debounce_cnt 0; if(WK_UP1) return WKUP_PRES; else if(KEY00) return KEY0_PRES; else return KEY1_PRES; } } else if(KEY01 KEY11 WK_UP0) { key_up 1; debounce_cnt 0; } return 0; }5. 性能优化技巧5.1 局部刷新机制全屏刷新会导致闪烁我实现了区域刷新函数void OLED_Refresh_Area(u8 x1, u8 y1, u8 x2, u8 y2) { for(u8 yy1; yy2; y) { OLED_Set_Pos(x1, y); for(u8 xx1; xx2; x) { OLED_WR_Byte(framebuffer[y][x], OLED_DATA); } } }5.2 帧缓冲设计建立显存数组能大幅提升性能u8 framebuffer[8][128]; // 对应OLED的8页x128列 void OLED_Update() { for(u8 p0; p8; p) { OLED_Set_Pos(0, p); for(u8 c0; c128; c) { OLED_WR_Byte(framebuffer[p][c], OLED_DATA); } } }6. 项目进阶方向6.1 动画效果实现通过定时器中断实现流畅动画void TIM3_IRQHandler(void) { if(TIM_GetITStatus(TIM3, TIM_IT_Update) ! RESET) { static u8 pos 0; OLED_DrawBMP(pos, 0, 32, 4, anim_frames[frame_index]); pos (pos 1) % 96; TIM_ClearITPendingBit(TIM3, TIM_IT_Update); } }6.2 菜单系统优化采用结构体数组定义菜单项更灵活typedef struct { u8 text[16]; void (*action)(void); } MenuItem; MenuItem mainMenu[] { {System Info, ShowSystemInfo}, {Settings, EnterSettings}, {Calibration, RunCalibration} };

相关文章:

STM32F103软件模拟IIC驱动0.96寸OLED:从零搭建与界面交互优化

1. 硬件准备与接线指南 拿到STM32F103核心板和0.96寸OLED模块时,我第一反应是翻看引脚定义。这块4针OLED通常采用IIC接口,接线其实特别简单,只需要4根线:VCC、GND、SCL、SDA。但要注意供电电压,我刚开始用5V供电结果屏…...

深入解析XXD2212电调:从PWM信号到三相驱动的实战指南

1. XXD2212电调初探:你的无刷电机控制中枢 第一次拿到XXD2212电调时,我差点把它当成了普通的舵机控制器——它们的外形实在太像了。这块巴掌大的电路板实际上是一个精密的能量转换中枢,负责将微控制器的PWM信号转化为三相无刷电机能理解的语言…...

Origin9.1绘图避坑指南:从数据导入到论文级.tif图保存的完整流程

Origin9.1科研绘图全流程避坑指南:从数据导入到论文级.tif输出 科研绘图是论文写作中不可或缺的一环,而Origin9.1作为经典的数据可视化工具,在学术界有着广泛的应用。然而,从原始数据到最终符合期刊要求的图表,这一过程…...

tf_unet 实战应用:从玩具问题到射电天文干扰检测的完整案例

tf_unet 实战应用:从玩具问题到射电天文干扰检测的完整案例 【免费下载链接】tf_unet Generic U-Net Tensorflow implementation for image segmentation 项目地址: https://gitcode.com/gh_mirrors/tf/tf_unet Tensorflow U-Net 是一个通用的图像分割深度学…...

HBase集群部署避坑指南:从NoNode for /hbase/master错误到稳定启动

1. 遇到NoNode错误时别慌,先看懂它在说什么 第一次看到"HBase报错ERROR: KeeperErrorCode NoNode for /hbase/master"这个错误时,我正端着咖啡准备庆祝集群启动成功。结果这行红字直接给我泼了盆冷水——相信很多新手朋友都有类似的经历。这个…...

下一代Web字体性能革命:Inter字体3大智能优化策略突破渲染瓶颈

下一代Web字体性能革命:Inter字体3大智能优化策略突破渲染瓶颈 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter 在数字体验时代,字体性能已成为前端性能优化的关键战场。Inter字体作为现代无衬…...

SteamAutoCrack:3步自动化破解Steam游戏的终极指南

SteamAutoCrack:3步自动化破解Steam游戏的终极指南 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack 你是否厌倦了每次想玩Steam游戏都要联网验证?是否希望合法购…...

保姆级教程:用Docker Compose在Linux服务器上部署Transmission,并搞定IPv6加速

深度指南:基于Docker Compose的Transmission部署与IPv6优化实战 在当今数字资源获取日益便捷的时代,一个稳定高效的下载工具对于技术爱好者和资源收集者来说至关重要。Transmission作为一款轻量级、高性能的BitTorrent客户端,凭借其简洁的界面…...

目标检测 - 从FPN到PAN:双向路径聚合如何提升特征融合效率

1. 目标检测中的特征金字塔:从FPN到PAN的进化之路 在目标检测任务中,处理多尺度目标一直是个棘手的问题。想象一下,你要在一张图片中同时识别出近处的行人、远处的车辆和更远处的交通标志,这些目标的尺寸差异可能达到数十倍。传统…...

CAJ转PDF终极指南:3步告别知网格式限制,实现跨平台学术自由

CAJ转PDF终极指南:3步告别知网格式限制,实现跨平台学术自由 【免费下载链接】caj2pdf Convert CAJ (China Academic Journals) files to PDF. 转换中国知网 CAJ 格式文献为 PDF。佛系转换,成功与否,皆是玄学。 项目地址: https:…...

如何为Lightnovel-crawler添加新源:ChatGPT辅助开发实战

如何为Lightnovel-crawler添加新源:ChatGPT辅助开发实战 【免费下载链接】lightnovel-crawler Generate and download e-books from online sources. 项目地址: https://gitcode.com/gh_mirrors/li/lightnovel-crawler Lightnovel-crawler是一款强大的轻小说…...

如何让Windows 11界面更顺手:ExplorerPatcher完整配置指南

如何让Windows 11界面更顺手:ExplorerPatcher完整配置指南 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 还在为Windows 11的新界…...

从入门到精通:泉盛UV-K5/K6开源固件的无线通信革命

从入门到精通:泉盛UV-K5/K6开源固件的无线通信革命 【免费下载链接】uv-k5-firmware-custom 全功能泉盛UV-K5/K6固件 Quansheng UV-K5/K6 Firmware 项目地址: https://gitcode.com/gh_mirrors/uvk5f/uv-k5-firmware-custom 想象一下,你手中的百元…...

Neoscroll.nvim调试技巧:解决滚动异常的常见问题指南

Neoscroll.nvim调试技巧:解决滚动异常的常见问题指南 【免费下载链接】neoscroll.nvim Smooth scrolling neovim plugin written in lua 项目地址: https://gitcode.com/gh_mirrors/ne/neoscroll.nvim 作为一款优秀的平滑滚动插件,Neoscroll.nvim…...

当点云遇上核技巧:一文搞懂K-PCA为何能处理非线性数据(附Sklearn对比实验)

当点云遇上核技巧:一文搞懂K-PCA为何能处理非线性数据(附Sklearn对比实验) 想象你手中握着一团缠绕的毛线——在三维空间里它呈现出复杂的螺旋结构。如果强行用平面镜去照射这个物体,得到的投影永远是一团混乱的线条。这正是线性P…...

120MHz Cortex-M3+150DMIPS+ART加速器:STM32F205RBT6的性能参数解析

STM32F205RBT6:120MHz Cortex-M3工业互联MCU的技术解析在工业控制、电机驱动以及物联网网关等嵌入式应用中,微控制器往往需要同时兼顾高算力、实时响应与丰富的工业通信接口。STM32F205RBT6是意法半导体基于ARM Cortex-M3内核的高性能系列产品&#xff0…...

Visual C++运行库全家桶:一站式解决Windows软件兼容性问题的终极方案

Visual C运行库全家桶:一站式解决Windows软件兼容性问题的终极方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 还在为"应用程序无法启动&qu…...

工业网关、电机控制、人机界面:ATSAME70Q21B-AN的应用版图

ATSAME70Q21B-AN:300MHz Cortex-M7工业MCU的嵌入式应用解析在工业控制、人机界面和物联网网关等领域,微控制器需要在处理性能、外设集成度和环境适应性之间取得平衡。ATSAME70Q21B-AN是Microchip推出的基于ARM Cortex-M7内核的高性能32位微控制器&#x…...

别再死记硬背了!用Pointer Network搞定NLP里的OOV难题(附代码实战)

Pointer Network实战:如何优雅解决NLP中的OOV难题 在电商客服机器人开发中,你是否遇到过这样的尴尬场景:当用户询问"冰墩墩什么时候补货"时,机器人却回复"该商品暂无库存"——它完全没理解"冰墩墩"…...

智慧工厂与养殖场的一体化光伏监控系统方案

某企业从事乳制品的生产、销售等全流程业务,新增一套分布式光伏发电系统以平衡能耗支出,主要覆盖乳制品生产加工厂、奶牛养殖场及生态观光牧场等场景,实现“自给自足、余电上网”等综合能源目标。现需要对光伏电站进行联网集中监控&#xff0…...

5分钟搞定!iperf3 Windows版:专业网络性能测试工具完全指南

5分钟搞定!iperf3 Windows版:专业网络性能测试工具完全指南 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 你是否曾经怀疑过…...

CAN总线终端电阻:从120Ω与0.25W的选型,看信号完整性与系统鲁棒性设计

1. 为什么CAN总线需要终端电阻? 第一次接触CAN总线设计时,我也曾疑惑:为什么要在总线两端各加一个120Ω的电阻?直接连线不行吗?直到亲眼目睹不加电阻时总线上的信号振荡,才真正理解终端电阻的重要性。 CAN总…...

CANN/ops-nn RMS归一化动态量化算子

AddRmsNormDynamicQuantV2 【免费下载链接】ops-nn 本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-nn 产品支持情况 产品是否支持Ascend 950PR/Ascend 950DTAtlas A3 训练系列产品/Atlas A3 推…...

手把手教你用STM32F103C8T6(正点原子mini板)驱动SHT31温湿度传感器(附完整工程)

从零玩转STM32F103C8T6与SHT31温湿度传感器实战指南 当你第一次拿到正点原子Mini开发板和SHT31传感器时,是否曾被密密麻麻的引脚和陌生的术语吓退?别担心,这篇文章将用最接地气的方式,带你完成从硬件连接到数据采集的全过程。不同…...

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_Trendin…...

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响)

别再瞎猜了!手把手教你算清FPGA Aurora IP核的用户时钟(附8B/10B编码影响) 当你在Xilinx Vivado中配置Aurora 8B/10B IP核时,是否曾被USER_CLK的计算问题困扰?这个看似简单的参数背后,其实隐藏着线速率、数…...

图神经网络终于能“上生产”了?SITS 2026发布首个支持实时增量训练的AI原生图引擎(附Benchmark对比:吞吐提升6.8×,延迟压至12ms)

更多请点击: https://intelliparadigm.com 第一章:AI原生图计算应用:SITS 2026图神经网络工程化方案 SITS 2026 是面向大规模动态图场景的AI原生图计算框架,深度融合GNN训练、图拓扑实时更新与边缘-云协同推理能力。其核心设计摒…...

储能出海架构重构:摒弃传统x86工控机,基于ARM边缘节点的EMS策略下沉实战

摘要: 随着储能系统在全球范围的大规模部署,出海项目的硬件BOM成本压力与恶劣环境下的维护成本日益凸显。传统的“x86工控机下发控制 透传网关上传数据”的双体架构显得极度臃肿且易引发单点故障。本文从底层研发架构师视角出发,深度拆解符合…...

《QGIS空间数据处理与高级制图》004:内置地理处理工具箱

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化 在航天任务规划中,轨道设计往往是项目初期最耗时的环节之一。传统方法需要工程师反复调整参数、运行仿真、分析结果,整个过程可能持续数小时甚至数天。而ST…...