STM32 HAL库驱动0.96寸OLED屏幕

项目概述

本项目使用STM32 HAL库为0.96寸OLED屏幕编写驱动程序。OLED屏幕通过I2C接口与STM32单片机通信,实现文本、数字和图形的显示功能。

项目仓库地址:STM32_Sensor_Drives

硬件连接

在这里插入图片描述

OLED屏幕通过I2C接口与STM32连接:

  • SCL连接到PB8
  • SDA连接到PB9

关键代码

1. I2C初始化

void MX_I2C1_Init(void)
{hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;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();}
}

2. I2C引脚配置

void HAL_I2C_MspInit(I2C_HandleTypeDef *i2cHandle)
{GPIO_InitTypeDef GPIO_InitStruct = {0};if (i2cHandle->Instance == I2C1){__HAL_RCC_GPIOB_CLK_ENABLE();/**I2C1 GPIO ConfigurationPB8     ------> I2C1_SCLPB9     ------> I2C1_SDA*/GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9;GPIO_InitStruct.Mode = GPIO_MODE_AF_OD;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);__HAL_AFIO_REMAP_I2C1_ENABLE();/* I2C1 clock enable */__HAL_RCC_I2C1_CLK_ENABLE();}
}

3. OLED基本通信函数

// 向OLED发送命令
void Write_IIC_Command(uint8_t cmd)
{HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x00, I2C_MEMADD_SIZE_8BIT, &cmd, 1, 100);
}// 向OLED发送数据
void Write_IIC_Data(uint8_t data)
{HAL_I2C_Mem_Write(&hi2c1, 0x78, 0x40, I2C_MEMADD_SIZE_8BIT, &data, 1, 100);
}

4. OLED显示控制函数

// 设置显示坐标
void OLED_Set_Pos(unsigned char x, unsigned char y)
{Write_IIC_Command(0xb0 + y);Write_IIC_Command(((x & 0xf0) >> 4) | 0x10);Write_IIC_Command((x & 0x0f));
}// 开启OLED显示
void OLED_Display_On(void)
{Write_IIC_Command(0X8D); // SET DCDC命令Write_IIC_Command(0X14); // DCDC ONWrite_IIC_Command(0XAF); // DISPLAY ON
}// 关闭OLED显示
void OLED_Display_Off(void)
{Write_IIC_Command(0X8D); // SET DCDC命令Write_IIC_Command(0X10); // DCDC OFFWrite_IIC_Command(0XAE); // DISPLAY OFF
}// 清屏函数
void OLED_Clear(void)
{uint8_t i, n;for (i = 0; i < 8; i++){Write_IIC_Command(0xb0 + i); // 设置页地址(0~7)Write_IIC_Command(0x00);     // 设置显示位置—列低地址Write_IIC_Command(0x10);     // 设置显示位置—列高地址for (n = 0; n < 128; n++)Write_IIC_Data(0);}
}// 全屏点亮
void OLED_On(void)
{uint8_t i, n;for (i = 0; i < 8; i++){Write_IIC_Command(0xb0 + i); // 设置页地址(0~7)Write_IIC_Command(0x00);     // 设置显示位置—列低地址Write_IIC_Command(0x10);     // 设置显示位置—列高地址for (n = 0; n < 128; n++)Write_IIC_Data(1);}
}

5. 字符显示函数

// 在指定位置显示一个字符
void OLED_ShowChar(uint8_t x, uint8_t y, uint8_t chr, uint8_t Char_Size)
{unsigned char c = 0, i = 0;c = chr - ' '; // 得到偏移后的值if (x > Max_Column - 1){x = 0;y = y + 2;}if (Char_Size == 16){OLED_Set_Pos(x, y);for (i = 0; i < 8; i++)Write_IIC_Data(F8X16[c * 16 + i]);OLED_Set_Pos(x, y + 1);for (i = 0; i < 8; i++)Write_IIC_Data(F8X16[c * 16 + i + 8]);}else{OLED_Set_Pos(x, y);for (i = 0; i < 6; i++)Write_IIC_Data(F6x8[c][i]);}
}// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, uint8_t *chr, uint8_t Char_Size)
{unsigned char j = 0;while (chr[j] != '\0'){OLED_ShowChar(x, y, chr[j], Char_Size);x += 8;j++;}
}// 显示数字
void OLED_ShowNum(uint8_t x, uint8_t y, uint32_t num, uint8_t len, uint8_t size2)
{uint8_t t, temp;uint8_t enshow = 0;for (t = 0; t < len; t++){temp = (num / oled_pow(10, len - t - 1)) % 10;if (enshow == 0 && t < (len - 1)){if (temp == 0){OLED_ShowChar(x + (size2 / 2) * t, y, ' ', size2);continue;}elseenshow = 1;}OLED_ShowChar(x + (size2 / 2) * t, y, temp + '0', size2);}
}// m^n函数
uint32_t oled_pow(uint8_t m, uint8_t n)
{uint32_t result = 1;while (n--)result *= m;return result;
}

6. 中文显示和图片显示

// 显示中文
void OLED_ShowCHinese(uint8_t x, uint8_t y, uint8_t no)
{uint8_t t, adder = 0;OLED_Set_Pos(x, y);for (t = 0; t < 16; t++){Write_IIC_Data(Hzk[no][t]);adder += 1;}OLED_Set_Pos(x, y + 1);for (t = 0; t < 16; t++){Write_IIC_Data(Hzk[no][t + 16]);adder += 1;}
}// 显示BMP图片
void OLED_DrawBMP(unsigned char x0, unsigned char y0, unsigned char x1, unsigned char y1, unsigned char BMP[])
{unsigned int j = 0;unsigned char x, y;if (y1 % 8 == 0)y = y1 / 8;elsey = y1 / 8 + 1;for (y = y0; y < y1; y++){OLED_Set_Pos(x0, y);for (x = x0; x < x1; x++){Write_IIC_Data(BMP[j++]);}}
}

7. OLED初始化函数

void OLED_start(void)
{Write_IIC_Command(0xAE); // 关闭显示Write_IIC_Command(0xD5); // 设置时钟分频因子,震荡频率Write_IIC_Command(0x80); // [3:0],分频因子;[7:4],震荡频率Write_IIC_Command(0xA8); // 设置驱动路数Write_IIC_Command(0x3F); // 默认0X3F(1/64)Write_IIC_Command(0xD3); // 设置显示偏移Write_IIC_Command(0x00); // 默认为0Write_IIC_Command(0x40); // 设置显示开始行 [5:0],行数.Write_IIC_Command(0x8D); // 电荷泵设置Write_IIC_Command(0x14); // bit2,开启/关闭Write_IIC_Command(0x20); // 设置内存地址模式Write_IIC_Command(0x02); // [1:0],00,列地址模式;01,行地址模式;10,页地址模式;默认10;Write_IIC_Command(0xA1); // 段重定义设置,bit0:0,0->0;1,0->127;Write_IIC_Command(0xC8); // 设置COM扫描方向;bit3:0,普通模式;1,重定义模式 COM[N-1]->COM0;N:驱动路数Write_IIC_Command(0xDA); // 设置COM硬件引脚配置Write_IIC_Command(0x12); // [5:4]配置Write_IIC_Command(0x81); // 对比度设置Write_IIC_Command(0xEF); // 1~255;默认0X7F (亮度设置,越大越亮)Write_IIC_Command(0xD9); // 设置预充电周期Write_IIC_Command(0xf1); // [3:0],PHASE 1;[7:4],PHASE 2;Write_IIC_Command(0xDB); // 设置VCOMH 电压倍率Write_IIC_Command(0x30); // [6:4] 000,0.65*vcc;001,0.77*vcc;011,0.83*vcc;Write_IIC_Command(0xA4); // 全局显示开启;bit0:1,开启;0,关闭;(白屏/黑屏)Write_IIC_Command(0xA6); // 设置显示方式;bit0:1,反相显示;0,正常显示Write_IIC_Command(0xAF); // 开启显示OLED_Clear();
}

8. 主函数中的使用示例

int main(void)
{/* 省略初始化代码 *//* 初始化外设 */MX_GPIO_Init();MX_USART2_UART_Init();MX_I2C1_Init();/* 初始化OLED */OLED_start();/* 无限循环 */printf("System will start while\n");OLED_Clear();OLED_ShowString(0, 0, (uint8_t*)"Init success", 16);OLED_ShowString(0, 2, (uint8_t*)"Init success", 12);while (1){HAL_Delay(200);}
}

字体数据

项目中包含了两种字体数据:

  1. 6x8点阵字体(F6x8):适用于小字体显示
  2. 8x16点阵字体(F8X16):适用于大字体显示
  3. 中文字库(Hzk):用于显示中文字符

注意事项

  1. OLED的I2C地址为0x78(写操作)
  2. 显示区域为128x64像素
  3. 使用前需要先调用OLED_start()初始化OLED
  4. 清屏函数OLED_Clear()可以清除屏幕上的所有内容

常用函数总结

函数名功能描述
OLED_start()初始化OLED
OLED_Clear()清屏
OLED_Display_On()开启显示
OLED_Display_Off()关闭显示
OLED_ShowChar()显示单个字符
OLED_ShowString()显示字符串
OLED_ShowNum()显示数字
OLED_ShowCHinese()显示中文
OLED_DrawBMP()显示BMP图片

参考资料

  • STM32 HAL库文档
  • 0.96寸OLED屏幕数据手册
  • 项目仓库

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92812.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92812.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92812.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

横向越权:修改参数访问不属于自己的数据

一、什么是横向越权定义 横向越权&#xff08;Horizontal Privilege Escalation&#xff09;是指 同一权限级别的用户&#xff0c;通过篡改请求参数或资源标识&#xff0c;访问本不属于自己的数据或功能。例子 假设一个在线商城&#xff0c;用户 A 访问订单详情的 URL&#xff…

攻击实验(ARP欺骗、MAC洪范、TCP SYN Flood攻击、DNS欺骗、DHCP饿死)

实验一 ARP欺骗一、拓扑二、实验准备、1.设置终端漏洞靶机集合选择需要的数量和镜像打开设备上的驱动精灵安装网卡安装成功后查看IP地址、网关信息等。三、实验步骤1.实验原理中间人&#xff08;攻击者&#xff09;在终端与网关之间持续发送伪造的 ARP 应答包&#xff0c;双向欺…

VSCode 禁用更新检查的方法

通过设置菜单禁用 这是最直接和推荐的方法&#xff0c;可以永久禁用自动更新&#xff1a; 打开 VSCode。点击左下角的齿轮图标&#xff0c;然后选择“设置”。或者通过菜单栏“文件” > “首选项” > “设置”进入。在顶部的搜索框中输入“update”。找到“Update: Mode”…

Flutter - 应用启动/路由管理

一、应用入口1. 初始化 Flutter 底层绑定 &#xff0c;运行 App。import package:flutter/material.dart; import package:flutter_base/Application.dart;void main() {// 确保绑定初始化WidgetsFlutterBinding.ensureInitialized();// App初始化Application.init(); }2. 注册…

MySQL 数据操作全流程:创建、读取、更新与删除实战

MySQL系列 文章目录MySQL系列前言一、Create(创建)并插入数据1.1 单行数据 全列插入1.2 多行数据 指定列插入1.3 插入冲突时同步更新1.4 冲突时替换二、Retireve读取数据2.1 全列查询2.2 查询指定列2.3 查询字段为表达式2.4 结果去重 DISTINCT2.5 where条件筛选2.6 order by语…

SQL约束:数据完整性的守护者

在SQL中&#xff0c;约束&#xff08;Constraints&#xff09; 是作用于数据库表字段上的规则&#xff0c;用于强制保证数据的完整性、准确性和一致性。当插入、更新或删除数据时&#xff0c;约束会自动验证操作是否符合规则&#xff0c;若违反则拒绝执行。 以下是SQL中常见的约…

Springboot-vue 地图展现

在很多社区管理系统中&#xff0c;地图展示功能是一个重要的模块&#xff0c;它能直观地呈现小区的地理位置分布。本文将详细梳理从前端触发请求到地图上展示小区数据的完整流程&#xff0c;帮助大家理解前后端协同工作的具体细节。一、前端触发&#xff1a;页面加载与地图初始…

Vue 3 登录组件

Login.vue 组件详细分析整体架构 Vue 3 登录组件&#xff0c;采用 Composition API Element Plus UI 库&#xff0c;实现了完整的用户认证界面。 模板结构分析 1. 容器布局 <div class"login-container"><el-card class"login-card"><!-- …

小结: getSpringFactoriesInstances从 `spring.factories` 文件中加载和实例化指定类型的类

getSpringFactoriesInstances 方法工作原理 getSpringFactoriesInstances 是 Spring Boot 框架中的一个核心方法&#xff0c;用于从 spring.factories 文件中加载和实例化指定类型的类。这是 Spring Boot 实现自动配置和插件化扩展的关键机制。 1. 基本功能 该方法的主要作用是…

selenium SessionNotCreatedException问题解决办法

在上周有一台服务器重启之后&#xff0c;Chrome浏览器也自动升了级&#xff0c;原本能够正常使用的自动化办公程序突然没法用了&#xff0c;出现了下面的报错提示。codes/addCancelBdld.py:980: DeprecationWarning: use options instead of chrome_optionsdriver webdriver.C…

SOAP HTTP Binding

SOAP HTTP Binding 引言 SOAP(Simple Object Access Protocol)是一种轻量级、简单的协议,用于在网络上交换结构化信息。它广泛应用于Web服务中,用于实现不同系统和应用程序之间的通信。SOAP HTTP Binding是SOAP协议的一种实现方式,它允许使用HTTP协议来传输SOAP消息。本…

GPT-5免费使用教程(国内可访问)

GPT-5来了&#xff0c;压力给到各大AI模型厂商&#xff1f; 北京时间2025年8月7日&#xff0c;OpenAI 推出两款开源模型 gpt-oss-120b / 20b&#xff0c;性能逼近 o4-mini/o3-mini&#xff0c;一时间火爆AI圈&#xff1b;但这好像只是一道开胃小菜&#xff0c;在北京时间2025年…

内存作假常见方案可行性分析

内存作假通常修改所涉及到的几个文件&#xff1a;M sys/frameworks/base/core/java/android/app/ActivityManager.javaM sys/frameworks/base/core/jni/android_os_Debug.cppM sys/frameworks/base/core/jni/android_util_Process.cppM sys/frameworks/base/services/core/java…

C#(vs2015)利用unity实现弯管机仿真

以下是基于 Visual Studio 2015 和 Unity 实现弯管机仿真的完整技术流程&#xff0c;结合工业仿真开发的最佳实践整理而成&#xff0c;涵盖建模、通信、运动控制和交互逻辑等核心模块&#xff1a;---一、环境配置与基础框架搭建 1. Unity 与 VS2015 联动 - 安装 [Visual Studio…

华为USG防火墙双机,但ISP只给了1个IP, 怎么办?

华为USG防火墙双机&#xff0c;但ISP只给了1个IP&#xff0c; 怎么办&#xff1f; 华为USG双机使用VRRP&#xff0c;需要3个Ip 本次联通只给了 100.1.1.0/30 这一个互联段 联通侧用了100.1.1.1&#xff0c; 我们这一侧只有100.1.1.2 怎么办&#xff1f; 找联通多要几个Ip&…

Go 工具链环境变量实战:从“command not found”到工具全局可用的全流程复盘

在 Go 生态里&#xff0c;丰富的命令行工具极大提升了开发效率。但很多小伙伴第一次用 go install 安装第三方工具后&#xff0c;却遇到终端里找不到命令的尴尬——明明装好了&#xff0c;终端却报 “command not found”。这是为什么呢&#xff1f;本文结合我亲身踩过的坑&…

MCU 软件断点注意事项!!!

——为什么调试器会在运行中改我的Flash程序&#xff1f;调试单片机时&#xff0c;很多人都有这样的疑问&#xff1a;明明我在调试前刷进去的固件是好的&#xff0c;为什么加了一个断点之后&#xff0c;调试器居然去改了 Flash&#xff1f; 如果我拔掉调试器&#xff0c;这个固…

腾讯iOA:数据安全的港湾

声明&#xff1a;文章为本人真实测评&#xff0c;非广告&#xff0c;无推广&#xff0c;为用户体验文章 前言 当前网络安全威胁日益复杂化&#xff0c;恶意软件攻击手段不断升级。例如&#xff1a;钓鱼邮件携带的伪装安装包可能引发勒索病毒在内网扩散&#xff0c;导致业务中断…

相册管理系统介绍

之前在github和gitee上了找了好久也没找到符合自己需求的相册管理系统&#xff0c;最近就静下心来自己写了一套。系统分为前台相册系统与后台管理系统。 技术框架采用的是前端vueelementui&#xff0c;后端springbootmybatisplus。 下面是项目截图&#xff1a;项目功能介绍&…

企业级高性能WEB服务器Nginx

nginx安装 1.nginx编译安装 #在nginx官网获取安装包 [rootwebserver mnt]# wget https://nginx.org/download/nginx-1.24.0.tar.gz#解压安装包 [rootwebserver mnt]# tar zxf nginx-1.24.0.tar.gz [rootwebserver mnt]# cd nginx-1.24.0/#安装编译nginx需要的环境软件 [rootw…