文章讨论了SH1106和SSD1306驱动芯片在用于128*64像素屏幕时的细微差别,主要在于SH1106存在2列像素点的偏移。作者指出,尽管两者在使用上通常被认为相同,但在初始化和坐标设置的代码中需要调整,特别是设置起始列地址时需要加上2,以适应SH1106的特性。文中提供了需要修改的代码示例。
首先,参考这篇文章说法https://www.cdsy.xyz/electronic/ped/250809/cd74530.html
认为SH1106与SSD1306在除了初始化的地方以外,其余无区别。
不同的地方仅在于此:
SH1106:
Write_Command(0x02);//起始列低地址(0x00-0x0F)
Write_Command(0x10);//起始列高地址(0X00-0x1F)
SSD1106:
Write_Command(0x00);
Write_Command(0x10);
在坐标设置代码中,((x&0xf0)>>4)|0x10设置了起始列地址高位,(x&0x0f)设置了起始列地址低位,这个实际上就是上面的初始化代码中设置起始列地址的,所以说,除非仅在初始化代码中设置起始列地址,负责,这部分代码加到初始化代码中毫无意义。
由先前的推论可知,像素点列偏移2,那么对应的就是起始列地址加2,也就是起始列低地址低位加2
OLED_WR_Byte((x&0x0f),OLED_CMD);应该变为 OLED_WR_Byte((x&0x0f)+0x02,OLED_CMD);才正确
所以对于这段代码,是需要进行修改的
void OLED_Set_Pos(unsigned char x, unsigned char y)
{
OLED_WR_Byte(0xb0+y,OLED_CMD);
OLED_WR_Byte(((x&0xf0)>>4)|0x10,OLED_CMD);//设置了起始列地址高位
OLED_WR_Byte((x&0x0f),OLED_CMD); //设置了起始列地址低位 //应该修改为 OLED_WR_Byte((x&0x0f)+0x02,OLED_CMD);
}
同样的,所有设置起始列地址处,都需要进行此项修改,参考这位的代码,就是:
void OLED_Set_Pos(unsigned char x, unsigned char y)函数 的OLED_WR_Byte((x&0x0f),OLED_CMD);应该变为 OLED_WR_Byte((x&0x0f)+0x02,OLED_CMD);才正确
void OLED_Clear(void) 函数的OLED_WR_Byte (0x00,OLED_CMD);应该变为OLED_WR_Byte (0x00+0x02,OLED_CMD);

