学习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,那么就是全部不亮了

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

真的想上岸啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值