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

STM32新手必看:如何用I2C驱动128x64 OLED屏幕(附完整代码)

STM32新手必看如何用I2C驱动128x64 OLED屏幕附完整代码在嵌入式开发中OLED屏幕因其高对比度、低功耗和快速响应等优势成为许多项目的首选显示方案。对于STM32初学者来说掌握I2C接口驱动OLED屏幕是一项非常实用的技能。本文将带你从零开始一步步实现128x64分辨率OLED屏幕的驱动并提供可直接使用的代码库和字模生成方法。1. OLED屏幕与I2C协议基础OLEDOrganic Light-Emitting Diode是一种自发光显示技术每个像素点都能独立发光不需要背光。常见的128x64分辨率OLED屏幕通常使用CH1116或SSD1306等驱动芯片通过I2C或SPI接口与微控制器通信。I2C协议关键特性两线制SCL时钟线SDA数据线主从架构支持多设备标准模式100kHz和快速模式400kHz7位设备地址CH1116通常为0x3C或0x3D提示实际设备地址可能因厂商不同而有所变化建议查阅具体屏幕的数据手册确认。2. 硬件连接与工程配置2.1 硬件连接典型的I2C OLED屏幕连接方式如下OLED引脚STM32引脚说明VCC3.3V电源正极GNDGND电源负极SCLPB6I2C时钟线SCLSDAPB7I2C数据线SDA2.2 STM32CubeMX配置打开STM32CubeMX选择你的STM32型号在Pinout Configuration选项卡中启用I2C1外设配置PB6为I2C1_SCLPB7为I2C1_SDA在I2C参数设置中模式I2C速度Fast Mode (400kHz)时钟配置如果使用外部晶振将HCLK设置为最大频率如72MHz生成代码前勾选Generate peripheral initialization as a pair of .c/.h files// 示例I2C初始化代码由STM32CubeMX生成 hi2c1.Instance I2C1; hi2c1.Init.ClockSpeed 400000; hi2c1.Init.DutyCycle I2C_DUTYCYCLE_2; hi2c1.Init.OwnAddress1 0; hi2c1.Init.AddressingMode I2C_ADDRESSINGMODE_7BIT; hi2c1.Init.DualAddressMode I2C_DUALADDRESS_DISABLE; hi2c1.Init.OwnAddress2 0; hi2c1.Init.GeneralCallMode I2C_GENERALCALL_DISABLE; hi2c1.Init.NoStretchMode I2C_NOSTRETCH_DISABLE; if (HAL_I2C_Init(hi2c1) ! HAL_OK) { Error_Handler(); }3. OLED驱动实现3.1 基本驱动函数OLED驱动主要包含初始化、命令发送和数据发送三个基本操作// 发送命令到OLED void OLED_WriteCommand(uint8_t cmd) { uint8_t buf[2] {0x00, cmd}; // 0x00表示命令 HAL_I2C_Master_Transmit(hi2c1, OLED_ADDRESS, buf, 2, HAL_MAX_DELAY); } // 发送数据到OLED void OLED_WriteData(uint8_t data) { uint8_t buf[2] {0x40, data}; // 0x40表示数据 HAL_I2C_Master_Transmit(hi2c1, OLED_ADDRESS, buf, 2, HAL_MAX_DELAY); } // OLED初始化序列 void OLED_Init(void) { HAL_Delay(100); // 等待OLED上电稳定 OLED_WriteCommand(0xAE); // 关闭显示 OLED_WriteCommand(0xD5); // 设置显示时钟分频比/振荡器频率 OLED_WriteCommand(0x80); OLED_WriteCommand(0xA8); // 设置多路复用率 OLED_WriteCommand(0x3F); // 更多初始化命令... OLED_WriteCommand(0xAF); // 开启显示 }3.2 屏幕刷新机制CH1116驱动芯片将屏幕分为8页Page每页包含8行像素。数据写入时采用列地址自动递增模式可以显著提高刷新效率。显示更新流程设置页地址0xB0~0xB7设置列地址低4位0x00~0x0F高4位0x10~0x1F连续写入数据列地址会自动递增void OLED_UpdateScreen(void) { for(uint8_t page 0; page 8; page) { OLED_WriteCommand(0xB0 page); // 设置页地址 OLED_WriteCommand(0x00); // 设置列地址低4位 OLED_WriteCommand(0x10); // 设置列地址高4位 for(uint8_t col 0; col 128; col) { OLED_WriteData(OLED_Buffer[page][col]); } } }4. 高级功能实现4.1 字符显示实现要在OLED上显示字符需要预先准备好字模数据。常见的ASCII字符可以使用8x16点阵字模。// 8x16 ASCII字模示例部分 const uint8_t Font8x16[][16] { {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // 空格 {0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00}, // ! // 更多字符... }; // 显示一个字符 void OLED_ShowChar(uint8_t x, uint8_t y, char chr) { uint8_t page y / 8; uint8_t c chr - ; for(uint8_t i 0; i 8; i) { OLED_SetCursor(x i, page); OLED_WriteData(Font8x16[c][i]); OLED_SetCursor(x i, page 1); OLED_WriteData(Font8x16[c][i 8]); } } // 显示字符串 void OLED_ShowString(uint8_t x, uint8_t y, char *str) { while(*str) { OLED_ShowChar(x, y, *str); x 8; if(x 120) { x 0; y 16; } } }4.2 图形显示与自定义字模对于自定义图形或汉字显示可以使用在线字模工具生成数据访问字模生成网站如led.baud-dance.com设置合适的点阵大小如16x16生成字模数据并复制到代码中// 自定义16x16图形示例 const uint8_t CustomImage[] { 0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0, 0x07,0xE0,0x0F,0xF0,0x1F,0xF8,0x3F,0xFC, 0x3F,0xFC,0x1F,0xF8,0x0F,0xF0,0x07,0xE0, 0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00 }; // 显示自定义图形 void OLED_ShowImage(uint8_t x, uint8_t y, const uint8_t *img, uint8_t width, uint8_t height) { uint8_t page_start y / 8; uint8_t page_end (y height - 1) / 8; for(uint8_t page page_start; page page_end; page) { OLED_SetCursor(x, page); for(uint8_t col 0; col width; col) { uint8_t data 0; for(uint8_t bit 0; bit 8; bit) { if((page * 8 bit) y (page * 8 bit) (y height)) { uint16_t index ((page * 8 bit - y) * width col) / 8; uint8_t shift ((page * 8 bit - y) * width col) % 8; if(img[index] (1 (7 - shift))) { data | (1 bit); } } } OLED_WriteData(data); } } }5. 常见问题与优化技巧5.1 常见问题排查问题1屏幕无显示检查电源连接3.3V确认I2C地址是否正确尝试0x3C和0x3D检查I2C线路上拉电阻通常4.7kΩ问题2显示内容错乱确保初始化序列完整检查屏幕刷新频率是否过高验证I2C时钟配置不应超过400kHz问题3显示闪烁增加屏幕刷新间隔检查电源稳定性优化显示缓冲区更新策略5.2 性能优化技巧双缓冲技术维护两个显示缓冲区后台更新一个缓冲区完成后快速切换uint8_t OLED_Buffer[2][8][128]; // 双缓冲区 uint8_t current_buffer 0; void OLED_SwitchBuffer(void) { current_buffer 1 - current_buffer; OLED_UpdateScreen(current_buffer); }局部刷新只更新屏幕上变化的部分减少数据传输量DMA传输使用DMA进行I2C数据传输释放CPU资源void OLED_UpdateScreen_DMA(void) { for(uint8_t page 0; page 8; page) { OLED_WriteCommand(0xB0 page); OLED_WriteCommand(0x00); OLED_WriteCommand(0x10); uint8_t buf[129]; buf[0] 0x40; // 数据命令 memcpy(buf[1], OLED_Buffer[page], 128); HAL_I2C_Master_Transmit_DMA(hi2c1, OLED_ADDRESS, buf, 129); HAL_Delay(1); // 小延迟防止DMA冲突 } }6. 完整项目示例以下是一个完整的OLED驱动项目结构/OLED_Project /Core /Inc oled.h font.h /Src oled.c font.c /Drivers /MDK-ARMoled.h主要内容#ifndef __OLED_H #define __OLED_H #include stm32f1xx_hal.h #define OLED_ADDRESS 0x3C // I2C设备地址 #define OLED_WIDTH 128 // 屏幕宽度 #define OLED_HEIGHT 64 // 屏幕高度 void OLED_Init(void); void OLED_Clear(void); void OLED_ShowChar(uint8_t x, uint8_t y, char chr); void OLED_ShowString(uint8_t x, uint8_t y, char *str); void OLED_ShowImage(uint8_t x, uint8_t y, const uint8_t *img, uint8_t width, uint8_t height); void OLED_UpdateScreen(void); #endiffont.h主要内容#ifndef __FONT_H #define __FONT_H extern const uint8_t Font8x16[][16]; extern const uint8_t CustomImage[]; #endif在实际项目中可以将OLED显示与传感器数据结合例如显示温湿度数据void Show_SensorData(float temp, float humi) { char buffer[16]; OLED_Clear(); OLED_ShowString(0, 0, Temperature:); sprintf(buffer, %.1f C, temp); OLED_ShowString(0, 2, buffer); OLED_ShowString(0, 4, Humidity:); sprintf(buffer, %.1f %%, humi); OLED_ShowString(0, 6, buffer); OLED_UpdateScreen(); }

相关文章:

STM32新手必看:如何用I2C驱动128x64 OLED屏幕(附完整代码)

STM32新手必看:如何用I2C驱动128x64 OLED屏幕(附完整代码) 在嵌入式开发中,OLED屏幕因其高对比度、低功耗和快速响应等优势,成为许多项目的首选显示方案。对于STM32初学者来说,掌握I2C接口驱动OLED屏幕是一…...

打造Matlab人脸考勤系统(GUI):深度学习的奇妙之旅

matlab人脸考勤系统(GUI),深度学习方法 源码详细注释 提供详细三千字帮助说明文档 GUI里的人脸识别算法:CNN,人脸检测方法VJ算法,可实现静态图像/实时图像的识别在当今数字化时代,考勤系统不断升级,基于深度学习的人脸…...

HunyuanVideo-Foley开源大模型部署:24G显存专用调度策略深度解读

HunyuanVideo-Foley开源大模型部署:24G显存专用调度策略深度解读 1. 镜像概述与核心价值 HunyuanVideo-Foley 是一款集视频生成与音效生成于一体的多模态大模型,本镜像专为RTX 4090D 24GB显存环境深度优化。相比通用部署方案,本镜像通过以下…...

Verge:轻量级视口检测与DOM操作工具库全解析

Verge:轻量级视口检测与DOM操作工具库全解析 【免费下载链接】verge get viewport dimensions...detect elements in the viewport...trust in 项目地址: https://gitcode.com/gh_mirrors/ver/verge 在现代前端开发中,视口检测与DOM操作是构建响…...

1Drake:面向机器人开发的模型设计与验证框架

1Drake:面向机器人开发的模型设计与验证框架 【免费下载链接】drake Model-based design and verification for robotics. 项目地址: https://gitcode.com/gh_mirrors/dr/drake 核心价值解析 理解Drake的核心定位 Drake是一个开源的机器人仿真与控制框架&a…...

CY7C68013芯片开发指南:用CyAPI库快速实现USB设备枚举(附VS2022工程模板)

CY7C68013芯片开发实战:从CyAPI环境搭建到设备枚举全流程解析 在物联网设备开发领域,USB通信始终扮演着关键角色。CY7C68013作为Cypress经典的EZ-USB FX2系列芯片,凭借其稳定的性能和灵活的配置选项,依然是众多硬件开发者的首选。…...

AlphaGenome:如何用AI揭示DNA序列的隐藏功能

AlphaGenome:如何用AI揭示DNA序列的隐藏功能 【免费下载链接】alphagenome-all-folds 项目地址: https://ai.gitcode.com/hf_mirrors/google/alphagenome-all-folds 导语 DeepMind推出的AlphaGenome模型通过统一的AI框架实现了对DNA序列功能的多模态预测&a…...

9MW 双馈风力发电机(DFIG)Simulink 模型设计与控制策略探索

9MW双馈风力发电机simulink设计模型(DFIG)控制策略,包括风机模型,网侧和机侧控制,给定风速变化(可自行变风速),背靠背变流器直流侧电压为1150v,电流电压等波形良好&#…...

Cadence Allegro新手必看:5个让你事半功倍的隐藏操作技巧(含快捷键)

Cadence Allegro新手必看:5个让你事半功倍的隐藏操作技巧(含快捷键) 刚接触Cadence Allegro的工程师们,是否经常被繁琐的操作流程困扰?在高速PCB设计领域,掌握几个关键技巧往往能让效率翻倍。不同于官方手册…...

为什么选择Nuitka?Python编译加速的终极解决方案 [特殊字符]

为什么选择Nuitka?Python编译加速的终极解决方案 🚀 【免费下载链接】Nuitka Nuitka is a Python compiler written in Python. Its fully compatible with Python 2.6, 2.7, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 3.10, and 3.11. You feed it your Python ap…...

Qwen3.5-4B模型与GitHub结合:自动化代码审查与文档生成工作流

Qwen3.5-4B模型与GitHub结合:自动化代码审查与文档生成工作流 1. 引言:当AI大模型遇上DevOps 最近在跟几个技术团队交流时,发现一个普遍痛点:代码审查和文档维护占用了大量开发时间。一位资深架构师告诉我:"我们…...

音乐格式转换全攻略:QMCDecode破解QQ音乐加密文件处理难题

音乐格式转换全攻略:QMCDecode破解QQ音乐加密文件处理难题 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac,qmc0,qmc3转mp3, mflac,mflac0等转flac),仅支持macOS,可自动识别到QQ音乐下载目录,默…...

3大技术突破!AntV Infographic引擎如何重构数据可视化流程

3大技术突破!AntV Infographic引擎如何重构数据可视化流程 【免费下载链接】Infographic 🦋 An Infographic Generation and Rendering Framework, bring words to life with AI! 项目地址: https://gitcode.com/gh_mirrors/info/Infographic 副标…...

LightSeq多精度推理性能深度对比:fp16与int8在不同硬件平台上的终极表现

LightSeq多精度推理性能深度对比:fp16与int8在不同硬件平台上的终极表现 【免费下载链接】lightseq LightSeq: A High Performance Library for Sequence Processing and Generation 项目地址: https://gitcode.com/gh_mirrors/lig/lightseq LightSeq作为字节…...

Java 面试必看的 1000 道面试解析,助你通过大厂面试

前言: 本文收集整理了各大厂常见面试题 N 道,你想要的这里都有内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、Linux 等技术栈,希望大家都能找到…...

清华大学提出统一多模态模型新突破:让AI同时学会“看“和“画“

这项由清华大学、西安交通大学和中科院大学联合开展的研究发表于2026年的arXiv预印本(论文编号:arXiv:2603.12793v1),研究团队开发了一个名为CHEERS的全新AI模型,能够同时具备图像理解和图像生成两种截然不同的能力。对…...

5分钟部署数字人:lite-avatar形象库快速集成教程

5分钟部署数字人:lite-avatar形象库快速集成教程 1. 引言:为什么选择lite-avatar形象库? 数字人项目开发中最耗时的环节之一就是形象创建和训练。传统方式需要收集数据、训练模型、调试参数,整个过程可能需要数周时间。而lite-a…...

LWNN:面向8位单片机的零堆内存轻量神经网络C++库

1. 项目概述LightweightNeuralNetwork(LWNN)是一个专为资源极度受限嵌入式平台设计的轻量级全连接神经网络C库。其核心设计哲学是“零动态内存分配”——所有权重、偏置、中间激活值均在编译期通过模板元编程确定尺寸,并静态分配于栈空间或全…...

Python实战:5步搞定MFCC语音特征提取(附完整代码)

Python实战:5步搞定MFCC语音特征提取(附完整代码) 语音识别技术正以前所未有的速度渗透到智能家居、车载系统和虚拟助手等场景中。作为这项技术的核心,梅尔频率倒谱系数(MFCC)因其对人耳听觉特性的高度模拟…...

SEO_新手必看的SEO优化入门教程与核心方法(381 )

SEO优化入门:新手必看的核心方法 在互联网时代,网站的流量和曝光度直接关系到一个企业的成功与否。而搜索引擎优化(SEO)作为提高网站排名的关键技术之一,成为了每个网站运营者必须掌握的技能。本文将为新手提供一份详细…...

GitHub热键库@github/hotkey:5分钟快速上手网页键盘快捷键开发终极指南

GitHub热键库github/hotkey:5分钟快速上手网页键盘快捷键开发终极指南 【免费下载链接】hotkey Trigger an action on an element with a keyboard shortcut. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey 想要为你的网页应用添加强大的键盘快捷键功…...

FreeSWITCH视频通话常见问题排查:编解码错误与媒体协商失败解决方案

FreeSWITCH视频通话故障排查手册:从编解码协商到媒体流修复 1. 视频通话架构与常见故障点全景 FreeSWITCH作为企业级通信平台的核心枢纽,其视频通话功能建立在SIP信令与RTP/RTCP媒体流的协同工作基础上。典型的视频通话故障通常出现在三个关键层面&#…...

Public Sans字体深度测评:开源无衬线字体的技术特性与场景适配分析

Public Sans字体深度测评:开源无衬线字体的技术特性与场景适配分析 【免费下载链接】public-sans A strong, neutral, principles-driven, open source typeface for text or display 项目地址: https://gitcode.com/gh_mirrors/pu/public-sans 在数字设计领…...

AI元人文:岐金兰再次致敬黄玉顺教授

岐金兰说:黄玉顺教授一定是在说,我已经指出了,不必多说。不过,岐金兰为了智能时代的多元叙事性权衡,必须多说一句,指出伦理中间件,之后呢,不必多说了。---一、生活儒学的洞见与沉默黄…...

各个主体的自感,让德里达的踪迹与延异说,成就了各个主体的“内在-外部”世界统一而多元,成就了时间性与空间的辩证统一。

岐金兰说: 各个主体的自感,让德里达的踪迹与延异说,成就了各个主体的“内在-外部”世界统一而多元,成就了时间性与空间的辩证统一。 --- 一、自感作为界面:从踪迹到“内在-外部”世界的统一 德里达的踪迹说揭示了一个深…...

postgresql(15)使用yum安装后环境变量信息

postgresql(15)使用yum安装后,其默认家目录,其环境变量信息如下 1.家目录 -bash-4.2$ whoami postgres -bash-4.2$ cd -bash-4.2$ pwd /var/lib/pgsql -bash-4.2$ 2.环境变量信息 -bash-4.2$ ls -la total 44 drwx------ 3 postgres postgres 95 Dec 18 10:49 . drwx…...

OBS录屏进阶技巧:精准捕获目标窗口与自定义画质优化

1. 为什么需要精准捕获窗口? 很多朋友刚开始用OBS录屏时,经常会遇到这样的困扰:明明只想录制某个软件窗口,结果把整个桌面都录进去了。这不仅会让视频显得杂乱,还会占用更多存储空间。比如你想录制VS Code的编程过程&a…...

拜尔模板(Bayer Pattern)在数字图像处理中的核心作用与优化策略

1. 拜尔模板的前世今生:从胶片时代到数字革命 我第一次拆解数码相机传感器时,发现那些排列整齐的彩色小点就像精心设计的马赛克艺术品。这就是拜尔模板的魔力——用最经济的方案解决色彩捕捉的世纪难题。1976年柯达科学家Bryce Bayer提出这个方案时&…...

3个技巧教你用抖音批量下载工具实现抖音资源高效管理

3个技巧教你用抖音批量下载工具实现抖音资源高效管理 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 还在为抖音视频逐一下载烦恼?面对喜欢的创作者主页,想要收藏全部作品却要手动点击…...

TileLang:让GPU编程像Python一样简单的高性能计算新范式

TileLang:让GPU编程像Python一样简单的高性能计算新范式 【免费下载链接】tilelang Domain-specific language designed to streamline the development of high-performance GPU/CPU/Accelerators kernels 项目地址: https://gitcode.com/GitHub_Trending/ti/ti…...