找回密码
 立即注册
查看: 2519|回复: 8

0.96 OLED隔行不亮 | 已解决

[复制链接]

6

主题

54

回帖

434

积分

中级会员

积分
434
发表于 2024-9-28 20:26:17 | 显示全部楼层 |阅读模式
各位大佬,有没有遇到OLED 隔行不亮的问题,是我设置有问题,还是屏有问题?
1fcc8af5eac26bba5c83b8af88e887c.jpg
f5d7f22dbbd7d05d7353bc3589837c9.jpg
回复

使用道具 举报 送花

已绑定手机

52

主题

2858

回帖

3135

积分

荣誉版主

积分
3135
发表于 2024-9-28 21:03:50 | 显示全部楼层
一般来说是显示模式的问题,比如12864的屏用了12832的代码
~~~
回复

使用道具 举报 送花

已绑定手机

19

主题

1441

回帖

5685

积分

论坛元老

积分
5685
发表于 2024-9-28 21:19:16 | 显示全部楼层
代码贴出来看看
回复

使用道具 举报 送花

已绑定手机

96

主题

7378

回帖

1万

积分

超级版主

积分
14020
发表于 2024-9-28 22:06:14 | 显示全部楼层
一般OLED有个隔行逐行设置,必须和面板ITO走线匹配
回复

使用道具 举报 送花

已绑定手机

96

主题

7378

回帖

1万

积分

超级版主

积分
14020
发表于 2024-9-28 22:09:19 | 显示全部楼层
Debu*** 发表于 2024-9-28 22:06
一般OLED有个隔行逐行设置,必须和面板ITO走线匹配

截图202409282207375919.jpg

截图202409282208292025.jpg

截图202409282208449633.jpg

截图202409282208568979.jpg

截图202409282209084527.jpg

回复

使用道具 举报 送花

47

主题

589

回帖

5283

积分

荣誉版主

积分
5283
发表于 2024-9-30 10:52:24 | 显示全部楼层
本帖最后由 大明狐 于 2024-9-30 10:53 编辑

如果楼主使用的驱动程序是12832分辨率的屏幕的,就会出现这样的情况。
12832和12864屏幕的硬件结构不同。
在初始化的时候12832和12864的配置区别主要有两处:

1、屏幕硬件的行引脚的配置(指令0xDA)
  
DA
  
1
1
0
1
1
0
1
0
A[5:4]
0
0
A[5]
A[4]
0
0
1
0

其中第二字节是里的A[4]位产生这个影响的位。
A[4]的默认值1,也就是配置结果是0x12,是使用所有的64行;
当A[4]的值是0的时候,也就是配置结果是0x02,是使用所有偶数行(0、2、4、6……)。
所以如果初始化函数里的相关指令是
OLED_WR_Byte(0xDA, OLED_CMD);
OLED_WR_Byte(0x02, OLED_CMD);
那么在12864屏幕上就会出现这种隔行显示的问题,64行内容只有32行以这样的方式显示出来,其余32行则“显示”在了屏幕以外。

2、屏幕复用率的设置(指令0xA8)
  
A8
  
1
0
1
0
1
0
0
0
A[5:0]
*
*
A[5]
A[4]
A[3]
A[2]
A[1]
A[0]

其中A[5:0]这六个位,是设置使用屏幕行数的位。
A[5:0]的数值范围是0x0F~0x3F,也就是屏幕芯片支持最少使用行数是16行(0~15),最多使用64行(0~63)。
从楼主的屏幕显示结果来看,驱动程序里的这一项应该设置的是64行,或者使用的是没有配置这一项,屏幕使用的默认值0x3F
OLED_WR_Byte(0xA8, OLED_CMD);
OLED_WR_Byte(0x3F, OLED_CMD);
所以这一项可以不用考虑。
但是如果是比较严谨的12832的驱动程序,这一项会设置成0x1F,也就是只是用屏幕的32行,这样芯片就不会额外去扫描其余“不存在”的32行。
如果是这样,屏幕只会有一半显示,那么在使用12864屏幕的时候,这一条指令也需要修改成0x3F。

能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

6

主题

54

回帖

434

积分

中级会员

积分
434
 楼主| 发表于 2024-10-9 22:43:47 | 显示全部楼层
感谢,下面这两条指令居然都错了。已经解决问题了。
OLED_WR_Byte(0xDA, OLED_CMD);
OLED_WR_Byte(0x02, OLED_CMD);

OLED_WR_Byte(0xA8, OLED_CMD);
OLED_WR_Byte(0x3F, OLED_CMD);
回复

使用道具 举报 送花

2

主题

16

回帖

76

积分

注册会员

积分
76
发表于 2026-5-21 11:51:05
void OLED_initX(void) {                                                // STM32 战舰开发板
        delay_ms(300); // very important delay  
        OLED_writeByte(0xAE, OLED_CMD);                 //关闭显示

        OLED_writeByte(0xD5, OLED_CMD);                        //设置时钟分频因子,震荡频率
        OLED_writeByte(80,   OLED_CMD);                 //[3:0],分频因子;[7:4],震荡频率

        OLED_writeByte(0xA8, OLED_CMD);                        //设置驱动路数
        OLED_writeByte(0X3F, OLED_CMD);                        //默认0X3F(1/64)

//===================================
        OLED_writeByte(0xD3, OLED_CMD);                        //设置显示偏移
        OLED_writeByte(0X00, OLED_CMD);                        //默认为0
//===================================

        OLED_writeByte(0x40, OLED_CMD);                        //设置显示开始行 [5:0],行数                40~7F = 3F = 63

        OLED_writeByte(0x8D, OLED_CMD);                        //电荷泵设置
        OLED_writeByte(0x14, OLED_CMD);                        //bit2,开启/关闭

//===================================
        OLED_writeByte(0x20, OLED_CMD);                        //设置内存地址模式
        OLED_writeByte(0x02, OLED_CMD);                        //[1:0],        [00的话,即0,列地址模式;],[01的话,即1,行地址模式;],        [10的话,即2,页地址模式;默认10;]
//===================================

        OLED_writeByte(0xA1, OLED_CMD);                        //段重定义设置,bit0:                [0的话,0->0;]                        [1的话,0->127;]

        OLED_writeByte(0xC8, OLED_CMD);                        //设置COM扫描方向;bit3:                [0的话,普通模式;]                [1的话,重定义模式 COM[N-1]->COM0;N:驱动路数
//        OLED_writeByte(0xC0, OLED_CMD);                        //设置COM扫描方向;bit3:                [0的话,普通模式;]                [1的话,重定义模式 COM[N-1]->COM0;N:驱动路数

        OLED_writeByte(0xDA, OLED_CMD);                        //设置COM硬件引脚配置
        OLED_writeByte(0x12, OLED_CMD);                        //[5:4]配置
//        OLED_writeByte(0x22, OLED_CMD);                        // 或者试 0x22

        OLED_writeByte(0x81, OLED_CMD);                        //对比度设置
        OLED_writeByte(0xEF, OLED_CMD);                        //1~255;默认0X7F (亮度设置,越大越亮)        亮度设置

        OLED_writeByte(0xD9, OLED_CMD);                        //设置预充电周期
        OLED_writeByte(0xf1, OLED_CMD);                        //[3:0],PHASE1;                                [7:4],PHASE 2;
        OLED_writeByte(0xDB, OLED_CMD);                        //设置VCOMH 电压倍率
        OLED_writeByte(0x30, OLED_CMD);                        //[6:4] 000的话,0.65*vcc;        [001的话,0.77*vcc;]        011的话,0.83*vcc;

        OLED_writeByte(0xA4, OLED_CMD);                        //全局显示开启;bit0:        [1的话,开启;]                [0的话,关闭;(白屏/黑屏)]
        OLED_writeByte(0xA6, OLED_CMD);                        //设置显示方式;bit0:        [1的话,反相显示;]        [0的话,正常显示]
//        OLED_writeByte(0xA7, OLED_CMD);                        //设置显示方式;bit0:        [1的话,反相显示;]        [0的话,正常显示] very good!!!

        OLED_writeByte(0xAF, OLED_CMD);                        //开启显示
        delay_ms(100);
        OLED_clear();
}
为什么我的黄蓝双色 0.96寸的 OLED也是这个问题, 隔行显示, 困扰我好几天了,我按你上述进行修改后,还是这个问题,大佬们,帮我看一下怎么解决?谢谢啦

送花

2

主题

16

回帖

76

积分

注册会员

积分
76
发表于 2026-5-21 11:53:00 | 显示全部楼层
Debu*** 发表于 2024-9-28 22:06
一般OLED有个隔行逐行设置,必须和面板ITO走线匹配

void OLED_initX(void) {                                                // STM32 战舰开发板
        delay_ms(300); // very important delay  
        OLED_writeByte(0xAE, OLED_CMD);                 //关闭显示

        OLED_writeByte(0xD5, OLED_CMD);                        //设置时钟分频因子,震荡频率
        OLED_writeByte(80,   OLED_CMD);                 //[3:0],分频因子;[7:4],震荡频率

        OLED_writeByte(0xA8, OLED_CMD);                        //设置驱动路数
        OLED_writeByte(0X3F, OLED_CMD);                        //默认0X3F(1/64)

//===================================
        OLED_writeByte(0xD3, OLED_CMD);                        //设置显示偏移
        OLED_writeByte(0X00, OLED_CMD);                        //默认为0
//===================================

        OLED_writeByte(0x40, OLED_CMD);                        //设置显示开始行 [5:0],行数                40~7F = 3F = 63

        OLED_writeByte(0x8D, OLED_CMD);                        //电荷泵设置
        OLED_writeByte(0x14, OLED_CMD);                        //bit2,开启/关闭

//===================================
        OLED_writeByte(0x20, OLED_CMD);                        //设置内存地址模式
        OLED_writeByte(0x02, OLED_CMD);                        //[1:0],        [00的话,即0,列地址模式;],[01的话,即1,行地址模式;],        [10的话,即2,页地址模式;默认10;]
//===================================

        OLED_writeByte(0xA1, OLED_CMD);                        //段重定义设置,bit0:                [0的话,0->0;]                        [1的话,0->127;]

        OLED_writeByte(0xC8, OLED_CMD);                        //设置COM扫描方向;bit3:                [0的话,普通模式;]                [1的话,重定义模式 COM[N-1]->COM0;N:驱动路数
//        OLED_writeByte(0xC0, OLED_CMD);                        //设置COM扫描方向;bit3:                [0的话,普通模式;]                [1的话,重定义模式 COM[N-1]->COM0;N:驱动路数

        OLED_writeByte(0xDA, OLED_CMD);                        //设置COM硬件引脚配置
        OLED_writeByte(0x12, OLED_CMD);                        //[5:4]配置
//        OLED_writeByte(0x22, OLED_CMD);                        // 或者试 0x22

        OLED_writeByte(0x81, OLED_CMD);                        //对比度设置
        OLED_writeByte(0xEF, OLED_CMD);                        //1~255;默认0X7F (亮度设置,越大越亮)        亮度设置

        OLED_writeByte(0xD9, OLED_CMD);                        //设置预充电周期
        OLED_writeByte(0xf1, OLED_CMD);                        //[3:0],PHASE1;                                [7:4],PHASE 2;
        OLED_writeByte(0xDB, OLED_CMD);                        //设置VCOMH 电压倍率
        OLED_writeByte(0x30, OLED_CMD);                        //[6:4] 000的话,0.65*vcc;        [001的话,0.77*vcc;]        011的话,0.83*vcc;

        OLED_writeByte(0xA4, OLED_CMD);                        //全局显示开启;bit0:        [1的话,开启;]                [0的话,关闭;(白屏/黑屏)]
        OLED_writeByte(0xA6, OLED_CMD);                        //设置显示方式;bit0:        [1的话,反相显示;]        [0的话,正常显示]
//        OLED_writeByte(0xA7, OLED_CMD);                        //设置显示方式;bit0:        [1的话,反相显示;]        [0的话,正常显示] very good!!!

        OLED_writeByte(0xAF, OLED_CMD);                        //开启显示
        delay_ms(100);
        OLED_clear();
}
大佬,看看的我代码, 还是 隔行显示, 困扰我好几天了,还是没没解决!
回复

使用道具 举报 送花

2

主题

16

回帖

76

积分

注册会员

积分
76
发表于 2026-6-8 11:00:34 | 显示全部楼层
原来是 OLED屏幕左下角裂开了! 没想到是硬件的问题!
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-9-19 21:11 , Processed in 0.074356 second(s), 97 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表