/********************************************** //IIC Start 时钟信号在高电平状态时候在数据线产生一个下降沿 **********************************************/ void IIC_Start() { OLED_SCLK_Set() ; OLED_SDIN_Set(); OLED_SDIN_Clr(); } /********************************************** //IIC Stop 时钟信号在高电平状态时候在数据线产生一个上升沿 **********************************************/ void IIC_Stop() { OLED_SCLK_Set(); OLED_SDIN_Clr(); OLED_SDIN_Set(); } //这里就是跳过这个时钟周期,没有去读数据位有没有回来应答信号。 void IIC_Wait_Ack() { OLED_SCLK_Set(); OLED_SCLK_Clr(); } /********************************************** // IIC Write byte 在时钟线为低电平的时候在数据线发送数据位,高位在前 在完成数据发送后要保持数据线为低电平 **********************************************/ void Write_IIC_Byte(unsigned char IIC_Byte) { unsigned char i; unsigned char m,da; da=IIC_Byte; for(i=0;i<8;i++) { m=da; OLED_SCLK_Clr(); m=m&0x80; if(m==0x80) OLED_SDIN_Set(); else OLED_SDIN_Clr(); da=da<<1; OLED_SCLK_Set(); } OLED_SCLK_Clr(); } /********************************************** // IIC Write Command 开始信号 前8位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0 第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟) 接下已一个字节发送0x00表示后面要写命令 接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟) 后面开始写入的数据作为命令,即将命令字节装载到这个发送字节的函数里发送出去 然后又是一个应答位,跳过一个时钟信号 之后发送停止指令。 **********************************************/ void Write_IIC_Command(unsigned char IIC_Command) { IIC_Start(); Write_IIC_Byte(0x78); //Slave address,SA0=0 IIC_Wait_Ack(); Write_IIC_Byte(0x00); //write command IIC_Wait_Ack(); Write_IIC_Byte(IIC_Command); IIC_Wait_Ack(); IIC_Stop(); } /********************************************** // IIC Write Data 开始信号 前八位为:写7位地址,高位在前,并跟随1个读写位0,表示写入:0111 100 0 第9位应答,这里就是跳过一个时钟信号(拉高时钟,拉低时钟) 接下已一个字节发送0x40表示后面要写的是数据 接下来应答位,这里就是跳过一个时钟信号(拉高时钟,拉低时钟) 后面开始写入的数据作为数据,即将数据字节装载到这个发送字节的函数里发送出去 然后又是一个应答位,跳过一个时钟信号 之后发送停止指令。 **********************************************/ void Write_IIC_Data(unsigned char IIC_Data) { IIC_Start(); Write_IIC_Byte(0x78); //D/C#=0; R/W#=0 IIC_Wait_Ack(); Write_IIC_Byte(0x40); //write data IIC_Wait_Ack(); Write_IIC_Byte(IIC_Data); IIC_Wait_Ack(); IIC_Stop(); } void OLED_WR_Byte(unsigned dat,unsigned cmd) { if(cmd) { Write_IIC_Data(dat); } else { Write_IIC_Command(dat); } }看过了微芯大学课程中I2C的部分,然后对之前用过的这个IO模拟I2C驱动OLED的底层函数进行了优化和注释,删除了多余的操作指令。 这个注释可以让你清楚的看明白,什么是起始信号,结束信号,应答信号,以及信息通过I2C传递的顺序。
收藏0 举报
zhuomuniao110 打赏了 5.00 元 2023-07-28 理由:底层函数决定上层操作
jonas222 发表于 2023-6-6 13:07 ssd1306spi改i2c程序怎么改
sheflynn 发表于 2023-6-6 13:36 ssd1306和sh1106的区别是什么
abotomson 发表于 2023-6-6 13:44 SSD1306库驱动OLED?
loutin 发表于 2023-6-6 17:48 OLED屏SSD1306驱动要怎么修改以驱动SSD1322
pl202 发表于 2023-6-10 11:33 oled画线怎么改变线宽
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
等级类勋章
发帖类勋章
时间类勋章
人才类勋章
2052
16403
222
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号