b站上5529視頻幾乎沒有iic的,雖然這玩意兒是通用的,但一開始總會繞點彎路,比如時鐘配置不對啊什么的。這幾天在用也寫了一個。
/*Endurdur*/
#include
#define Dur_SCL_Reset() P8OUT &= ~BIT1?//SCL P8.1
#define Dur_SCL_Set() P8OUT |= BIT1
#define Dur_SCL_IN()?P8DIR&=~BIT1
#define Dur_SCL_OUT()?P8DIR|=BIT1
#define Dur_SDA_Reset() P8OUT &= ~BIT2 //SDA P8.2 要改用ctrl+F替換
#define Dur_SDA_Set() P8OUT |= BIT2
#define Dur_SDA_IN()?P8DIR&=~BIT2
#define Dur_SDA_OUT()?P8DIR|=BIT2
void I2C_Start()
{
??Dur_SCL_OUT();
??Dur_SDA_OUT();
??Dur_SCL_Set();
??Dur_SDA_Set();
??__delay_cycles(10);
??Dur_SDA_Reset();
??__delay_cycles(10);
??Dur_SCL_Reset();
}//依照I2C的定義啟動I2C
void I2C_Stop()
{
??Dur_SDA_OUT();
??Dur_SCL_OUT();
??Dur_SDA_Reset();
??Dur_SCL_Set() ;
??__delay_cycles(10);
??Dur_SDA_Set();
??__delay_cycles(10);
}//按照IIC的定義關(guān)閉IIC
void I2C_Ack(unsigned char ack)
{
??Dur_SDA_OUT();
??Dur_SCL_OUT();
??if(ack==1)
??{
????Dur_SDA_Set();
??}
??else if(ack==0)
??{
????Dur_SDA_Reset();
??}
??else
????return;
??Dur_SCL_Set() ;
??__delay_cycles(10);
??Dur_SCL_Reset();
??__delay_cycles(10);
}//SCL發(fā)送應(yīng)答信號,這時候如果SDA沒有拉低電平就未應(yīng)答
unsigned char I2C_testAck()
{
??unsigned char c=0;
??Dur_SCL_OUT();
??Dur_SDA_IN();
??Dur_SCL_Set();
??__delay_cycles(10);
??Dur_SCL_Reset();
??__delay_cycles(10);
??Dur_SDA_Set();
??return c;
}
void I2C_Write(unsigned char I2C_Byte)//要發(fā)送的數(shù)據(jù)
{
????unsigned char i,data;
????data=I2C_Byte;
????Dur_SDA_OUT();
????Dur_SCL_OUT();
Dur_SCL_Reset();
????for(i=0;i<8;i++)
????{
??????if((data<標(biāo)簽: