stm32的IIC驱动0.96OLED

news2024/11/24 3:14:58

IIC原理介绍:
在这里插入图片描述
IIC是一个总线的结构但不支持总线协议
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

OLED介绍:

一、0.96寸OLED屏幕介绍

本文采用的是4针的0.96寸OLED显示进行讲解,采用的是SPI协议,速度会比采用I2C协议的更快,但这两者的显示驱动都一样,本质上没有太大差别。屏幕整体分辨率为128*64,有黄蓝、白、蓝三种颜色可选,驱动芯片为SSD1306

二、SSD1306驱动芯片

1)图像显示RAM(GDDRAM)

GDDRAM是位映射静态RAM,大小为 128x64 位。GDDRAM分为8页(PAGE0~PAGE7),每页内1个SEG对应1Byte数据,一页由 128 Byte 组成。即屏幕每8行像素点(8PIXEL)记为一页(PAGE),64行即为8页,则屏幕变为128列(ROW)8页(PAGE),若要显示整个屏幕,则需要1288个1字节数。

在这里插入图片描述

2)最为常见的GDDRAM寻址模式——页模式

页寻址模式下,寻址只在一页(PAGEn)内进行,地址指针不会跳到其他页。每次向GDDRAM写入1byte显示数据后,列指针会自动+1。当128列都寻址完之后,列指针会重新指向SEG0而页指针仍然保持不变。通过页寻址模式我们可以方便地对一个小区域内数据进行修改。

在这里插入图片描述

一个数据字节写入GDDRAM时,当前列(SEG)同一页(PAGE)的所有行(COM)图像数据都被填充(即由列地址指针指向的整列(8位)被填充)。数据位D0写入顶行,数据位D7写入底行(由上到下,由低到高)。

在这里插入图片描述

所以通常用u8 GRAM[128][8] 的数组来存放像素点的显示数据,128代表列,也就是x,8代表页也即y
屏幕左上角为x=0,y=0处;

3)SSD1306常见驱动命令
主要分为:

基础指令
地址指令 (控制写入显存位置)
硬件指令 (控制PAGE与COM的映射关系,列col与SEG的映射,PAGE和列col指的是显存的方位,COM和SEG指的是显示屏幕的y,x方向上的驱动器)

时序指令 (设置参数控制屏幕刷新率)
滚动指令 (控制显示的字符滚动)

具体指令详见如下链接:
SSD1306 OLED驱动芯片 详细介绍(使用I2C)

4)OLED初始化代码

//基础指令
	OLED_WR_Byte(0xAE,OLED_CMD);//--turn off oled panel
	OLED_WR_Byte(0x81,OLED_CMD);//--set contrast control register
	OLED_WR_Byte(0xA6,OLED_CMD);//--set normal display
	
	//地址命令	
	OLED_WR_Byte(0x20,OLED_CMD);//-Set Page Addressing Mode (0x00/0x01/0x02)
	OLED_WR_Byte(0x02,OLED_CMD);//设置为页模式
	
	OLED_WR_Byte(0x00,OLED_CMD);//---set low column address
	OLED_WR_Byte(0x10,OLED_CMD);//---set high column address
	
	
	//硬件命令
	OLED_WR_Byte(0x40,OLED_CMD);//--set start line address  Set Mapping RAM Display Start Line (0x00~0x3F)
	
	OLED_WR_Byte(0xCF,OLED_CMD);// Set SEG Output Current Brightness
	OLED_WR_Byte(0xA1,OLED_CMD);//--Set SEG/Column Mapping     0xa0左右反置 0xa1正常
	OLED_WR_Byte(0xC8,OLED_CMD);//Set COM/Row Scan Direction   0xc0上下反置 0xc8正常	
	OLED_WR_Byte(0xA8,OLED_CMD);//--set multiplex ratio(1 to 64)
	OLED_WR_Byte(0x3f,OLED_CMD);//--1/64 duty
	
	OLED_WR_Byte(0xD3,OLED_CMD);//-set display offset	Shift Mapping RAM Counter (0x00~0x3F)
	OLED_WR_Byte(0x00,OLED_CMD);//-not offset
	
	OLED_WR_Byte(0xDA,OLED_CMD);//--set com pins hardware configuration
	OLED_WR_Byte(0x12,OLED_CMD);
	
	//时序指令
	OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
	OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec
	
	OLED_WR_Byte(0xD9,OLED_CMD);//--set pre-charge period
	OLED_WR_Byte(0xF1,OLED_CMD);//Set Pre-Charge as 15 Clocks & Discharge as 1 Clock
	
	
	OLED_WR_Byte(0xDB,OLED_CMD);//--set vcomh
	OLED_WR_Byte(0x40,OLED_CMD);//Set VCOM Deselect Level
	
	OLED_WR_Byte(0x8D,OLED_CMD);//--set Charge Pump enable/disable
	OLED_WR_Byte(0x14,OLED_CMD);//--set(0x10) disable
	
	//基础指令
	OLED_WR_Byte(0xA4,OLED_CMD);// Disable Entire Display On (0xa4/0xa5)
	OLED_WR_Byte(0xA6,OLED_CMD);// Disable Inverse Display On (0xa6/a7) 
	OLED_Clear();
	OLED_WR_Byte(0xAF,OLED_CMD);

三、取字模软件介绍

详细参考如下链接:

0.96寸OLED(SSD1306)屏幕显示(一)——基础功能介绍

四、OLED细节之显示帧频

详细参考:
SSD1306(OLED驱动芯片介绍)
在这里插入图片描述
该模块是一种片上低功耗RC振荡器电路。可以生成操作时钟(CLK)

从内部振荡器或外部源CL引脚。该选择由CLS引脚完成。如果CLS引脚

拉高,选择内部振荡器,CL应保持打开。将CLS引脚拉低禁用

内部振荡器和外部时钟必须连接到CL引脚才能正常工作。当内部

选择振荡器,其输出频率Fosc可通过命令D5h A[7:4]改变。

显示定时发生器的显示时钟(DCLK)来自CLK。除法因子“D”

可通过命令D5h从1编程到16
DCLK = F OSC / D
显示的帧频由以下公式确定。
在这里插入图片描述

•D代表时钟分频比。通过命令D5h A[3:0]设置。分割比的范围是1到16

•K是每行显示时钟的数量。该值由
K=相位1周期+相位2周期+BANK0脉冲宽度=2+2+50=54通电复位
(有关“阶段”的详细信息,请参阅第8.6节“段驱动程序/通用驱动程序”)

•多路复用比率的数量由命令A8h设置。上电复位值为63(即64MUX)。
•F OSC是振荡器频率。可通过命令D5h A[7:4]进行更改。寄存器越高
设置会导致更高的频率。

DCLK与Ffrm 不同,Ffrm比DCLK多除了个K和MUX(64)

FR同步
FR同步信号可以用来防止撕裂效应。
在这里插入图片描述
OLED的写入速度取决于MCU开始写入图像的速度。如果MCU可以
在一帧周期内完成一帧图像的写入,属于快速写入MCU。满足MCU需求
完成的写入时间较长(超过一个帧但在两个帧内),这是一个缓慢的写入。
对于快速写入MCU:MCU应在FR脉冲上升沿后开始写入新的ram数据帧
应在下一个FR脉冲上升沿之前完成。
对于慢写MCU:MCU应该在第一个FR的下降沿之后开始写入新的帧ram数据
必须在第3个FR脉冲上升沿之前完成。

分析上述OLED初始化代码:

OLED_WR_Byte(0xd5,OLED_CMD);//--set display clock divide ratio/oscillator frequency
OLED_WR_Byte(0x80,OLED_CMD);//--set divide ratio, Set Clock as 100 Frames/Sec

帧频为100,显示一帧时间要0.01s
快速写入的话,IIC传输128x64位数据的时间<0.01s,则IIC的SCL的周期要小于1.22us
一般IIC的SCL的低脉冲时间是高脉冲时间的两倍,用delay()函数一般都是us,这样看用delay函数来控制周期不可行,必定会导致动态画面撕裂。

而一般stm32的机器周期为1/72MHz,四个机器周期为一个指令周期的话,那么下面这个函数的时间大概就是0.0139x16 = 0.22us(更精确的可以执行程序打断点看)
这样一个IIC的SCL的周期大概就是0.66us
IIC的传输速率大概就是1515kb/s
还在IIC协议最大传输速度内

void IIC_delay(void)
{
	u8 t=3;
	while(t--);
}

五、制作滚动显示

STM32 OLED显示汉字及屏幕滚动(I2C协议)

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

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

相关文章

AIGC功能在线制作思维导图?

ProcessOn思维导图软件是一款功能强大的在线制作思维导图的工具&#xff0c;它提供了丰富的模板和图标&#xff0c;可以帮助用户快速制作出高质量的思维导图。其中&#xff0c;AIGC(人工智能图形识别)功能是 ProcessOn软件中的一大特色&#xff0c;它可以帮助用户更加高效地制…

permiere的字幕自动转录功能

permiere2022.3后就能够离线字幕转录了&#xff0c;这个是个很好的消息&#xff08;但也要温馨的提示大家&#xff0c;这个功能对于非标注发音或者环境嘈杂的环境下的语音识别很不友好&#xff0c;当然&#xff0c;如果你想利用它来识别歌词&#xff0c;那就乘早死了这条心&…

chatgpt赋能Python-pythonslam

Pythonslam&#xff1a;实现SLAM技术的Python库 在机器人领域&#xff0c;SLAM&#xff08;Simultaneous Localization and Mapping&#xff09;技术是非常重要的。SLAM技术使得机器人能够在未知环境中构建地图并同时确定自己的位置。然而&#xff0c;SLAM算法往往需要强大的计…

Godot引擎 4.0 文档 - 第一个 2D 游戏

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Your first 2D game — Godot Engine (stable) documentation in English 第一个 2D 游戏 在这个循序渐进的教程系列中&#xff0c;您将使用 Godot 创建您的第一个完…

上交清华搞事情!发起最全学科大模型中文知识及推理评测!GPT-4 竟然血洗所有国产模型

夕小瑶科技说 原创 作者 | 小戏&#xff0c;Python 从 OpenAI 的 ChatGPT、Meta 的 LLaMA、Anthropic 的 Claude 到复旦的 Moss、清华的 ChatGlm、MiniMax 的 Glow&#xff0c;国内的国外的大模型百花齐放层出不穷。那么&#xff0c;抛出一个相信大家都会关心的问题&#xff…

网狐大联盟服务端源码分析之服务核心-ServiceCore

工程属性分析: 1.工程属性->动态链接库 2.dll类型->MFC共享DLL 3.字符集->Unicode 4.库导出类型->使用模块定义文件def 5.生成的导出模块函数与对应的地址定义lib文件 源码分析: 头文件分析: 头文件与对应含义表示如下:

开关电源PCB排版基本规则

开关电源PCB排版是开发电源产品中的一个重要过程。许多情况下&#xff0c;一个在纸上设计得非常完美的电源可能在初次调试时无法正常工作&#xff0c;原因是该电源的PCB排版存在着许多问题。 为了适应电子产品飞快的更新换代节奏&#xff0c;产品设计工程师更倾向于选择在市场…

Linux安装部署Redis6.2.5图文教程

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库&#xff0c;并提供多种语言的 API。最近学习需要用到Redis&#xff0c;所以就去Linux服务器上部署一个&#xff0c;做下记录&#xff0c;方便…

PostgreSQL中的行锁

行锁在PG中比较特殊&#xff0c;在9.4以前&#xff0c;只有两种类型的行锁&#xff0c; FOR UPDATE 和FOR SHARE&#xff0c;因为只有两种锁&#xff0c;粒度比较大&#xff0c;极大的影响了并发性。所以从9.4开始引入了FOR KEY SHARE和FOR NO KEY UPDATE这两种行锁。目前这四种…

防火墙——SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包

防火墙—SNAT和DNAT策略的原理及应用、防火墙规则的备份、还原和抓包 一、SNAT策略概述1、SNAT应用环境2、SNAT原理3、SNAT转换的前提条件 二、SNAT策略的应用1、临时打开2、永久打开3、SNAT转换1&#xff1a;固定的公网IP地址4、SNAT转换2&#xff1a;非固定的公网IP地址&…

一文搞懂,PO设计模式详解

PO模式&#xff1a; 全称&#xff1a;page objece&#xff0c;分层机制&#xff0c;让不同层去做不同类型的事情&#xff0c;让代码结构清晰&#xff0c;增加复⽤性。 PO模式的优势&#xff1a; 1&#xff09;效率⾼ &#xff1a;同理&#xff0c;PO模式的逻辑层⽅法有具体定…

Flink第六章:多流操作

系列文章目录 Flink第一章:环境搭建 Flink第二章:基本操作. Flink第三章:基本操作(二) Flink第四章:水位线和窗口 Flink第五章:处理函数 Flink第六章:多流操作 文章目录 系列文章目录前言一、分流1.侧输出流(process function) 二、合流1. 联合&#xff08;Union&#xff09;2…

CVE-2018-2894WebLogic未授权任意文件上传

CVE-2018-2894WebLogic未授权任意文件上传 这个洞的限制就比较多了 限制版本 Oracle WebLogic Server版本 10.3.6.0 12.1.3.0 12.2.1.2 12.2.1.3 限制配置 该漏洞的影响模块为web服务测试页&#xff0c;在默认情况下不启用。 /ws_utc/config.do /ws_utc/begin.do 默认情况下不…

在职字节6年,一个29岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在字节跳动的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&a…

Linux防火墙----firewalld

文章目录 一、firewalld概述二、firewalld 与 iptables 的区别三、firewalld 区域的概念四、firewalld数据处理流程五、firewalld防火墙的配置方法5.1 使用firewall-config 图形工具5.2 编写/etc/firewalld/中的配置文件5.3使用firewall-cmd 命令行工具 一、firewalld概述 fir…

AI:帮助你更好地发声!

正文共 978 字&#xff0c;阅读大约需要 3 分钟 公务员必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 快速生成倡议书 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lex…

当你知道前后端分离与不分离的6个特点,你就不该再当点工了

Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 前后端不分离 在早期&#xff0c;Web 应用开发主要采用前后端不分离的方式&#xff0c;它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端不…

linux存储技术学习资料

参考 https://www.cnblogs.com/pengdonglin137/p/16525428.html Linux I/O栈 Linux内核的I/O栈大图知乎Linux I/O专栏1Linux 块设备之Block Layer层架构演变Linux VFS机制简析&#xff08;一&#xff09;Linux VFS机制简析&#xff08;二&#xff09;Linux Kernel文件系统写I…

keycloak入门

realm&#xff1a;领域&#xff0c;指的是在某一个软件业务领域中所涉及的用户认证授权管理相关的对象&#xff0c;在这个realm中有用户、角色、会话session等等用于认证授权管理的对象。 假设一个公司A使用一个erp系统&#xff0c;那么就可以给这个公司A设置一个realm&#xf…

微信小程序nodejs+vue高校食堂餐厅点餐订餐系统ja221

本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用 语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端vueelementui, (1) vue引入elementu…