首先,参考这位的说法https://blog.csdn.net/weixin_42150905/article/details/117511216
他认为SH1106与SSD1306在除了初始化的地方以外,其余无区别。
-
我经过研究发现:
- SH1106与SSD1306没有任何区别,初始化的地方也没有区别。
-
那为什么SH1106与SSD1306使用时会有不同?
- SSD1306可以驱动128*64个像素点,SH1106可以驱动132*64个像素点
- 而它们一般都用于驱动128*64的屏幕,这时候SH1106就会左右各有2*64的可驱动像素点闲置,不会显示在屏幕上,
- 所以SSD1306驱动芯片的(0,0),(127,63)像素点对应于屏幕的(0,0),(127,63)像素点,而SH1106驱动芯片的(2,0),(129,63)像素点对应于屏幕的(0,0),(127,63)像素点,我称其为像素点列偏移2
-
因此你参考那位的初始化代码和正常的初始化代码,可以发现:
不同的地方仅在于此: SH1106: Write_Command(0x02);//起始列低地址(0x00-0x0F) Write_Command(0x10);//起始列高地址(0X00-0x1F) SSD1106: Write_Command(0x00); Write_Command(0x10);
-
而实际上因此要修改的地方不止于初始化代码,借这位的代码做一下演示https://blog.csdn.net/xiaolinjieya/article/details/113529376
-
在坐标设置代码中,((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);
-