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的定义关闭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发送应答信号,这时候如果SDA没有拉低电平就未应答
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)//要发送的数据
{
unsigned char i,data;
data=I2C_Byte;
Dur_SDA_OUT();
Dur_SCL_OUT();
Dur_SCL_Reset();
for(i=0;i<8;i++)
{
if((data<标签: