- 打卡等级:以坛为家II
- 打卡总天数:512
- 最近打卡:2025-09-03 06:12:15
荣誉版主
- 积分
- 3470
|
发表于 2025-7-19 17:08:38
|
显示全部楼层
这里面仍然有几个误解
首先,设置显示的起始位置的指令,
page用(0xB0+page号)来设置
列用(0x00+列地址的低四位)和(0x10+列地址的高四位)来设置
这一点是没错的。
不论用的是水平地址模式、页地址模式、还是垂直地址模式,0xB0、0x00、0x01都是有效的。
====================================
而你提到的0x22,则是另外作用的指令。
在常见的SSD1306、SSD1309、SSD1315这些芯片的屏幕里,有两个独属的“设置显示区域”的指令:0x21和0x22。
它俩都是三字节指令,可以在屏幕上画出一个显示区域进行显示,区域之外不参与显示(相当于把屏幕的128×64的面积改小了)。
格式是:
OLED_WR_Byte( 0x21, CMD ); // 设置列范围
OLED_WR_Byte( 起始列地址, CMD ); // 范围 0~127
OLED_WR_Byte( 结束列地址, CMD ); // 范围 0~127
OLED_WR_Byte( 0x22, CMD ); // 设置page范围
OLED_WR_Byte( 起始page号, CMD ); // 范围 0~7
OLED_WR_Byte( 结束page号, CMD ); // 范围 0~7
当起始值和结束值相同的时候,就是定位具体某一page或者某一列。
如果不进行0x21和0x22的配置,上电默认起始列是0,结束列是127,起始page是0,结束page是7,也就是全屏。
设置了区域之后,发送的数据会在这个区域里进行显示,三种地址模式均有效。
关于你说配置了0x21和0x22就不用0xB0、0x00、0x01,如果你的显示程序能始终保持全屏操作,或者整行操作,那么没问题。
但是0x22和0xB0一起用,肯定会出问题,因为用过0x22之后,显示区域的0点位置就已经变了,0xB0是按照新的0点进行定位的。
如果显示局部内容,比如一个字符,也可以用这两个指令,画出字符大小的区域,然后发送字符数据。
而0xB0、0x00、0x01在这个新的区域里仍然有效。
之所以说“专属”是因为SH1106之类屏幕不支持这个指令,只支持0xB0、0x00、0x01。
所以,这是两组不同功能的指令,不能混为一谈。
你用0x22重新定义了起始page,原先page里的内容仍然在屏幕芯片的显存里,所以仍然可以保持显示。
这一点上不能说你的用法是错误的,都能得到想要的显示结果,只能说是把两种定位方法混用了,多走了个曲线达到目的地。
比如
OLED_WR_Byte( 0xB3, CMD ); // 设置起始行
和
OLED_WR_Byte( 0x22, CMD ); // 设置page范围
OLED_WR_Byte( 0x03, CMD ); // 范围 0~7
OLED_WR_Byte( 0x03, CMD ); // 范围 0~7
OLED_WR_Byte( 0xB0, CMD ); // 设置起始行
定位效果是一样的,都是定位到了屏幕的第四个page上,只不过后者只能在第四行里进行显示,而前者如果在水平地址模式下,还可以继续向下面几行显示。
如果常用TFT彩屏,就会发现,TFT彩屏没有具体定位某个点的指令,用的就是类似0x21、0x22这种设置区域的方式。
================================================
下面是之前学习这两个指令的时候的笔记视频
以及设置区域之后,在水平地址模式下用DMA连续发送数据的效果的视频
===========================================
关于例程使用的时钟频率,因为整个程序本身就是按照24MHz进行配置的,还关系到很多其他功能,而且比24M所以略高一点可能不会有问题。但是硬件I2C最好还是根据实际需要进行配置。
前面我给的那个硬件I2C和DMA的视频连接,就是从0开始配置的过程。视频里用STC8H8K64U和AI8051U两种芯片,都按照40MHz进行配置的,都可以顺利运行。
分频数的问题,只要配置正确,对于SSD1306的屏幕,分频数用2也能正常显示,而SH1106之类屏幕,以及AT24C之类存储芯片,则必须用3以上才可以。
这一点在硬件I2C点亮OLED的帖子里也有提到:https://www.stcaimcu.com/thread-18224-1-1.html
===================================================
例程里地址模式的注释写错这一点,因为之前跟中景园版的驱动作者聊过,他自己说的写的时候就很随意,甚至还有一些笔误。比如显示汉字的函数OLED_ShowCHinese,H大写就是手误,不过后来就这么发布了,无伤大雅。
但是那个试验箱例程里,确实应该更严谨一些。因为错误的注释,会在参考学习的时候造成困扰。
所以我的视频里,是对每条指令都写了中文的注释,以及汉化了数据手册里所有指令部分。重写注释的过程也是学习的过程。
汉化过程中还发现,就连SSD1306的原版数据手册里,都有一些错误。
|
1
喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
-
+2
楼主威武~
|