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

news2024/9/24 18:23:08

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);//使用I2C1
	I2C_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;//1M

	I2C_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.coloradmin.cn/o/1397235.html

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

相关文章

MySQL面试总结

MySQL优化 1.MySQL如何定位慢查询 1.1开源工具 1.2MySQL自带慢日志 1.3解答 2.EXPLAIN 2.1解答 3.什么是索引 4.B树 4.1数据结构对比 5.聚簇索引(聚集索引) 6.覆盖索引 7.索引创建原则 8.什么情况下索引失效 9.你对sql优化经验 10.事务 11.MVCC 11.主从…

bgp--大AS分小AS

最后效果:r1能ping通r8,r4路由表有r1-r8环回,r4bgp路由表已优化 代码; [r1] ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 12.1.1.1 0.0.0.0 bgp 64512 router-id 1.1.1.1 confederation id …

Qt/QML编程之路:OpenGL的示例(39)

Qt编程之后,会发现有版本问题,有时候一个示例不同的版本下可能会跑不同,有些Qt5跑不同Qt6已经完善,可以跑通。 我就看到有个关于OpenGL的示例: 这个示例是演示怎么基于OpenGL编程的,但是调试时却发现glViewXXX等gl打头的函数说找不到reference,或者什么link不上之类的错…

nvm-nodejs版本控制工具(window操作系统)

一、概述 可以在电脑上同时安装多个nodejs版本,随意切换使用; 二、下载和安装mvn 参考:window操作系统安装多个版本的nodejs——nodejs版本控制工具nvm_windows node多版本共存-CSDN博客 1. 下载 官网地址:https://github.com…

java数组在多线程中安全问题,HashMap是不安全的,Hashtable安全(但每次都加锁,效率低),ConcurrentHashMap完美

package com.controller;import com.myThread.AdminThread; import com.myThread.MyCallable; import com.myThread.MyRunnable; import org.springframework.web.bind.annotation.*;import java.util.concurrent.*; //上面引入*,所以这个可以注销 //import java.ut…

Java中锁的分类

乐观锁、悲观锁 乐观锁:不加锁的并发操作是安全的 可重入锁 RerntrantLock 当一个线程进入到一个同步方法中,然后在此方法中要调用另一个同步方法, 而且两个方法公用同一把锁 此时线程是可以进入到另一个同步方法中的。 读写锁 Reent…

LabVIEW继电保护测试仪自动检测系统

系统是LabVIEW软件平台和STM32F407系列微控制器的融合,提供了一种高效的解决方案,用于继电保护测试仪的自动化控制和数据采集。系统中使用了福禄克8508A型高精度数字多用表和泰克TDS2024型示波器等设备,以确保测试数据的准确性和可靠性。软件…

macOS安装VMware Fusion 13试用版本

1.下载: Download VMware Fusion | VMware 保存到桌面 下载成功: 双击dmg文件运行安装 安装成功 <

JVM篇--垃圾回收高频面试题

JVM垃圾回收 1 简单说下Java垃圾回收机制&#xff1f; 首先在java运行过程中&#xff0c;其实程序员并不需要去显示的调用程序来释放对象的内存&#xff0c;而是由虚拟机来完成的&#xff0c;具体来看是在jvm中有个垃圾回收线程&#xff0c;这个线程是个守护线程&#xff0c;…

LeeCode 42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1]…

HarmonyOS NEXT 既是大势所趋,也是“众望所归”,2024你如何选择?

鸿蒙开发最近两个月估计是程序员圈的焦点话题。自从业内人事传出2024鸿蒙HarmonyOS Next版不在兼容安卓后,紧接着余承东高调宣布’’2024年将是原生鸿蒙的关键一年’’,再加上各大厂陆续宣布拥抱鸿蒙生态&#xff0c;使的相关话题就没停过。 01、鸿蒙系统到底是个啥 俺简单来…

HarmonyOS【应用服务开发】在模块中添加Ability

Ability是应用/服务所具备的能力的抽象&#xff0c;一个Module可以包含一个或多个Ability。应用/服务先后提供了两种应用模型&#xff1a; FA&#xff08;Feature Ability&#xff09;模型&#xff1a; API 7开始支持的模型&#xff0c;已经不再主推。Stage模型&#xff1a;AP…

C 语言->编译和链接实现原理

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 今天学习&#xff1a;浅学编译和链接内部实现原理 前提&#xff1a;本文是在gcc编译环…

使用 Picocli 开发 Java 命令行,5 分钟上手

大家好&#xff0c;我是鱼皮&#xff0c;对不会前端的同学来说&#xff0c;开发 命令行工具 是一种不错的展示系统功能的方式。在 Java 中开发命令行工具也很简单&#xff0c;使用框架&#xff0c;几分钟就能学会啦~ Picocli 入门 Picocli 是 Java 中个人认为功能最完善、最简单…

网工内推 | 网络工程师,CCNP认证优先,带薪年假,补贴多

01 极三科技 招聘岗位&#xff1a;网络工程师 职责描述&#xff1a; 1、门店网络运维 2、门店网络项目支持 3、配合店铺Support team处理网络相关问题 任职要求&#xff1a; 1、大专及以上相关学历 2、3年以上相关工作经验 3、精通Cisco 路由器&#xff0c;交换机配置 4…

2.4G收发芯片遥控玩具方案开发,解决方案

2.4G遥控玩具是指通过2.4GHz无线信号进行遥控的玩具。这种玩具通常包括遥控器和遥控车、挖机、飞机、船等各种类型的模型。使用2.4G频段的遥控器可以提供更稳定和可靠的信号传输&#xff0c;具有较长的控制距离和较低的干扰。相比之前使用的其他频段的遥控器&#xff0c;2.4G遥…

前台vue配置

前台 vue环境 1.傻瓜式安装node: 官网下载&#xff1a;https://nodejs.org/zh-cn/2.安装cnpm: >: npm install -g cnpm --registryhttps://registry.npm.taobao.org3.安装vue最新脚手架: >: cnpm install -g vue/cli注&#xff1a;如果2、3步报错&#xff0c;清除缓…

第11章 GUI Page500~504 步骤三十二:打开画板文件02

各个图元类新增GetTypeName_Static()&#xff0c;并将原来的GetTypeName()改为调用静态方法实现&#xff1a; 直线&#xff1a; 圆&#xff1a; 十字&#xff1a; 矩形&#xff1a; 文字&#xff1a; tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加&#xff1a; 增加…

2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…