I2C总线之(三)---以C语言理解IIC
为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:
本文引用地址:https://www.eepw.com.cn/article/201612/330880.htm如下图所示的写操作的时序图:
读时序的理解同理。对于时序不理解的朋友请参考“I2C总线之(二)---时序”
完整的程序如下:

#include#define uchar unsigned char#define uint unsigned int#define write_ADD 0xa0#define read_ADD 0xa1uchar a; sbit SDA=P2^0;sbit SCL=P2^1;void SomeNop(); //短延时void init(); //初始化void check_ACK(void);void I2CStart(void);void I2cStop(void);void write_byte(uchar dat);//写字节void delay(uint z);uchar read_byte(); //读字节void write(uchar addr,uchar dat); //指定地址写uchar read(uchar addr); //指定地址读bit flag; //应答标志位void main(){init();write_add(5,0xaa); //向地址5写入0xaadelay(10); //延时,否则被坑呀!!!P1=read_add(5); //读取地址5的值while(1); }//*************************************************************************** void delay()//简单延时函数 { ;; } //*************************************************************************** void start() //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号 { sda=1; //释放SDA总线 delay(); scl=1; delay(); sda=0; delay(); } //*************************************************************************** void stop() //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号 { sda=0; delay(); scl=1; delay(); sda=1; delay(); }//*************************************************************************** void respons() //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答 { uchar i; scl=1; delay(); //至多等待250个CPU时钟周期 while((sda==1)&&(i<250))i++; scl=0; delay(); } //***************************************************************************
关键词:
I2C总线C语
评论