📄 i2c.h
字号:
//===================================================
// I2C协议脚位定义(用于80110H)
//===================================================
sbit P_SDA = P3^7;
sbit P_SCL = P3^6;
//===================================================
// I2C延时
//===================================================
void I2cDelay()
{
BYTE j;
for(j = 0; j < 50; j++)
{
// 延时够用就行 NOP;
}
}
//===================================================
// I2c开始
//===================================================
void I2cStart()
{
P_SDA = 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
P_SDA = 0;
I2cDelay();
P_SCL = 0;
I2cDelay();
}
//===================================================
// I2c停止
//===================================================
void I2cStop()
{
P_SDA = 0;
I2cDelay();
P_SCL = 1;
I2cDelay();
P_SDA = 1;
I2cDelay();
}
//===================================================
// I2c读应答
//===================================================
BYTE I2cGetAck()
{
BYTE iAck = 0;
I2cDelay();
P_SDA = 1;
P_SCL = 1;
I2cDelay();
if(!P_SDA)
iAck = 1;
else
iAck = 0;
I2cDelay();
P_SCL = 0;
I2cDelay();
return iAck;
}
//===================================================
// I2c写应答
//===================================================
void I2cSetAck()
{
P_SDA = 0;
I2cDelay();
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
}
//===================================================
// I2c写入一个字节
//===================================================
void I2cWriteByte(BYTE nData)
{
char i;
for(i = 0;i < 8;i ++)
{
if(nData & 0x80)
{
P_SDA = 1;
}
else
{
P_SDA = 0;
}
I2cDelay();
nData <<= 1;
P_SCL = 1;
I2cDelay();
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
}
//===================================================
// I2c读取一个字节
//===================================================
BYTE I2cReadByte()
{
BYTE nData = 0;
char i;
for(i = 0;i < 8;i ++)
{
nData <<= 1;
I2cDelay();
P_SCL = 1;
I2cDelay();
if(P_SDA)
{
nData |= 1;
}
else
{
nData &= 0xfe;
}
I2cDelay();
P_SCL = 0;
I2cDelay();
}
I2cDelay();
return nData;
}
#if 0
//===================================================
// 写I2C设备,DEV器件地址,ADDR片内地址,DATA数据
//===================================================
#define I2C_ERROR 0x100
int I2cWrite(BYTE DEV,BYTE ADDR,BYTE DATA)
{
BYTE iAck = 0;
I2cStart();
I2cWriteByte(DEV);
iAck = I2cGetAck();
if(!iAck)
return I2C_ERROR + 1;
I2cWriteByte(ADDR);
iAck = I2cGetAck();
if(!iAck)
return I2C_ERROR + 2;
I2cWriteByte(DATA);
iAck = I2cGetAck();
if(!iAck)
return I2C_ERROR + 3;
I2cStop();
return DATA;
}
//===================================================
// 读I2C设备
//===================================================
int I2cRead(BYTE DEV,BYTE ADDR)
{
BYTE nData = 0;
BYTE iAck = 0;
I2cStart();
I2cWriteByte(DEV);
iAck = I2cGetAck();
if(!iAck)
return I2C_ERROR + 0x11;
I2cWriteByte(ADDR);
iAck = I2cGetAck();
if(!iAck)
return I2C_ERROR + 0x12;
I2cStart();
I2cWriteByte(DEV | 0x01);
iAck = I2cGetAck();
if(!iAck)
return I2C_ERROR + 0x13;
nData = I2cReadByte();
I2cSetAck();
I2cStop();
return nData;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -