0.96 OLED隔行不亮 | 已解决
各位大佬,有没有遇到OLED 隔行不亮的问题,是我设置有问题,还是屏有问题? 一般来说是显示模式的问题,比如12864的屏用了12832的代码 代码贴出来看看 一般OLED有个隔行逐行设置,必须和面板ITO走线匹配 DebugLab 发表于 2024-9-28 22:06一般OLED有个隔行逐行设置,必须和面板ITO走线匹配
本帖最后由 大明狐 于 2024-9-30 10:53 编辑
如果楼主使用的驱动程序是12832分辨率的屏幕的,就会出现这样的情况。
12832和12864屏幕的硬件结构不同。
在初始化的时候12832和12864的配置区别主要有两处:
1、屏幕硬件的行引脚的配置(指令0xDA)
DA11011010
A00AA0010
其中第二字节是里的A位产生这个影响的位。
A的默认值1,也就是配置结果是0x12,是使用所有的64行;
当A的值是0的时候,也就是配置结果是0x02,是使用所有偶数行(0、2、4、6……)。
所以如果初始化函数里的相关指令是
OLED_WR_Byte(0xDA, OLED_CMD);
OLED_WR_Byte(0x02, OLED_CMD);
那么在12864屏幕上就会出现这种隔行显示的问题,64行内容只有32行以这样的方式显示出来,其余32行则“显示”在了屏幕以外。
2、屏幕复用率的设置(指令0xA8)
A810101000
A**AAAAAA
其中A这六个位,是设置使用屏幕行数的位。
A的数值范围是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。
感谢,下面这两条指令居然都错了。已经解决问题了。
OLED_WR_Byte(0xDA, OLED_CMD);
OLED_WR_Byte(0x02, OLED_CMD);
OLED_WR_Byte(0xA8, OLED_CMD);
OLED_WR_Byte(0x3F, OLED_CMD); 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); //,分频因子;,震荡频率
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); //设置显示开始行 ,行数 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); //, ,,
//===================================
OLED_writeByte(0xA1, OLED_CMD); //段重定义设置,bit0:
OLED_writeByte(0xC8, OLED_CMD); //设置COM扫描方向;bit3: ->COM0;N:驱动路数
// OLED_writeByte(0xC0, OLED_CMD); //设置COM扫描方向;bit3: ->COM0;N:驱动路数
OLED_writeByte(0xDA, OLED_CMD); //设置COM硬件引脚配置
OLED_writeByte(0x12, OLED_CMD); //配置
// 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); //,PHASE1; ,PHASE 2;
OLED_writeByte(0xDB, OLED_CMD); //设置VCOMH 电压倍率
OLED_writeByte(0x30, OLED_CMD); // 000的话,0.65*vcc; 011的话,0.83*vcc;
OLED_writeByte(0xA4, OLED_CMD); //全局显示开启;bit0:
OLED_writeByte(0xA6, OLED_CMD); //设置显示方式;bit0:
// OLED_writeByte(0xA7, OLED_CMD); //设置显示方式;bit0: very good!!!
OLED_writeByte(0xAF, OLED_CMD); //开启显示
delay_ms(100);
OLED_clear();
}
为什么我的黄蓝双色 0.96寸的 OLED也是这个问题, 隔行显示, 困扰我好几天了,我按你上述进行修改后,还是这个问题,大佬们,帮我看一下怎么解决?谢谢啦 DebugLab 发表于 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); //,分频因子;,震荡频率
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); //设置显示开始行 ,行数 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); //, ,,
//===================================
OLED_writeByte(0xA1, OLED_CMD); //段重定义设置,bit0:
OLED_writeByte(0xC8, OLED_CMD); //设置COM扫描方向;bit3: ->COM0;N:驱动路数
// OLED_writeByte(0xC0, OLED_CMD); //设置COM扫描方向;bit3: ->COM0;N:驱动路数
OLED_writeByte(0xDA, OLED_CMD); //设置COM硬件引脚配置
OLED_writeByte(0x12, OLED_CMD); //配置
// 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); //,PHASE1; ,PHASE 2;
OLED_writeByte(0xDB, OLED_CMD); //设置VCOMH 电压倍率
OLED_writeByte(0x30, OLED_CMD); // 000的话,0.65*vcc; 011的话,0.83*vcc;
OLED_writeByte(0xA4, OLED_CMD); //全局显示开启;bit0:
OLED_writeByte(0xA6, OLED_CMD); //设置显示方式;bit0:
// OLED_writeByte(0xA7, OLED_CMD); //设置显示方式;bit0: very good!!!
OLED_writeByte(0xAF, OLED_CMD); //开启显示
delay_ms(100);
OLED_clear();
}
大佬,看看的我代码, 还是 隔行显示, 困扰我好几天了,还是没没解决! 原来是 OLED屏幕左下角裂开了! 没想到是硬件的问题!
页:
[1]