📄 i2c.h
字号:
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P1^4;
sbit SDA=P1^5;
/***********************************************
**函数名称:I2C_Start()
**函数功能:发送起始条件
**入口参数:无
**出口参数:无
**说明 :时序按照标准模式建立
***********************************************/
void I2C_Start()
{
SDA=1;
_nop_();//数据建立时间大于250ns
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=0;
_nop_();
_nop_();
SCL=0; //SCL高电平时间大于4us,嵌住时钟总线
}
/***********************************************
**函数名称:I2C_Stop()
**函数功能:发送停止条件
**入口参数:无
**出口参数:无
**说明 :时序按照标准模式建立
***********************************************/
void I2C_Stop()
{
SDA=0;
_nop_();//数据建立时间大于250ns
SCL=1;
_nop_();
_nop_();
_nop_();
SDA=1;
_nop_();
_nop_();
SCL=0; //SCL高电平时间大于4us,嵌住时钟总线
}
/***********************************************
**函数名称:I2C_SendByte()
**函数功能:发送一个字节
**入口参数:待发送字节n
**出口参数:无
**说明 :时序按照标准模式建立
***********************************************/
void I2C_SendByte(char n)
{
uchar i;
for(i=7;i>=0;i--)
{
SDA=n>>i;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
}
/***********************************************
**函数名称:I2C_RecByte()
**函数功能:接收一个字节
**入口参数:无
**出口参数:已接收字节
**说明 :时序按照标准模式建立
***********************************************/
I2C_RecByte(void)
{
uchar i;
for(i=7;i>=0;i--)
{
i<<=1;
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
return (i);
}
/***********************************************
**函数名称:Check_Ack()
**函数功能:检测从机响应
**入口参数:无
**出口参数:从机响应则为'1',否则为'0'
**说明 :时序按照标准模式建立
***********************************************/
Check_Ack()
{
uchar i=1;
SDA=1;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
i=SDA;
_nop_();
SCL=0;
return (i);
}
/***********************************************
**函数名称:Gen_Ack()
**函数功能:产生应答
**入口参数:i
**出口参数:无
**说明 :i=1产生应答,i=0产生非应答
***********************************************/
Gen_Ack(uchar i)
{
SDA=i;
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
}
/***********************************************
**函数名称:I2C_SendNByte()
**函数功能:发送N个字节
**入口参数:字节个数n,待发送数据队列首地址
**出口参数:无
**说明 :时序按照标准模式建立
***********************************************/
void I2C_SendNByte(uchar n,*p)
{
while(--n)
{
send:I2C_SendByte(*p);
if(Check_ACK) goto send;
p++;
}
}
/***********************************************
**函数名称:I2C_RecNByte()
**函数功能:接收N个字节
**入口参数:字节个数n,存放数据队列首地址
**出口参数:无
**说明 :时序按照标准模式建立
***********************************************/
void I2C_RecNByte(uchar n,*p)
{
while(--n)
{
*p=I2C_RecByte();
Gen_Ack(!!(n-1));//用!使得n-1只有1和0两种结果
p++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -