当前位置: 首页 > article >正文

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言

     生活的美好,总是藏在那些你咬牙坚持的日子里。

硬件:OLED

以后要用到OLED的时候找到这个文件

OLED的设备地址

SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 

驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图

开始信号  从机地址(slave 翻译 从机)

Salve address 【011110 SAO RW】

Sa0 的意思就是当接了多个oled屏幕的时候,想要在不同的屏幕上显示不同的内容,那么怎么区分呢,就用这个Sa0的值来表示 我们用0 或者1都可以

RW就是 0 代表写模式  1代表读模式 (我们写指令还是写内容都是写的模式)

ACK :应答信号

Control byte 就是控制字节  【co D/C 000000】

Co:  1代表 每次都问每次控制字节都会起作用,问之后的数据是命令还是数据,就好像会控制一下的感觉,

  0代表 只有第一次会问 后面每次一个字节发送结束后都不会问,只会一直发字节 控制字节不会起作用

D/C    表示当前字节是代表的写入命令还是数据  0代表当前字节代表命令  1代表数据

所以我们根据以上我们定义一个函数

单片机写入命令到OLED

Start()

写入设备的地址 011110 00  0x78

ACK

Control byte  00000000   0x00

Ack

Senddata() 你的命令字节

ACK

STOP()

单片机写入数据到OLED              

Start()

写入设备的地址 011110 00  0x78

ACK

Control byte  01000000   0x40

Ack

Senddata() 你的命令字节

ACK

STOP()

所以OLED写入指令函数(地址)

OLED写入内容函数

案例1:OLED显示一个点

那么我们怎么去选一个点呢

我们oled是  64  x  128这样的这么多个点的屏幕 行为128个点 列为64个点(一个点代表一个位)

Oled将列方向上64个点分成了page7 从page0-7  那么就是8个page寄存器,每个寄存器存放8位,那么我们要将这个寄存器的地址找出来,在里面把字节填上去,那不就显示1的格子就亮起来(具体的讲解看手册,我只是利于自己的记忆)

我自己画的图,真的一目了然,我们只需要找到page的地址即可

怎么找

Oled给了我们3种寻址模式

我的话来讲就是假如选择page0寄存器 的col0  8个位填满了 就到col1......到了最后一个col127填满了之后就回到page col0原点

我的话来讲就是假如选择page0寄存器 的col0  8个位填满了 就到col1......到了最后一个col127填满了之后就回到page1  col0继续填  依次循环到最后page7寄存器的col127填满之后会回到page0;

这个不常用

官方解释:

一、页寻址模式(Page Addressing Mode)

核心逻辑:按 “页 + 列” 的方式定位数据,写完一列自动移到下一列,页地址不会自动变化

实际结构
OLED 屏幕(以 128×64 为例 )被分成 8 页(Page0~Page7 ),每页对应屏幕纵向 8 行像素,横向 128 列。可以把 “页” 理解成 “一整条横向的 8 行像素带”。

数据写入流程

    1. 先选 “页地址”(比如 Page0 )和 “起始列地址”(比如第 0 列 )。
    2. 开始写数据,每写 1 个字节(控制一列 8 个像素的亮灭 ),列地址自动 +1(接着写下一列 )。
    3. 当列地址到 127(本页最后一列 ),再写数据时,列地址会回到本页起始列,但页地址不变(还在 Page0 )。
    4. 若要写 “下一页”,必须手动切换页地址(比如发命令切到 Page1 )。

适用场景
适合局部更新屏幕(比如只改某一行文字 ),不用动其他页的数据;但写全屏时,得手动切换 8 次页地址,稍麻烦。

二、水平寻址模式(Horizontal Addressing Mode)

核心逻辑:按 “列 + 页” 的方式写数据,写完一列自动移到下一列,列地址到末尾后,页地址自动 +1

数据写入流程

    1. 先设置 “列地址范围”(比如 0~127 列 )和 “页地址范围”(比如 0~7 页 ,即全屏 )。
    2. 开始写数据,每写 1 个字节,列地址自动 +1
    3. 当列地址到 127(最后一列 ),再写数据时,列地址回到起始列,同时页地址自动 +1(接着写下一页 )。
    4. 当页地址到 7(最后一页 ),再写数据时,页地址回到起始页,列地址回到起始列,循环覆盖。

适用场景
适合全屏更新(比如刷新一整张图片 ),不用手动切换页地址,连续发数据就能填充满整个屏幕显存,效率高。

三、垂直寻址模式(Vertical Addressing Mode)

核心逻辑:按 “页 + 列” 的方式写数据,但写完一页自动移到下一页,页地址到末尾后,列地址自动 +1

数据写入流程

    1. 先设置 “页地址范围”(比如 0~7 页 )和 “列地址范围”(比如 0~127 列 ,即全屏 )。
    2. 开始写数据,每写 1 个字节,页地址自动 +1
    3. 当页地址到 7(最后一页 ),再写数据时,页地址回到起始页,同时列地址自动 +1(接着写下一列 )。
    4. 当列地址到 127(最后一列 ),再写数据时,列地址回到起始列,页地址回到起始页,循环覆盖。

适用场景
相对用得少,适合一些特殊的 “按列优先更新” 需求(比如垂直滚动显示时,按列填充数据 ),实际项目中,水平 / 页寻址模式用得更多。

四、一句话总结区别

  • 页寻址:列自动变,页手动变 → 适合局部更新。
  • 水平寻址:列自动变,列满了页自动变 → 适合全屏连续更新。
  • 垂直寻址:页自动变,页满了列自动变 → 特殊场景用(比如垂直滚动 )。

其实刚刚都在介绍各种的寻址模式,现在才到了最关键的时候

寻址模式选择

页寻址模式

Ox20

0x02

我们在手册找到这个Addressing Setting Command Table这个就是设置地址的命令表

在 SSD1306 的指令表中,* 标记的位通常是 “不影响” 或 “可忽略” 的位用0填上

这个**号就是不用看的用0填充  这个page Addressing Mode(RESET)就是页寻址模式  这两个RESET就是默认的意思,所以如果不配模式,那么也是页模式的寻址

A[1:0] 对应指令字节的 D1(A1)和 D0(A0) 两位。 后面的10b 表达D1是1 D0 是0

所以上面一排就是意思是要发送 00100000 给OLED 再发送 00000010 给OLED

所以寻址模式我们就可以配置成页模式了

只懂得模式当然不行,还要懂得寄存器地址

寄存器地址

我们在手册找到这个Addressing Setting Command Table这个就是设置page寄存器的命令表

那么这个前面的10110都是默认的 后面xxx才是需要自己配置的,又会发现有3个x那么是不是2的3次方就是8,也就是代表我们8种page寄存器的地址,使每个page都有地址

如果是page0 的话就是 1011 0000 =0xB0

如果是page1 的话就是 1011 0001 =0xB1

如果是page2 的话就是 1011 0010 =0xB2

如果是page3 的话就是 1011 0011 =0xB3

OLED初始化

这个直接拿官方的代码就好了

接下来我们写代码

好了这样我们就写好了代码,显示一个点的传入的是0x80 因为是 10000000刚好只有一个1,那么就会只有一个点亮起来

既然都有了一个点那么我们让其变成线

这个时候我们会发现啊,要是我们再继续用一个寄存器,然后写东西的话,他的列是不会从0开始的,而是继续加下去的,那么我们就需要进行对列的操作

怎么操作

我用自己的语言描述

假如现在想要从18列开始

先发高发低都可以,因为OLED会检测出来,效果是一样的

后面我们运行的时候,会发现我们这次运行怎么会包含有上一次运行的像素线条,那是因为oled会保存到他的内存里面,所以我们应该去解决这个问题,我们需要设计一个清屏函数。Oled初始化后先清屏,才不会影响后面的效果

清屏函数

清屏函数的设计:

Oled write cmd(0xB0 +i);这个就是因为page寄存器的地址就是这样计算的

如果是page0 的话就是 1011 0000 =0xB0

如果是page1 的话就是 1011 0001 =0xB1

如果是page2 的话就是 1011 0010 =0xB2

如果是page3 的话就是 1011 0011 =0xB3

然后以第0列开始那么我们就要发送0x10和0x00,然后每一个寄存器(+i),要将128列的每一个位置都给0,这样不就是把所有的位置都变成0,那么就是全部不亮了

所以这就完成了清屏的效果了

今天先这样下一次全部结束

相关文章:

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

C++ 基础特性深度解析

目录 引言 一、命名空间(namespace) C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用(reference)​ C 中的引用​ 与 C 语言的对比​ 四、inline(内联函数…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

数据链路层的主要功能是什么

数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手,它却总在Library里给你写"回忆录"?卸载的Final Cut Pro像电子幽灵般阴魂不散?总是会有残留文件,别慌!这份Mac软件卸载指南,将用最硬核的方式教你"数字分手术"&#xff0…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级

在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

【单片机期末】单片机系统设计

主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Java 加密常用的各种算法及其选择

在数字化时代&#xff0c;数据安全至关重要&#xff0c;Java 作为广泛应用的编程语言&#xff0c;提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景&#xff0c;有助于开发者在不同的业务需求中做出正确的选择。​ 一、对称加密算法…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...