IIC的起始条件为:在SCL高电平期间SDA由高电平变为低电平。 代码如下:
void IIC_Start(void) { IIC_SCL=1; IIC_SDA=1; delay(); IIC_SDA=0; delay(); IIC_SCL=0; }IIC的停止条件为:SCL高电平期间SDA由低电平变为高电平。 代码如下:
void IIC_Stop(void) { IIC_SCL=1; delay(); IIC_SDA=0; delay(); IIC_SDA=1; }代码如下:
void PUT_ACK(unsigned char ACK) { IIC_SCL=0; if(ACK) IIC_SDA=1; //非应答 else IIC_SDA=0; //应答 delay(); IIC_SCL=1; delay(); IIC_SCL=0; }代码如下:
unsigned char GET_ACK(void) { unsigned char ACK; IIC_SCL=0; delay(); IIC_SDA=1; //开漏输出 delay(); IIC_SCL=1; if(Read_SDA) ACK=1; //非应答 else ACK=0; //应答 delay(); IIC_SCL=0; return ACK; }代码如下:
void IIC_Write_byte(unsigned char data) { unsigned char i; for(i=0;i<8;i++) { IIC_SCL=0; if(data&0x80) IIC_SDA=1; else IIC_SDA=0; data<<=1; delay(); IIC_SCL=1; delay(); } IIC_SCL=0; delay(); GET_ACK(); }代码如下:
unsigned char IIC_Read_byte(void) { unsigned char i,data=0; IIC_SCL=0; delay(); IIC_SDA=1; delay(); for(i=0;i<8;i++) { IIC_SCL=1; data<<=1; if(Read_SDA) data|=0x01; else data&=0xfe; delay(); IIC_SCL=0; } PUT_ACK(ACK); return data; }