📄 i2c.c
字号:
#include <reg52.h>
#include <INTRINS.H>
#include "i2c.h"
void I2CSomeNOP(void)
{
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();
}
void I2CStart(void)
{
EA=0;
I2CSDA=1; I2CSCL=1; I2CSomeNOP();//INI
I2CSDA=0; I2CSomeNOP(); //START
I2CSCL=0;
}
void I2CStop(void)
{
I2CSCL=0; I2CSDA=0; I2CSomeNOP(); //INI
I2CSCL=1; I2CSomeNOP(); I2CSDA=1; //STOP
EA=1;
}
bit I2CWaitAck(void)
{
unsigned char errtime=255;//因故障接收方无ACK,超时值为255。
I2CSDA=1;I2CSomeNOP();
I2CSCL=1;I2CSomeNOP();
while(I2CSDA) {errtime--; if (!errtime) {I2CStop();return false;}}
I2CSCL=0;
return true;
}
void I2CSendAck(void)
{
I2CSDA=0; I2CSomeNOP();
I2CSCL=1; I2CSomeNOP();
I2CSCL=0;
}
void I2CSendNotAck(void)
{
I2CSDA=1; I2CSomeNOP();
I2CSCL=1; I2CSomeNOP();
I2CSCL=0;
}
void I2CSendByte(unsigned char ch)
{
unsigned char i=8;
while (i--)
{
I2CSCL=0;_nop_();
I2CSDA=(bit)(ch&0x80); ch<<=1; I2CSomeNOP();
I2CSCL=1; I2CSomeNOP();
}
I2CSCL=0;
}
unsigned char I2CReceiveByte(void)
{
unsigned char i=8;
unsigned char ddata=0;
I2CSDA=1;
while (i--)
{
ddata<<=1;
I2CSCL=0;I2CSomeNOP();
I2CSCL=1;I2CSomeNOP();
ddata|=I2CSDA;
}
I2CSCL=0;
return ddata;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -