STM32 i2c 驱动0.42寸OLED

news2024/11/20 6:34:39

STM32 i2c 驱动0.42寸OLED,这是个项目中使用的方案,调试也是比较费劲,主要是取字模和代码的匹配,下个篇章中详解一下取字模的过程,在这个方案中的使用。

本文使用的测试代码

STM32i2c驱动0.42寸OLED,SSD1306资源-CSDN文库

有个项目需要使用一个最小的OLED进行显示,选来选去,找了一个0.42寸的超级小的OLED.这里简单记录一下实际项目中调试该OLED的过程。

该OLED的尺寸图

该OLED的行列图

该OLED的硬件接口

硬件上使用STM32F030F4Px连接该OLED

这里需要注意的是PA5/PA6使用i2c功能,需要设计上拉电阻 

原理图比较简单,就不多叙述了。

 时钟配置如下,使用内部HSI时钟,倍频到48Mhz,这里也很重要和时钟的延时有很多关系,如果延时函数配置不正确,会导致I2C时序不对,进而配置不对OLED,当然这里你也可以使用外部时钟

 使用的stm32cubemx版本,这个最好用最新的版本

 stm32cubemx中关于I2C管脚的配置,配置成为输出就可以了

 

 生成的工程使用如下设置

 OLED初始化函数

void write_i(uint8_t cmd)
{
	OLED_send_cmd(cmd);
}
void InitSSD1306()
{
	// RES=0;
	// delay(1000);
	// RES=1;
	///delay(10);
	HAL_Delay(1000);
	write_i(0xAE); /*display off*/
	write_i(0xD5); /*set osc division*/
	write_i(0xF0);
	write_i(0xA8); /*multiplex ratio*/
	write_i(0x27); /*duty = 1/40*/
	write_i(0xD3); /*set display offset*/
	write_i(0x00);
	write_i(0x40); /*Set Display Start Line */
	write_i(0x8d); /*set charge pump enable*/
	write_i(0x14);
	write_i(0x20); /*Set page address mode*/
	write_i(0x02);
	write_i(0xA1); /*set segment remap*/
	write_i(0xC8); /*Com scan direction*/
	write_i(0xDA); /*set COM pins*/
	write_i(0x12);
	write_i(0xAD); /*Internal IREF Setting*/
	write_i(0x30);
	write_i(0x81); /*contract control*/
	write_i(0x2F); /*128*/
	write_i(0xD9); /*set pre-charge period*/
	write_i(0x22);
	write_i(0xdb); /*set vcomh*/
	write_i(0x20);
	write_i(0xA4); /*Set Entire Display On/Off*/
	write_i(0xA6); /*normal / reverse*/
	write_i(0x0C); /*set lower column address*/
	write_i(0x11); /*set higher column address*/
	write_i(0xAF); /*display ON*/
}

反转屏幕函数,这个很有用,调试的时候比较方便

void OLED_reverse_All(unsigned char mode)//(1黑底白字,0白底黑字)
{
	if(mode){
		OLED_send_cmd(0xA6);//1亮0灭
	}else{
		OLED_send_cmd(0xA7);//1灭0亮
	}
}

主函数中进行闪烁灯的操作,以及刷新屏幕

	HAL_Delay(1000);
	HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_4);//LED twinkle
	OLED_full_OLED();
	HAL_Delay(1000);
	OLED_clean_OLED();
	HAL_Delay(1000);
	OLED_drawString(28, 0, "012345678901234", 8, 16);//128 = 16*8
	OLED_drawString(28, 16, "012345678901234", 8, 16);//128 = 16*8
	OLED_drawString(28, 32, "012345678901234", 8, 16);//128 = 16*8
	OLED_display();

hal库使用I2C需要对SDA管脚进行输入输出配置,这里没有直接对寄存器操作,而是使用库函数,也能满足使用需求

#define IIC_SDA_PIN GPIO_PIN_6
#define IIC_SCL_PIN GPIO_PIN_5

#define IIC_SDA_H HAL_GPIO_WritePin(IIC_SDA, IIC_SDA_PIN, GPIO_PIN_SET)
#define IIC_SDA_L HAL_GPIO_WritePin(IIC_SDA, IIC_SDA_PIN, GPIO_PIN_RESET)

#define IIC_SCL_H HAL_GPIO_WritePin(IIC_SCL, IIC_SCL_PIN, GPIO_PIN_SET)
#define IIC_SCL_L HAL_GPIO_WritePin(IIC_SCL, IIC_SCL_PIN, GPIO_PIN_RESET)


void IIC_OUT(void)//SDA是输出方向
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.Pin=IIC_SDA_PIN;
	GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStructure.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出模式
	HAL_GPIO_Init(IIC_SDA,&GPIO_InitStructure);
}
void IIC_IN(void)//SDA是输入方向
{
	GPIO_InitTypeDef GPIO_InitStructure;

	GPIO_InitStructure.Pin=IIC_SDA_PIN;
	GPIO_InitStructure.Speed=GPIO_SPEED_FREQ_HIGH;
	GPIO_InitStructure.Pull = GPIO_PULLUP;
	GPIO_InitStructure.Mode=GPIO_MODE_INPUT;  //输入上拉模式
	HAL_GPIO_Init(IIC_SDA,&GPIO_InitStructure);
}

实际测试效果图如下,

使用的测试代码如下

STM32i2c驱动0.42寸OLED,SSD1306资源-CSDN文库

其中keil的版本号如下

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

体验 ChatGLM-6B

体验 ChatGLM-6B 1. 什么是 ChatGLM-6B2. Github 地址3. 安装 Miniconda34. 创建虚拟环境5. 安装 ChatGLM-6B6. 启动 ChatGLM-6B7. 访问 ChatGLM-6B8. API部署9. 命令行部署10. 其他,修改使用显存大小 1. 什么是 ChatGLM-6B ChatGLM-6B 是一个开源的、支持中英双语…

面了一个4年经验的测试工程师,自动化都不会也要18k,我真是醉了...

在深圳这家金融公司也待了几年,被别人面试过也面试过别人,大大小小的事情也见识不少,今天又是团面的一天, 一百多个人都聚集在一起,因为公司最近在谈项目出来面试就2个人,无奈又被叫到面试房间。 整个过程…

音频焦点使用及原理

音频焦点使用及原理 本博客代码基于Android 10源码 为什么会有音频焦点这一概念? 在Android音频领域中,应用层所有的App播放音频,最终都是走到音频回播线程PlaybackThread中,如果多个App都走到同一个PlaybackThread中去&#xff0…

chat错误代码1020是什么原因导致的-解决chat错误代码1020

ChatGPT拒绝访问1020是什么原因 ChatGPT拒绝访问1020可能是因为服务器故障、网络连接问题或者人工智能模型正在进行训练或调整等原因所致。一般来说,ChatGPT会在进行维护、升级或训练时暂停服务,这可能导致用户在访问ChatGPT时遇到拒绝访问的情况。在该…

2023年淮阴工学院五年一贯制专转本财务管理基础考试大纲

2023年淮阴工学院五年一贯制专转本财务管理基础考试大纲 一、考核对象 本课程的考核对象为五年一贯制高职专转本财务管理专业入学考试普通在校生考生。 二、考核方式 本课程考核采用闭卷笔试的方式。 三、命题依据及原则 1、命题依据 本课程考核命题教材为靳磊编著&…

2023年会展服务研究报告

第一章 行业概况 会展行业是指一系列与会议、展览、展示相关的服务和经济活动的总称,是加强企业间交流、促进合作和推动经济发展的重要手段。该行业涉及广泛,包括会议和展览的组织、场地租赁和设计、活动策划和执行、展品运输和咨询服务等各个环节。随着…

每个人都可以用来提高生产力的「项目管理策略」

与以往相比,越来越多的公司为员工提供混合办公(办公室工作远程办公)和远程办公的选择,这实际是出于对效率的强需求。 尽管员工的工作时间增加了,但办公室等工作场所的工作效率正在以几十年来最快的速度下降。专家们列…

一起了解可以用手机操作显示的BOD水质检测仪

什么叫BOD(生化需氧量): BOD是指表示水中有机化合物等需氧物质含量的一个综合指标。当水中所含有机物与空气接触时,由于需氧微生物的作用而分解,使之无机化或气体化时所需消耗的氧量。 生化需氧量,以毫克/升…

震惊,为了学会泛型类竟做这种事?!

上一节,我们基本学会了Java泛型类的用法。 传送门:彻底弄懂Java的泛型 - 泛型类 这一节,我们转变一下风格,具体是什么风格呢,你马上就懂了。 宝子们,欢迎大家来到我们的泛型直播间,这一讲呢&a…

通过gulp+rollup从零到一搭建前端组件库

核心要点 通过 webpack 搭建运行环境通过 gulp 执行编译流程通过 rollup 编译组件代码编写 组件测试 组件打包 编译组件上传 npm 1、通过 webpack 搭建运行环境 这里主要是创建一个可以运行的测试的组件的环境,全局安装vue-cli脚手架,并初始化项目 v…

代码提交格式化工具---prettier的使用与配置

为什么要格式化代码 我们在合作写项目的时候,因为每个人的代码书写习惯以及编辑器的配置都不相同,这样就可能导致我们写的代码的格式都完全不一样,有的代码格式看起来也比较难以阅读,那么prettierd就由此产生了。 Prettier是一个…

题集-链表分割

链表分割_牛客题霸_牛客网 (nowcoder.com) 链表去做的话,可以分为带哨兵位和不带哨兵位两种,但是不带哨兵位会更麻烦一些,更容易出现空指针问题。 这里两种思路都是:将小于x的结点尾插到less链表中,将大于x的结点尾插到…

数据结构之队列,实现队列的增删改查

目录 一、队列的定义 二、队列的实现 1.使用链表来实现队列 2.实现队列的接口 初始化队列 void QueueInit(Queue *pq) 队尾入队列 void QueuePush(Queue *pq,QDataType data) 队头出队列 void QueuePop(Queue *pq) 获取队列头部元素 QDataType QueueFront(Queue *pq) …

uni-app获取手机号-获取用户地理位置-根据位置获取经纬度跳转高德

一.获取手机号 1.获取手机号首先要先登录拿到code,用code去获取session_key 2.获取 code需要知道自己的AppID(小程序ID)和AppSecret(小程序密钥) 3.解密后得到手机号 登录微信公众平台拿到自己的AppID(小程序ID)和AppSecret(小程序密钥) 微信公众平台 获取sessio…

【Java EE 初阶】如何保证线程安全二

目录 1.线程不安全是什么? 2.线程不安全的成因 3.解决线程不安全之一Synchronized关键字(监视器锁) 1.Synchronized使用方法 2.锁对象是什么? ​3.锁对象的练习 4.Synchronized的特性 1.互斥性 2.刷新内存 3.可重入 5.总…

事务及分布式事务解决方案

基础概念 1.1.事务 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动要么全部成功,要么全部失败。 1.2.本地事务 在计算机系统中,更多的是通过关系型数据库来控制事务,利用数据库本身的事务特性来实现&a…

SAP 从入门到放弃系列之批次追溯功能

首先执行MB57,建立批次追溯关系,并存储在CHVW表。根据情况选择要追溯的期间,在过账日期范围内填写。 不勾选‘基于清单显示’,为ALV显示结果 勾选‘基于清单显示’,为清单显示结果 执行MB56,查询批次追溯 可以设置显示…

【.NET AI Books 前言】Azure OpenAI Service 入门

本书是为 .NET 开发者而写的,让 .NET 开发者能快速掌握 Azure OpenAI Service 的使用技巧。 ChatGPT 的到来意味着我们已经置身于 AI 引起的全新变革中,作为开发者你可能将面临几种改变: GPT 模型到来后,如何去架构好企业解决方案…

Dex-Net 2.0<论文>

题目:Deep Learning to Plan Robust Grasps with Synthetic Point Clouds and Analytic Grasp 引言 传统抓取方法的局限性 缺乏泛化能力需要大量计算资源和手工标注数据【前两种依赖物体形状、材料、质量等先验知识通常要对物体建模姿态评估运动学分析】只能处理…

【C语言】深入理解注释

文章目录 一. 预处理阶段对注释的处理二. 注释使用时的注意事项1. C风格的注释无法嵌套使用2. 基本注释注意事项3. 注释导致的二义性 四. 关于注释的一个使用建议 一. 预处理阶段对注释的处理 我们知道一个源文件要变成可执行程序的话,首先要经过预处理&#xff0c…