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

news2025/6/12 21:04:53

每日一言

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

硬件: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,那么就是全部不亮了

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

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

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

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

相关文章

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

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

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

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

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

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

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修改…

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

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

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

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

相机从app启动流程

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

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

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

ServerTrust 并非唯一

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

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

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

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

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

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

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

Python爬虫(一):爬虫伪装

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

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…