SSD1306与SH1106的区别

首先,参考这位的说法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);
      
  • 12
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值