0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC


博主平时DIY经常使用OLED,其中以4脚的I2C屏最多,就想着总结一下子,让广大DIY朋友更容易找到资源。

驱动采用的时SSD1306

        同学们拿到代码后,可以直接用,其中博主给的代码默认引脚都是SDA接板子PB11SCL接板子PB10,下载完代码接上之后重启会直接亮屏。

U8g2驱动OLDE

        STM32-U8g2驱动OLED屏幕。

U8g2驱动OLED

U8g2硬件I2C驱动

由于硬件IIC口只有两组(STM32F103C8T6)所以选择IO口有限,各位同学选择的时候注意。

init.h中需要修改:IO口宏定义

#define IIC_OLED_SDA_Pin        	GPIO_Pin_11
#define IIC_OLED_SDA_GPIO       	GPIOB#define IIC_OLED_SCL_Pin        	GPIO_Pin_10
#define IIC_OLED_SCL_GPIO       	GPIOB

和**init.c中需要修改**:IO口初始化

	/*STM32F103C8T6芯片的硬件I2C: PB6 -- SCL; PB7 -- SDA */GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出GPIO_Init(GPIOB, &GPIO_InitStructure);

博主选择的时I2C2,同学如果想用I2C1的话还需要修改。

init.c中需要修改:I2C初始化还有所有使用中的I2C都要改为你所用的I2C

void I2C_Configuration(void)
{I2C_InitTypeDef  I2C_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);I2C_DeInit(I2C2);//使用I2C1I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x30;//主机的I2C地址,随便写的I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 1000000;//1MI2C_Cmd(I2C2, ENABLE);I2C_Init(I2C2, &I2C_InitStructure);
}uint8_t u8x8_byte_hw_i2c(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) {uint8_t* data = (uint8_t*) arg_ptr;switch(msg) {case U8X8_MSG_BYTE_SEND:while( arg_int-- > 0 ) {I2C_SendData(I2C2, *data++);while (!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_BYTE_TRANSMITTED)) continue;}break;case U8X8_MSG_BYTE_INIT:/* add your custom code to init i2c subsystem */I2C_Configuration();break;case U8X8_MSG_BYTE_SET_DC:/* ignored for i2c */break;case U8X8_MSG_BYTE_START_TRANSFER:while(I2C_GetFlagStatus(I2C2, I2C_FLAG_BUSY));I2C_GenerateSTART(I2C2, ENABLE);while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_MODE_SELECT))continue;I2C_Send7bitAddress(I2C2, 0x78, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2C2, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED))continue;break;case U8X8_MSG_BYTE_END_TRANSFER:I2C_GenerateSTOP(I2C2, ENABLE);break;default:return 0;}return 1;
}

即可使用。

U8g2软件I2C驱动

软件I2C只需要修改为你所使用的引脚即可。别忘了还有初始化中的IO引脚初始化。

#define IIC_OLED_SDA_Pin        	GPIO_Pin_11
#define IIC_OLED_SDA_GPIO       	GPIOB#define IIC_OLED_SCL_Pin        	GPIO_Pin_10
#define IIC_OLED_SCL_GPIO       	GPIOB

普通库驱动OLDE

        STM32-普通库驱动OLED屏幕。

普通库硬件I2C驱动

oled.c中需要修改:其实和U8g2库需要改动的地方一样,都是IO口初始化和I2C初始化。如果使用I2C2就不需要改了。

	/*STM32F103C8T6芯片的硬件I2C: PB10 -- SCL; PB11 -- SDA */GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;//I2C必须开漏输出GPIO_Init(GPIOB, &GPIO_InitStructure);

普通库软件I2C驱动

oled.h中需要修改:IO口宏定义

#define OLED_SCL_PORT GPIOB
#define OLED_SCL_PIN GPIO_Pin_10
#define OLED_SCLK_Clr() GPIO_ResetBits(OLED_SCL_PORT,OLED_SCL_PIN)//SCL
#define OLED_SCLK_Set() GPIO_SetBits(OLED_SCL_PORT,OLED_SCL_PIN)#define OLED_SDA_PORT GPIOB
#define OLED_SDA_PIN GPIO_Pin_11
#define OLED_SDIN_Clr() GPIO_ResetBits(OLED_SDA_PORT,OLED_SDA_PIN)//SDA
#define OLED_SDIN_Set() GPIO_SetBits(OLED_SDA_PORT,OLED_SDA_PIN)

即可使用

插入汉字

按照博主以下步骤即可加入汉字显示。

我们以上文中普通库硬件I2C驱动OLED为例子。

  1. 打开取模软件PCtoLCD2002软件。
  2. 点击设置,按照如图所示方式进行设置,并点击确认。
    在这里插入图片描述
  3. 输入取模文字,并点击生成字模。
    在这里插入图片描述
  4. 将生成的字模复制到oledfont.hunsigned char F16x16[] 数组中,并将unsigned char character[]字符串的相应位置添加你增加的中文字符。
  5. 调用OLED_Show(0,0,"你好");即可显示,其中的0,0代表xy坐标的位置。到此我们就显示了汉字了。

插入简单图片

按照博主以下步骤即可加入图片显示。

我们以上文中普通库软件I2C驱动OLED为例子。

  1. 搞到一张你想显示的图片;一张.BMP结尾的照片。如果不是可以在线转换。图片格式转换链接:https://www.gaitubao.com/jpg-gif-png。
  2. 使用系统画图工具打开打开。
  3. 主页图像栏重新调整大小点机像素,取消勾选保持纵横比,调整合适的水平和垂直像素(0.96的OLED屏分辨为128*64)保存图片。
  4. 打开取模软件,点击设置,调为图中的参数。 返回主界面点击模式->选择图形模式。
    在这里插入图片描述
  5. 复制到bmp.h文件的unsigned char BMP1[] 数组中即可。
  6. 调用函数OLED_DrawBMP(0,0,128,8,BMP1);。其中0,0代表起点xy轴坐标,128,8代表结束xy轴坐标。

复杂图形取模显示

  1. 将图片转为128*64分辨率的bmp格式。
  2. 使用Image2Lcd v2.9打开图像,调整亮度,得到希望得到的显示率。
    在这里插入图片描述
  3. 输出为bmp格式。
  4. 然后调用插入简单图片方式导入程序。

显示小图片

  1. 调整合适大小在PCtolcd形成字模。
  2. 放到代码数组中。
  3. 计算好图片分辨率和显示分辨率。例如:图片30*30 则代码中显示应为OLED_DrawBMP(50,0,80,6,BMP2); x1-x0为30 y1-y0小于图片的话图片显示不全但是不会乱码。

显示gif

  1. gifsplitter2.0.exe将gif分离成帧。
  2. 之后跟显示图片一样。

OLED显示GIF


源码地址:https://download.csdn.net/download/weixin_42320020/88759113
拒绝转载!

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

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

相关文章

Windows 常用快捷键

文章目录 前言Win R:打开运行窗口Win D:显示桌面。Win E:打开资源管理器。Ctrl Shift Esc:打开任务管理器。Alt Tab:切换当前打开的窗口。F2:重命名选定的文件或文件夹。Ctrl W:关闭当前…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

【GitHub项目推荐--AI杀入斗地主领域】【转载】

AlphaGo:第一个战胜围棋世界冠军的人工智能机器人。 我不会玩围棋,没办法和 AlphaGO 对局。但是我喜欢玩斗地主,有斗地主人工智能机器人吗? 有,而且还开源了。DouZero:快手团队开发的斗地主AI。别的不说&…

文件共享服务(一)——DAS、NAS、SAN存储类型

一、存储类型 存储类型主要有三种 1. DAS直连式存储 通常由数据线直连电脑就可以用,比如一块新硬盘,只需要利用磁盘模拟器分区,创建文件系统,挂载就可以使用了。 PC中的硬盘或只有一个外部SCSI接口的JBOD存储设备(即…

编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture

前言 在软件开发中,选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架:MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC(Model-V…

1. JDBC 连库操作的基本流程

根据Mysql JDBC基本操作,我们大概可以总结出JDBC的API。 Driver :jdbc驱动DriverManager:驱动注册类,创建Connection连接Connection:物理连接Statement、PreparedStatement:sql语句ResultSet:结…

【前端学习笔记1】css基础

css可以使页面更漂亮,即美化网页 css:层叠样式表 标签选择器: 类选择器: id只能单次调用,类似人的身份证 css里只要是word里面有的功能,他们都有对应的,不会的时候查一下就行 实现垂直居中:h…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…

Spring Boot应用程序如何配置 HTTPS 访问方式

在 Spring Boot 应用程序中配置 HTTPS 访问方式可以根据你是否拥有由受信任的证书颁发机构(CA)签发的证书来分为两种情况:使用自签名证书和使用 CA 签发的证书。下面我将分别介绍这两种情况的配置方法: 使用自签名证书 如果你还…

力扣每日一练(24-1-18)

经验一:不要把问题想复杂 Python: min_price float(inf)max_profit 0for price in prices:min_price min(min_price, price)max_profit max(max_profit, price - min_price)return max_profit C#: public int MaxProfit(int[] prices) {i…

强化学习(二)多臂老虎机 “Multi-armed Bandits”——1

将强化学习与机器学习、深度学习区分开的最重要的特征为:它通过训练中信息来评估所采取的动作,而不是给出正确的动作进行指导,这极大地促进了寻找更优动作的需求。 1、多臂老虎机(Multi-armed Bandits)问题 赌场的老虎…

WPF入门到跪下 第十一章 Prism(一)数据处理

官网:https://primslibrary.com 源码地址:https://guthub.com/PrismLibrary/prism Prism是由微软发布、维护的开源框架,提供了一组设计模式的实现,有助于编写结构良好的且可维护的XAML应用程序,包括MVVM、依赖注入、命…

关于数字孪生技术在医院的应用场景和未来趋势

数字孪生技术是一种新兴的技术,它可以将现实世界中的物体或系统建立为虚拟模型,通过模拟和分析,为现实世界中的物体或系统提供支持和优化。数字孪生技术在医疗领域的应用被称为数字孪生智慧医院技术。数字孪生智慧医院技术是指将数字孪生技术…

git format用法学习

git format-patch -1 <commit-id> -o <保存路径> 是一个用于生成单个提交的补丁文件的 Git 命令。下面是对该命令及其参数的解释&#xff1a; git format-patch: 这是一个用于生成补丁文件的 Git 命令。-1: 这是一个选项&#xff0c;表示只生成指定提交&#xff0…

vivado 调试设计

调试设计 概述 FPGA设计的调试是一个多步骤的迭代过程。就像大多数复杂的问题一样最好将FPGA设计调试过程分解为更小的部分&#xff0c;例如&#xff0c;通过专注于使设计工作的一小部分发挥作用&#xff0c;而不是试图使整体发挥作用一次完成设计工作。经过验证的设计和调试…

实验三 Oracle数据库的创建和管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

HackTheBox - Medium - Linux - Health

Health Health 是一台中型 Linux 计算机&#xff0c;在主网页上存在 SSRF 漏洞&#xff0c;可利用该漏洞访问仅在 localhost 上可用的服务。更具体地说&#xff0c;Gogs 实例只能通过 localhost 访问&#xff0c;并且此特定版本容易受到 SQL 注入攻击。由于攻击者可以与 Gogs …

Redis基础知识(一)

一 Redis的数据类型 1.1 基本数据类型&#xff1a; String(字符串) Hash(哈希表) List(列表) Set(集合) ZSet(有序集合) 1.2 特殊类型 GEO(地理空间) HyperLogLog(基数统计) bitMap(位图) bitField(位域…

架构的演进

1.1单体架构 单体架构也称之为单体系统或者是单体应用。就是一种把系统中所有的功能、模块耦合在一个应用中的架构方式。 存在的问题&#xff1a; 代码耦合&#xff1a;模块的边界模糊、依赖关系不清晰&#xff0c;整个项目非常复杂&#xff0c;每次修改代码都心惊胆战迭代困…

数据结构之二叉搜索树

二叉搜索树 满足条件&#xff1a; 1.对于根节点&#xff1a;左子树中所有节点的值小于右子树中所有节点的值 2.任意节点的左右子树也是二叉搜索树&#xff0c;同样满足条件1 二叉搜索树的常用操作 我们将二叉搜索树封装为一个类 BinarySearchTree &#xff0c;并声明一个成员变…