[PIC®/AVR®/dsPIC®产品] IO模拟I2C用于SSD1306的OLED驱动的底层函数详解

[复制链接]
2943|16
 楼主| gaoyang9992006 发表于 2023-5-25 20:52 | 显示全部楼层 |阅读模式
  1. /**********************************************
  2. //IIC Start
  3. 时钟信号在高电平状态时候在数据线产生一个下降沿
  4. **********************************************/
  5. void IIC_Start()
  6. {
  7.         OLED_SCLK_Set() ;
  8.         OLED_SDIN_Set();
  9.         OLED_SDIN_Clr();
  10. }

  11. /**********************************************
  12. //IIC Stop
  13. 时钟信号在高电平状态时候在数据线产生一个上升沿
  14. **********************************************/
  15. void IIC_Stop()
  16. {
  17.         OLED_SCLK_Set();
  18.         OLED_SDIN_Clr();
  19.         OLED_SDIN_Set();       
  20. }
  21. //这里就是跳过这个时钟周期,没有去读数据位有没有回来应答信号。
  22. void IIC_Wait_Ack()
  23. {
  24.         OLED_SCLK_Set();
  25.         OLED_SCLK_Clr();
  26. }
  27. /**********************************************
  28. // IIC Write byte
  29. 在时钟线为低电平的时候在数据线发送数据位,高位在前
  30. 在完成数据发送后要保持数据线为低电平
  31. **********************************************/

  32. void Write_IIC_Byte(unsigned char IIC_Byte)
  33. {
  34.         unsigned char i;
  35.         unsigned char m,da;
  36.         da=IIC_Byte;

  37.         for(i=0;i<8;i++)               
  38.         {
  39.                 m=da;
  40.                 OLED_SCLK_Clr();
  41.                 m=m&0x80;
  42.                
  43.                 if(m==0x80)
  44.                         OLED_SDIN_Set();
  45.                 else
  46.                         OLED_SDIN_Clr();

  47.                 da=da<<1;

  48.                 OLED_SCLK_Set();
  49.                 }
  50.         OLED_SCLK_Clr();
  51. }
  52. /**********************************************
  53. // IIC Write Command
  54. 开始信号
  55. 前8位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0
  56. 第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
  57. 接下已一个字节发送0x00表示后面要写命令
  58. 接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
  59. 后面开始写入的数据作为命令,即将命令字节装载到这个发送字节的函数里发送出去
  60. 然后又是一个应答位,跳过一个时钟信号
  61. 之后发送停止指令。
  62. **********************************************/
  63. void Write_IIC_Command(unsigned char IIC_Command)
  64. {
  65.         IIC_Start();
  66.         Write_IIC_Byte(0x78);            //Slave address,SA0=0
  67.         IIC_Wait_Ack();       
  68.         Write_IIC_Byte(0x00);                        //write command
  69.         IIC_Wait_Ack();       
  70.         Write_IIC_Byte(IIC_Command);
  71.         IIC_Wait_Ack();       
  72.         IIC_Stop();
  73. }
  74. /**********************************************
  75. // IIC Write Data
  76. 开始信号
  77. 前八位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0
  78. 第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
  79. 接下已一个字节发送0x40表示后面要写的是数据
  80. 接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟)
  81. 后面开始写入的数据作为数据,即将数据字节装载到这个发送字节的函数里发送出去
  82. 然后又是一个应答位,跳过一个时钟信号
  83. 之后发送停止指令。
  84. **********************************************/
  85. void Write_IIC_Data(unsigned char IIC_Data)
  86. {
  87.         IIC_Start();
  88.         Write_IIC_Byte(0x78);                        //D/C#=0; R/W#=0
  89.         IIC_Wait_Ack();       
  90.         Write_IIC_Byte(0x40);                        //write data
  91.         IIC_Wait_Ack();       
  92.         Write_IIC_Byte(IIC_Data);
  93.         IIC_Wait_Ack();       
  94.         IIC_Stop();
  95. }
  96. void OLED_WR_Byte(unsigned dat,unsigned cmd)
  97. {
  98.         if(cmd)
  99.         {
  100.                 Write_IIC_Data(dat);
  101.         }
  102.         else
  103.         {
  104.                 Write_IIC_Command(dat);
  105.         }
  106. }
看过了微芯大学课程中I2C的部分,然后对之前用过的这个IO模拟I2C驱动OLED的底层函数进行了优化和注释,删除了多余的操作指令。
这个注释可以让你清楚的看明白,什么是起始信号,结束信号,应答信号,以及信息通过I2C传递的顺序。

打赏榜单

zhuomuniao110 打赏了 5.00 元 2023-07-28
理由:底层函数决定上层操作

chenci2013 发表于 2023-6-6 12:27 | 显示全部楼层
ssd1305和ssd1306驱动有什么不同?
jonas222 发表于 2023-6-6 13:07 | 显示全部楼层
ssd1306spi改i2c程序怎么改
sheflynn 发表于 2023-6-6 13:36 | 显示全部楼层
ssd1306和sh1106的区别是什么
abotomson 发表于 2023-6-6 13:44 | 显示全部楼层
SSD1306库驱动OLED?              
 楼主| gaoyang9992006 发表于 2023-6-6 14:45 | 显示全部楼层
jonas222 发表于 2023-6-6 13:07
ssd1306spi改i2c程序怎么改

直接换接口程序。
 楼主| gaoyang9992006 发表于 2023-6-6 14:45 | 显示全部楼层
sheflynn 发表于 2023-6-6 13:36
ssd1306和sh1106的区别是什么

应该区别不大。
 楼主| gaoyang9992006 发表于 2023-6-6 14:45 | 显示全部楼层
abotomson 发表于 2023-6-6 13:44
SSD1306库驱动OLED?

是的,就是这个。
xiaoyaodz 发表于 2023-6-6 15:10 | 显示全部楼层
0.96 oled的 spi i2c 哪个好
pixhw 发表于 2023-6-6 15:24 | 显示全部楼层
如何才能在液晶屏上让数字左右移动
loutin 发表于 2023-6-6 17:48 | 显示全部楼层
OLED屏SSD1306驱动要怎么修改以驱动SSD1322
 楼主| gaoyang9992006 发表于 2023-6-6 20:59 | 显示全部楼层
loutin 发表于 2023-6-6 17:48
OLED屏SSD1306驱动要怎么修改以驱动SSD1322

那个是1315吧?
pl202 发表于 2023-6-10 11:33 | 显示全部楼层
oled画线怎么改变线宽              
 楼主| gaoyang9992006 发表于 2023-6-10 13:24 | 显示全部楼层
pl202 发表于 2023-6-10 11:33
oled画线怎么改变线宽

你只需要把1个像素点改成2*2个像素点来绘制曲线就可以改变线宽了,同理,你可以改成3*3作为一个像素操作点。
earlmax 发表于 2023-6-10 16:05 | 显示全部楼层
如何将0.96寸oled 改为i2c接线 ?
maudlu 发表于 2023-6-10 16:42 | 显示全部楼层
驱动oled如何实现反色显示表示选中功能
elsaflower 发表于 2023-6-10 17:35 | 显示全部楼层
i2c接口的oled怎么驱动               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2052

主题

16403

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部