51单片机(IIC协议OLED屏)
一、IIC协议
1、IIC协议概述
1.1、概述:IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式
1.2、特点:简单性和有效性。 由于接口直接在组件之上,因此IIC总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降 低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件
多主控(multimastering) 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当 然,在任何时间点上只能有一个主控。
1.3、构成:IIC串行总线一般有两根信号线,一根是双向的数据线SDA,另一根是时钟线SCL,其时钟信号是由主控 器件产生。所有接到IIC总线设备上的串行数据SDA都接到总线的SDA上,各设备的时钟线SCL接到总线 的SCL上。对于并联在一条总线上的每个IC都有唯一的地址。
2、时序分析
IIC总线在传输数据的过程中一共有三种类型信号,分别为:开始信号、结束信号和应答信号。
起始信号
void IIC_Start()
{scl = 0;sda = 1;scl = 1;_nop_();sda = 0;_nop_();
}
终止信号
void IIC_Stop()
{sda = 0;scl = 1;_nop_();sda = 1;_nop_();
}
应答信号
发送器每发送一个字节(8个bit),就在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。 应答信号为低电平时,规定为有效应答位(ACK,简称应答位),表示接收器已经成功地接收了该字 节; 应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功
char IIC_ACK()
{char flag;sda = 1;//就在时钟脉冲9期间释放数据线_nop_();scl = 1;_nop_();flag = sda;_nop_();scl = 0;_nop_();return flag;
}
数据发送
void IIC_Send_Byte(char dataSend)
{int i;for(i = 0;i<8;i++){scl = 0;//scl拉低,让sda做好数据准备sda = dataSend & 0x80;//1000 0000获得dataSend的最高位,给sda_nop_();//发送数据建立时间scl = 1;//scl拉高开始发送_nop_();//数据发送时间scl = 0;//发送完毕拉低_nop_();//dataSend = dataSend << 1;
}
}
二、oled屏
1、OLED写命令
写命令/数据的代码逻辑思路
1. start()
2. 写入 b0111 1000 0x78
3. ACK
4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据
5. ACK
6. 写入指令/数据
7. ACK
8. STOP
void Oled_Write_Cmd(char dataCmd)
{
// 1. start()IIC_Start();
// 2. 写入从机地址 b0111 1000 0x78IIC_Send_Byte(0x78);
// 3. ACKIIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据IIC_Send_Byte(0x00);
// 5. ACKIIC_ACK();
//6. 写入指令/数据IIC_Send_Byte(dataCmd);
//7. ACKIIC_ACK();
//8. STOPIIC_Stop();
}
void Oled_Write_Data(char dataData)
{
// 1. start()IIC_Start();
// 2. 写入从机地址 b0111 1000 0x78IIC_Send_Byte(0x78);
// 3. ACKIIC_ACK();
// 4. cotrol byte: (0)(0)000000 写入命令 (0)(1)000000写入数据IIC_Send_Byte(0x00);
// 5. ACKIIC_ACK();
///6. 写入指令/数据IIC_Send_Byte(dataData);
//7. ACKIIC_ACK();
//8. STOPIIC_Stop();
}
2、OLED的寻址模式
如何显示一个点?
有三种寻址模式,分别位页地址模式,水平地址模式和垂直地址模式,可以通过一下表格进行配置 内存管理
页地址模式
水平地址模式
垂直地址模式
列地址选择
如果写入0x08(b00001000)会显示什么呢 ?一个字节负责一个Page的一列显示
三、代码实现
#include "reg52.h"
#include "intrins.h"sbit scl=P0^1;
sbit sda=P0^3;void IIC_start()
{scl=0;//防止雪花sda=1;scl=1;_nop_();sda=0;_nop_();}
void IIC_stop()
{scl=0;sda=0;scl=1;_nop_();sda=1;_nop_();}char IIC_ACK()
{char flag;sda=1;//就在时钟脉冲9期间释放数据线_nop_();scl=1;_nop_();flag=sda;_nop_();scl=0;_nop_();return flag;
}void IIC_Send_Byte(char dataSend)
{int i;for(i=0;i<8;i++){scl=0;//scl拉低做好数据准备sda=dataSend & 0x80; //1000 0000获得dataSend的最高位,给sda_nop_();//发送数据建立时间scl=1;//scl拉高开始传数据_nop_();scl=0;//发送完毕拉低_nop_();dataSend= dataSend << 1;}
}void Oled_Write_Data(char dataData)
{//1.startIIC_start();//2.写入从机地址 0x78IIC_Send_Byte(0x78);//3.ACKIIC_ACK();//4.control byte: 0000 0000 写入命令 0100 0000 写入数据IIC_Send_Byte(0x40);//5.ACKIIC_ACK();//6.写入指令或数据IIC_Send_Byte(dataData);//7.ACKIIC_ACK();//8.STOPIIC_stop();
}void Oled_Write_Cmd(char dataCmd)
{//1.startIIC_start();//2.写入从机地址 0x78IIC_Send_Byte(0x78);//3.ACKIIC_ACK();//4.control byte: 0000 0000 写入命令 0100 0000 写入数据IIC_Send_Byte(0x00);//5.ACKIIC_ACK();//6.写入指令或数据IIC_Send_Byte(dataCmd);//7.ACKIIC_ACK();//8.STOPIIC_stop();
}void Oled_Init(void){Oled_Write_Cmd(0xAE);//--display offOled_Write_Cmd(0x00);//---set low column addressOled_Write_Cmd(0x10);//---set high column addressOled_Write_Cmd(0x40);//--set start line address Oled_Write_Cmd(0xB0);//--set page addressOled_Write_Cmd(0x81); // contract controlOled_Write_Cmd(0xFF);//--128 Oled_Write_Cmd(0xA1);//set segment remap Oled_Write_Cmd(0xA6);//--normal / reverseOled_Write_Cmd(0xA8);//--set multiplex ratio(1 to 64)Oled_Write_Cmd(0x3F);//--1/32 dutyOled_Write_Cmd(0xC8);//Com scan directionOled_Write_Cmd(0xD3);//-set display offsetOled_Write_Cmd(0x00);//Oled_Write_Cmd(0xD5);//set osc divisionOled_Write_Cmd(0x80);//Oled_Write_Cmd(0xD8);//set area color mode offOled_Write_Cmd(0x05);//Oled_Write_Cmd(0xD9);//Set Pre-Charge PeriodOled_Write_Cmd(0xF1);//Oled_Write_Cmd(0xDA);//set com pin configuartionOled_Write_Cmd(0x12);//Oled_Write_Cmd(0xDB);//set VcomhOled_Write_Cmd(0x30);//Oled_Write_Cmd(0x8D);//set charge pump enableOled_Write_Cmd(0x14);//Oled_Write_Cmd(0xAF);//--turn on oled panel
}void Oled_Clear() //清屏函数
{int i;int j;for(i=0;i<8;i++){Oled_Write_Cmd(0xB0+ i);//page0--page7//每个page从0列Oled_Write_Cmd(0x00);Oled_Write_Cmd(0x10);//到127列,依次写入0,每写入数据,列地址自动偏移for(j=0;j<128;j++){Oled_Write_Data(0); }}}void Oled_Show_Image(unsigned char *image)//显示一张图
{unsigned int i;unsigned int j;for(i=0;i<8;i++){Oled_Write_Cmd(0xB0+ i);//page0--page7//每个page从0列Oled_Write_Cmd(0x00);Oled_Write_Cmd(0x10);//到127列,依次写入0,每写入数据,列地址自动偏移for(j=128*i;j<128 * (i+1);j++){Oled_Write_Data(image[j]);}}}void main()
{//1.OLED初始化Oled_Init();//2.选择一个位置//2.1确认页寻址模式Oled_Write_Cmd(0x20);Oled_Write_Cmd(0x02);Oled_Clear();//清屏函数//显示一条线Oled_Write_Data(0x08);Oled_Write_Data(0x08);Oled_Write_Data(0x08);Oled_Write_Data(0x08);Oled_Write_Data(0x08);Oled_Write_Data(0x08);Oled_Write_Data(0x08);while(1);//不让程序退出
}
相关文章:
51单片机(IIC协议OLED屏)
一、IIC协议 1、IIC协议概述 1.1、概述:IIC全称Inter-Integrated Circuit (集成电路总线) 是由PHILIPS公司在80年代开发的两线式串行总线,用于连接微控制器及其外围设备。IIC属于半双 工同步通信方式 1.2、特点:简单性和有效性。 由于接口直…...
你知道,华为对项目经理要求的3项技能5项素质是什么吗?
很多人一定在好奇,华为对项目经理的要求是什么呢?普通项目经理应具备什么素质,才能进入华为这样的大厂,在严峻的经济形势下无惧裁员呢? 一、三项软技能 我们在华为举办的项目经理论坛中找到了答案:对于华…...
优漫动游 提升效率常用的C4D技巧
C4D是近几年非常热的趋势,经常有人问3D相关的问题,想把自己在找捷径的过程中觉得最实用的小技巧分享给大家 1、快速定位层级和模型 模型的过程中,经常遇到模型层级多难定位的问题,逐级打开或者全部展开对于定位模型使…...
基于蚁群算法的时间窗口路径优化
目录 背影 蚁群算法的原理及步骤 基本定义 编程思路 适应度函数 算法的规则 特点 主要参数 代码 结果分析 展望 背影 现代物流配送对时间要求更高,是否及时配送是配送是否成功的重要指标,本文对路径优化加时间窗口,实现基于蚁群算法的时间窗口路径优化, 蚁群算法 基本…...
liunx
linux常用命令 mkdir :创建文件夹 rm -f :删除文件 docker cp 文件名 20f:容器内地址 将文件从linux系统移动到docker地址 ln -s 将两个文件做链接 compgen -u 查看所有用户 groups 查看所在组 vim 编辑 quit 退出 sudo su - root 获得root权限 cp dir1/…...
机动车发票组件【vue】
发票组件 问题反馈:在这就可以 Install-下载 npm install motorvehicles --savewarrning:我们推荐您设置key的,因为不存在它会带来数据的复用性问题usage-使用说明 import MotorVehiclesIvoice from motorvehiclesimport MotorVehiclesIvo…...
学习笔记-剖析k8s之StatefulSet的拓扑状态-3月day18
文章目录前言StatefulSetHeadless ServicePod的拓扑状态小结附前言 Deployment实际上并不足以覆盖所有的应用编排问题,原因在于Deployment对应用做了一个简单化的假设:一个应用的所有Pod,是完全一样的。所以,它们互相之间没有顺序…...
Java实现输出九九乘法口诀表,输入行数输出对应的梯形(平行四边形)这两个代码
目录 一、前言 二、代码部分 1.输出九九乘法口诀表的代码 三、程序运行结果(控制台输出) 一、前言 1.本代码是我在上学时写的,有一些地方没能完美实现,请包涵也请多赐教! 2.本弹窗界面可以根据简单的要求进行输…...
C++空间配置器
目录 1.什么是空间配置器 2.为什么需要空间配置器 3.SGI-STL空间配置器实现原理 3.1一级空间配置器 3.2二级空间配置器 3.2.1内存池 3.2.2 SGI-STL中二级空间配置器设计 3.3 空间配置器的默认选择 4.空间配置器与容器的结合 1.什么是空间配置器 空间配置器࿰…...
JConsole使用教程
JConsole是一个Java虚拟机的监控和管理工具,可以监控Java应用程序的内存使用、线程和类信息等。 以下是JConsole的使用教程: 1.启动JConsole JConsole是一个Java自带的工具,可以在bin目录下找到jconsole.exe文件。双击运行该文件即可启动JC…...
JS手写防抖和节流函数(超详细版整理)
1、什么是防抖和节流防抖(debounce):每次触发定时器后,取消上一个定时器,然后重新触发定时器。防抖一般用于用户未知行为的优化,比如搜索框输入弹窗提示,因为用户接下来要输入的内容都是未知的&…...
我的Macbook pro使用体验
刚拿到Mac那一刻,第一眼很惊艳,不经眼前一亮,心想:这是一件艺术品,太好看了吧 而后再体验全新的Macos 系统,身为多年的win用户说实话一时间还是难以接受 1.从未见过的访达,不习惯的右键 2. …...
炼石入选“首届工业和信息化领域商用密码应用峰会”典型方案
2023年3月22日-23日,浙江省经济和信息化厅、浙江省通信管理局、浙江省密码管理局、工业和信息化部商用密码应用产业促进联盟联合举办的“首届工业和信息化领域商用密码应用峰会”(以下简称峰会)在浙江杭州成功举办,旨在深入推进工…...
使用new bing chat成功了
步骤一:在扩展商店搜索并安装modheader 打开浏览器; 点击右上角的三个点图标,选择“更多工具” -> “扩展程序”; 在扩展程序页面上方的搜索框中输入“modheader”,然后点击“搜索商店”; 在搜索结果中找到“ModHeader”扩展程序,点击“添加至”按钮,然后再点击“添…...
Golang每日一练(leetDay0019)
目录 55. 跳跃游戏 Jump Game 🌟🌟 56. 合并区间 Mmerge Intervals 🌟🌟 57. 插入区间 Insert Interval 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练…...
记录一次性能测试遇到的问题
零、压测指标问题 压测指标,一定要需求方定 啊,谁提压测需求,谁来定压测指标。 如果需求方,对压测指标没有概念,研发和测试,可以把历史压测指标、生产数据导出来给需求方看,引导他们来定指标&…...
C++运算符重载基础教程
所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载(Operator Overloading)也是一个道理,同一个运算符可以有不同…...
Git命令总结
全局配置 git config --global user.name ‘你的名字’ git config --global user.email ‘你的邮箱’ 当前仓库配置 git config --local user.name ‘你的名字’ git config --local user.email ‘你的邮箱’ 查看 global 配置 git config --global --list 查看当前仓库…...
【车载以太网】BCM89572A0BCFBG、BCM89559GB0BCFBG、BCM89559GA0BCFBG具有安全启动和安全通信功能
BCM89572A0BCFBG 设备是Broadcom第六代完全集成的L2多层开关解决方案,支持车载网络应用的汽车认证(AEC-Q100)和温度等级。BCM8956X系列产品为汽车行业提高了具有多种一流功能的交换机的标准,例如802.1AE MACsec等集成安全功能,增加了主机连接…...
Lighttpd入门教程
Lighttpd入门教程概述入门教程安装配置静态文件服务动态文件服务虚拟主机SSL启动服务器日志模块总结lighthttpd使用场景和原理使用场景原理概述 Lighttpd(也称为轻量级HTTP服务器)是一款快速、灵活、轻量级的Web服务器,旨在提供高性能和低资…...
Springboot 多线程分批切割处理 大数据量List集合 ,实用示例
前言 哲学提问镇贴: 不了解异步怎么使用的看官, 可阅: SpringBoot 最简单的使用异步线程案例 Async_小目标青年的博客-CSDN博客 Springboot Async异步扩展使用 结合 CompletableFuture_小目标青年的博客-CSDN博客 想了解更多关于批量list处…...
SQLMAP工具基础使用
本文用的是kali自带的sqlmap工具 我们通过常用命令来理解sqlmap的基本使用 目录 检测注入 获取敏感信息 获取表 获取表的字段 获取数据 --technique 使用指定的注入方式 使用基于时间的延时注入 支持多种注入检测 默认是全部 注入时使用随机的 HTTP User-Agent 设置超时时间 读…...
初学多线程爬虫
多线程在爬虫中应用非常广泛,对于中大型项目来说很有必要,今天我将以初学者的姿态来完成一个简单的多线程爬虫程序。 1、如何认识多线程 计算机完成一项或多项任务,往往可以存在很高的并行度:若是多核处理器则天然的可以同时处理…...
python-实验报告-3
1、编写程序,用户输入一个五位整数,输出其千位和十位数字之和。 num int(input()) # 12345 s1 (num//1000)%10 s2 (num//10)%10sum s1 s2 print(sum)心得: 首先,程序通过 input() 函数获取用户输入的整数,保存在…...
00_托管网站在Tor网络上_Ubuntu主机
title: 托管网站在Tor网络上 urlname: 00_托管网站在Tor网络上_Ubuntu主机 date: 2017-04-24 03:03:03 tags: 小技巧 categories: [小技巧] 托管网站在Tor网络上(Ubuntu主机)https://www.t00ls.net/thread-44040-1-1.html 大部分人接触Tor网络是由Tor …...
个人练习-Leetcode-659. Split Array into Consecutive Subsequences
题目链接:https://leetcode.cn/problems/split-array-into-consecutive-subsequences/ 题目大意:给出一个非递减数列nums[],判断其是否能被分割成若干个满足以下条件的子列: 长度大于等于3元素严格递增且只相差1 子列的含义是&…...
OTA升级差分包签名
制作差分包时添加-k <key_path>参数 ./build/tools/releasetools/ota_from_target_files -k <key_path> -i old.zip new.zip update.zip<key_path>如何取值?查看ProjectConfig.mk 如果MTK_SIGNATURE_CUSTOMIZATIONyes并且MTK_INTERNALno…...
使用Buildroot制作根文件系统
寒暄几句 学习了uboot、内核、busybox根文件系统,想着做一个音频播放器。最后发现好像busybox好像没有带aplay架构,这就很麻烦需要自己移植。为了简便我就找大佬沟通了一下,大佬推荐了Buildroot工具来制作根文件系统。 平台 开发板&#x…...
Java_Spring:5. 基于注解的 IOC 配置
目录 1 环境搭建 1.1 第一步:拷贝必备 jar 包到工程的 lib 目录。 1.2 第二步:使用Component 注解配置管理的资源 1.3 第三步:创建 spring 的 xml 配置文件并开启对注解的支持 2 常用注解 2.1 用于创建对象的注解 2.1.1 Component 2.1…...
Git下的.gitignore文件
.gitignore .gitignore是一个文件,这个文件用来指定哪些文件提交到 git 管理,也就是 git commit 不会提交这些文件 .gitignore文件的语法 注释 "#" 表示注释 # 注释 忽略指定文件/文件夹 直接写入文件或文件夹名即可,指定文…...
佛山网站建设网站制作公司哪家好/关键词有哪些
提回来4个月,关于导航的问题曾经纠结过很久:弄个一体机吧,贵,安装还麻烦,新地图也麻烦(其实主要是贵。。。),家里装宽带电信送华为C8812跟华为C8650,一直都是拿这两个手机当导航用&am…...
天猫商城商品来源/小辉seo
转自:http://www.360doc.com/content/11/1018/13/1016783_157133781.shtml 首 先,看RTP协议包头的格式: 前12个字节在每一个RTP packet中都存在,而一系列的CSRC标记只有存在Mixer时才有。 version (V): 2 bits 标明RTP版本号…...
wordpress mobile 主题/广告平台推广渠道
最近对人脸识别感兴趣,于是入坑安装Face_recognition,花一天功夫没装下来,我的系统和Python版本是win64Anacond(python3.7.1)。 一天下来搞明白了想安装face_recongnition的必需配置好Dlib, 配置好dlib的必要条件是:自…...
仓山区城乡建设局网站/营销qq
简单介绍我一个小小DLer,目前在读硕士,已经在深度学习道路上走过了不少时间,写过简书、CSDN,打过各种深度学习比赛,写过很多paper解读文章,最近感觉微信公众号不错,所以打算之后的深度学习笔记都…...
牌具网站广告怎么做/暴疯团队seo课程
1. STM32 ADC 简介STM32 拥有 1~3 个 ADC(STM32F101/102 系列只有 1 个 ADC),这些 ADC 可以独立使用,也可以使用双重模式(提高采样率)。STM32 的 ADC 是 12 位逐次逼近型的模拟数字转换器。它有 18 个通道,可测量 16 个外部和 2 个内部信号源…...
龙华网站建设招聘/最近的国际新闻大事
# 该函数有二个作用:# 1、根据给定的二进制运行程序,找出该程序的进程号(PID)。 # 2、判断该二进制程序的运行状态,输出不同的返回値,供查看一个程序的运行状态时使用。 # __proc_pids {program} [pidfile] -----> 该函数的用…...