“OLED屏幕,色彩绚丽,画面清晰,让每一帧都生动无比。“#IIC协议【上】

"OLED屏幕,色彩绚丽,画面清晰,让每一帧都生动无比。"#IIC协议【上】

    • 前言
    • 预备知识
    • 1.IIC协议初识
      • 1.1 IIC协议概述
      • 1.2 IIC协议的特点
      • 1.3 IIC协议的构成
    • 2. IIC起始信号和终止信号
      • 2.1起始型号和终止信号时序图分析
      • 2.2起始信号函数和终止信号函数代码
      • 2.3完整程序代码
    • 3. IIC协议ACK函数封装
      • 3.1应答信号简介
      • 3.2应答信号时序图分析
      • 3.3应答信号函数代码
      • 3.4完成程序代码
    • 4. IIC协议发送一个字节的函数封装
      • 4.1 IIC协议发送时序图分析
      • 4.2 IIC协议发送一个字节的算法思想。
      • 4.3函数代码
      • 4.4完整程序代码
    • 5.OLED写入指令和数据
      • 5.1 OLED写入指令和数据手册详解
      • 5.2根据手册内容得OLED写指令和数据函数
    • 6. OLED显示一个点的思路
      • 6.1 OLED屏幕的组成
      • 6.2 OLDE屏幕地址结构图
      • 6.3 OLED单页地址结构体
      • 6.4 OLED的三种地址寻址模式
      • 6.5 OLED页地址模式选择
      • 6.6写入 0000 1000
    • 结束语

前言

  本篇博文介绍的是用51单片机的 IIC 协议【上】(OLED屏幕),包含IIC协议初识,IIC起始信号和终止信号,IIC协议ACK函数封装,IIC协议发送一个字节的函数封装,OLED写入指令和数据,OLED显示一个点的思路。看到这篇博文的朋友,可以先赞再看吗?

预备知识

  一、基本电路标识识别和接线,例如VCC,GND。
  二、电脑基本操作复制粘贴
  三、准备软件FastStone Capture,会简单操作(此软件需要的评论区评论)
  四、数字电子时序图的识别
  五、一点点专业英语积累
  六、C变量
  七、基本输入输出
  八、流程控制
  九、函数

  十、指针
  十一、字符串

  如果以上知识不清楚,请自行学习后再来浏览。如果我有没例出的,请在评论区写一下。谢谢啦!

1.IIC协议初识

1.1 IIC协议概述

  IIC全称Inter-Integrated Circuit (集成电路总线)

  是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双工同步通信方式

1.2 IIC协议的特点

  • 简单性和有效性。

  由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件

  • 多主控

  其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

1.3 IIC协议的构成

  IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线的SCL上。对于并联在一条总线上的每个IC都有唯一的地址

在这里插入图片描述

2. IIC起始信号和终止信号

2.1起始型号和终止信号时序图分析

在这里插入图片描述

2.2起始信号函数和终止信号函数代码

void IICStart()                  //IIC起始信号函数
{SCL = 1;                       //根据起始信号时序图,SCL一直为高电平SDA = 1;                       //根据起始信号时序图阴影部分,SDA先是高电平_nop_();                       //_nop_()寒素执行时间为5微秒,并不是1微秒,原因是调用函数时有进出栈操作//此时在这里,根据起始信号时序图可知需要延时》4.7微秒SDA = 0;                       //根据起始信号时序图阴影部分,SDA此时为低电平_nop_();                       //延时5微秒
}void IICStop()                   //IIC终止信号函数
{SCL = 1;                       //根据起始信号时序图,SCL一直为高电平SDA = 0;                       //根据起始信号时序图阴影部分,SDA先是低电平_nop_();                       //延时5微秒SDA = 1;                       //根据起始信号时序图阴影部分,SDA此时为高电平_nop_();                       //延时5微秒
}

2.3完整程序代码

#include "reg52.h"
#include "intrins.h"sbit SCL = P0^1;                   //把SCL接单片机P0.1口
sbit SDA = P0^3;                   //把SDA接单片机P0.3口void IICStart()                    //IIC起始信号函数
{SCL = 1;                       //根据起始信号时序图,SCL一直为高电平SDA = 1;                       //根据起始信号时序图阴影部分,SDA先是高电平_nop_();                       //_nop_()寒素执行时间为5微秒,并不是1微秒,原因是调用函数时有进出栈操作//此时在这里,根据起始信号时序图可知需要延时》4.7微秒SDA = 0;                       //根据起始信号时序图阴影部分,SDA此时为低电平_nop_();                       //延时5微秒
}void IICStop()                     //IIC终止信号函数
{SCL = 1;                       //根据起始信号时序图,SCL一直为高电平SDA = 0;                       //根据起始信号时序图阴影部分,SDA先是低电平_nop_();                       //延时5微秒SDA = 1;                       //根据起始信号时序图阴影部分,SDA此时为高电平_nop_();                       //延时5微秒
}void main()
{IICStart();IICStop();
}

3. IIC协议ACK函数封装

3.1应答信号简介

  发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位ACK,简称应答位),表示接收器已经成功地接收了该字节
  应答信号为高电平时,规定为非应答位NACK),一般表示接收器接收该字节没有成功

3.2应答信号时序图分析

在这里插入图片描述

3.3应答信号函数代码

char IIC_ACK()
{char flag;SDA = 1;                         //释放数据线_nop_();SCL = 1;_nop_();flag = SDA;_nop_();SCL = 0;_nop_();return flag;
}

3.4完成程序代码

#include "reg52.h"
#include "intrins.h"sbit SCL = P0^1;                   //把SCL接单片机P0.1口
sbit SDA = P0^3;                   //把SDA接单片机P0.3口char IIC_ACK()
{char flag;SDA = 1;                         //释放数据线_nop_();SCL = 1;_nop_();flag = SDA;_nop_();SCL = 0;return flag;
}void main()
{char i;i = IIC_ACK();
}

4. IIC协议发送一个字节的函数封装

4.1 IIC协议发送时序图分析

在这里插入图片描述

4.2 IIC协议发送一个字节的算法思想。

  从上面的时序图分析中可知是发送一个位的数据,那么发送一个字节也就是8位数据就需要发送8次一个位的数据。从高位开始发,每次发送的数据必须是当前数据的最高位。可以用与上0x80解决,但这又衍生出一个问题,0x80只能发送8位数据的最高位,那怎么办才能将数据往左边移动呢?这可以用移位运算解决。

  这样的算法思想便可以使通过IIC协议发送一个字节的数据。

4.3函数代码

void IICSendByte(char cdata)
{char i;for(i=0; i<8; i++ ){   	SCL = 0;                       //scl拉低,让sda做好数据准备SDA = cdata & 0x80;            //0x80 = 1000 0000获得cdata的最高位,给sda_nop_();                       //发送建立数据时间SCL = 1;                       //SCL被拉高开始发送数据_nop_();											 //数据发送时间SCL = 0;                       //发送完数据被拉低_nop_();cdata = cdata << 1;}
}

4.4完整程序代码

#include "reg52.h"
#include "intrins.h"sbit SCL = P0^1;                   //把SCL接单片机P0.1口
sbit SDA = P0^3;                   //把SDA接单片机P0.3口void IICSendByte(char cdata)
{char i;for(i=0; i<8; i++ ){   	SCL = 0;                       //scl拉低,让sda做好数据准备SDA = cdata & 0x80;            //0x80 = 1000 0000获得cdata的最高位,给sda_nop_();                       //发送建立数据时间SCL = 1;                       //SCL被拉高开始发送数据_nop_();											 //数据发送时间SCL = 0;                       //发送完数据被拉低_nop_();cdata = cdata << 1;}
}void main()
{char i;IICSendByte(i);
}

5.OLED写入指令和数据

5.1 OLED写入指令和数据手册详解

在这里插入图片描述

5.2根据手册内容得OLED写指令和数据函数

void OledWriteCmd(char Cmd)
{//1.startIICStart();//2.写入从机地址 b0111 1000 0x78IICSendByte(0x78);//3.ACKIIC_ACK();//4.cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据IICSendByte(0x00);//5.ACKIIC_ACK();//6. 写入指令/数据IICSendByte(Cmd);//7.ACKIIC_ACK();//8.STOPIICStop();
}void OledWriteData(char Data)
{//1.startIICStart();//2.写入从机地址 b0111 1000 0x78IICSendByte(0x78);//3.ACKIIC_ACK();//4.cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据IICSendByte(0x40);//5.ACKIIC_ACK();//6. 写入指令/数据IICSendByte(Data);//7.ACKIIC_ACK();//8.STOPIICStop();
}

6. OLED显示一个点的思路

6.1 OLED屏幕的组成

  OLED屏幕是由128×64像素点构成,也就是128×64个小灯珠构成。

6.2 OLDE屏幕地址结构图

在这里插入图片描述

  从地址结构图可知,OLED将128×64像素点分成了7个大组,每组为128×8个像素点。每组的名字被命名为*页。

6.3 OLED单页地址结构体

在这里插入图片描述

6.4 OLED的三种地址寻址模式

  • 页地址模式

在这里插入图片描述

  • 水平地址模式

在这里插入图片描述

  • 垂直地址模式(少用)

在这里插入图片描述

6.5 OLED页地址模式选择

在这里插入图片描述

  配置指令如下:

  图中有红框处前面的地址有两行。

  第一行命令为:0x20

  第二行命令为:0x02 (可不用配,默认就为页地址)

6.6写入 0000 1000

  • 一个字节负责一个Page的列显示
640 列1 列2 列3 列124 列125 列126 列127 列
Page0bit00行0
bit11行0
bit22行0
bit33行1
bit44行0
bit55行0
bit66行0
bit77行0
Page18到 15行
Page216到 23行
Page3
Page4
Page5
Page6

结束语

  很高兴您能看到这里,点个赞再走呗。谢谢您啦!!!

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

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

相关文章

JAVA学习笔记9

1.Java API 文档 1.java类的组织形式 2.字符类型(char) 1.基本介绍 ​ *字符类型可以表示单个字符&#xff0c;字符类型是char&#xff0c;char是两个字节&#xff08;可以存放汉字&#xff09;&#xff0c;多个字符我们用字符串String ​ eg:char c1 ‘a’; ​ char c2…

【Android】使用Android Studio运行Hello World项目

文章目录 1. JDK的安装与配置2. Android Studio的安装3. 运行Hello World项目3.1 新建项目3.2 修改项目配置3.2.1 修改UI界面3.2.2 配置 Android SDK 3.3 添加并运行虚拟设备3.4 运行项目 1. JDK的安装与配置 想要使用Android Studio&#xff0c;必须先配置Java环境&#xff0…

vue3初识

目录 一、前言二、主观感受三、vue3初探 原文以及该系列教程文章后续可点击这里查看&#xff1a;vue初识 一、前言 Vue.js是一款流行的前端框架&#xff0c;最初由尤雨溪&#xff08;Evan You&#xff09;于2014年创建&#xff0c;非常的年轻。官网为vue3&#xff0c; 但要注…

Learn LaTeX 015 - LaTex Typeset 抄录

https://www.douyin.com/user/self?modal_id7306721102380764453&showTabpost GitHub address: https://github.com/yasenstar/learn_latex Gitee address: https://gitee.com/yasenstar/learn_latex

windows 查看磁盘空间 treesizefree

https://downloads.jam-software.de/treesize_free/TreeSizeFreeSetup.exe

Hugging Face 刚刚推出了一款开源的 AI 助手制造工具,直接向 OpenAI 的定制 GPT 挑战

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

清空队列的方法

注意&#xff1a;C中的队列queue自身不支持clear操作&#xff0c;但双端队列deque是支持clear操作的。 方法一&#xff1a;直接用空的队列对象赋值 代码&#xff1a; queue<int> q; qqueue<int>(); 方法二&#xff1a;遍历出队列 代码&#xff1a; while(!q…

C#系列-使用 Minio 做图片服务器实现图片上传 和下载(13)

1、Minio 服务器下载和安装 要在本地安装和运行 MinIO 服务器&#xff0c;你可以按照以下 步骤进行操作&#xff1a; 1. 访问 MinIO 的官方网站&#xff1a;https://min.io/&#xff0c;然后 点击页面上的”Download”按钮。 2. 在下载页面上&#xff0c;选择适合你操作系统的 …

AJ-Report 【开源的一个BI平台】

AJ-Report是全开源的一个BI平台&#xff0c;酷炫大屏展示&#xff0c;能随时随地掌控业务动态&#xff0c;让每个决策都有数据支撑。     多数据源支持&#xff0c;内置mysql、elasticsearch、kudu驱动&#xff0c;支持自定义数据集省去数据接口开发&#xff0c;目前已支持30…

【JS逆向六】(下)逆向解密某网站返回的密文的值 仅供学习

逆向日期&#xff1a;2024.02.07 使用工具&#xff1a;Node.js 文章全程已做去敏处理&#xff01;&#xff01;&#xff01; 【需要做的可联系我】 可使用AES进行解密处理&#xff08;直接解密即可&#xff09;&#xff1a;在线AES加解密工具 1、打开某某网站(请使用文章开头的…

2024年1月23日 Go生态洞察:开发者对Go的反馈分享

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a;…

鸿蒙开发系列教程(十五)--gesture 手势事件

gesture 手势事件 手势操作是指在移动设备上使用手指或手势进行与应用程序交互的方式。手势操作可以包括点击、滑动、双击、捏合等动作&#xff0c;用于实现不同的功能和操作。 gesture 常规手势 参考代码&#xff1a; Entry Component struct Test03 {build() {Column() {…

Stable Diffusion 模型下载:ToonYou(平涂卡通)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 ToonYou 是一个平涂风格的卡通模型&#xff0c;它的画风独特、光感强烈、画面表现力强、场景结构完整&#xff0c;一张张图犹如动画电影截图&#xff0c;非常值得推…

Python 错误及其解决方法

Python 是一种易于学习的编程语言&#xff0c;但初学者在学习和使用 Python 的过程中难免会遇到一些错误。以下是一些常见的 Python 错误及其解决方法&#xff1a; 1. 语法错误&#xff08;SyntaxError&#xff09;&#xff1a; python # 错误示例 print("Hello, World!…

React18原理: Fiber架构下的单线程CPU调度策略

概述 React 的 Fiber 架构, 它的整个设计思想就是去参考CPU的调度策略CPU现在都是多核多进程的&#xff0c;重点研究的是 CPU是单核单线程&#xff0c;它是如何调度的?为什么要去研究单线程的CPU&#xff1f; 浏览器中的JS它是单线程的JS 的执行线程和浏览器的渲染GUI 是互斥…

小程序-云开发 获取用户的openid等信息

说明介绍&#xff1a; 小程序云开发功能来获取用户的openid。 一般在我们需要用到用户登录的时候&#xff0c;通常是需要获取微信小程序的openid的&#xff0c;由于微信的限制&#xff0c;一般我们只能通过后台去调微信的接口&#xff0c;来授权获取&#xff0c;增加了后端开发…

fast.ai 深度学习笔记(二)

深度学习 2&#xff1a;第 1 部分第 4 课 原文&#xff1a;medium.com/hiromi_suenaga/deep-learning-2-part-1-lesson-4-2048a26d58aa 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这…

【Linux】 网络编程套接字

目录 预备知识 网络字节序 网络字节序和主机字节序转换的库函数 socket编程接口 socket常见API sockaddr结构 套接字的种类 预备知识 1.在IP数据包头部中&#xff0c;有两个IP地址&#xff0c;分别叫做源IP地址和目的IP地址。 2.端口号&#xff1a;是传输层协议的内容…

AI大模型学习笔记之四:生成式人工智能(AIGC)是如何工作的?

OpenAI 发布 ChatGPT 已经1年多了&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;也已经广为人知&#xff0c;我们常常津津乐道于 ChatGPT 和 Claude 这样的人工智能系统能够神奇地生成文本与我们对话&#xff0c;并且能够记忆上下文情境。 Midjunery和DALLE 这样的AI…

【HTTP】localhost和127.0.0.1的区别是什么?

目录 localhost是什么呢&#xff1f; 从域名到程序 localhost和127.0.0.1的区别是什么&#xff1f; 域名的等级划分 多网站共用一个IP和端口 私有IP地址 IPv6 今天在网上逛的时候看到一个问题&#xff0c;没想到大家讨论的很热烈&#xff0c;就是标题中这个&#xff1a; …