📄 i2c_drv.c
字号:
//***********************************************************************************************************************
// *FileName: I2C_DRV.c
// *Filedis: PCF8562 Driver
// *Author: Meijjun Wang,ShangHai,China
// *E-MAIL: Jimmy416@163.com
//***********************************************************************************************************************
#include "includes.h"
sbit SCL = P3^6;
sbit SDA = P3^7;
#define SomeNOP(); _nop_();_nop_();_nop_();_nop_();_nop_();
void I2CStart(void)
{
SDA=1; SCL=1; SomeNOP();
SDA=0; SomeNOP();
SCL=0;
}
void I2CStop(void)
{
SCL=0; SDA=0; SomeNOP();
SCL=1; SomeNOP(); SDA=1;
}
bit WaitAck(void)
{
U8 errtime=255;
SDA=1;SomeNOP();
SCL=1;SomeNOP();
while(SDA) {errtime--; if (!errtime) {I2CStop();return 0;}}
SCL=0;
return 1;
}
void SendAck(void)
{
SDA=0; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
void SendNotAck(void)
{
SDA=1; SomeNOP();
SCL=1; SomeNOP();
SCL=0;
}
void I2CSendByte(U8 ch)
{
U8 i=8;
while (i--)
{
SCL=0;_nop_();
SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
SCL=1; SomeNOP();
}
SCL=0;
}
U8 I2CReceiveByte(void)
{
U8 i=8;
U8 ddata=0;
SDA=1;
while (i--)
{
ddata<<=1;
SCL=0;SomeNOP();
SCL=1;SomeNOP();
ddata|=SDA;
}
SCL=0;
return ddata;
}
bit ISendStr(U8 sla,U8 suba,U8 *s,U8 no){
U8 i;
I2CStart();
I2CSendByte(sla);
WaitAck();
I2CSendByte(suba);
WaitAck();
for(i=0;i<no;i++){
I2CSendByte(*s);
WaitAck();
s++;
}
I2CStop();
return 1;
}
bit IRcvStr(U8 sla,U8 suba,U8 *s,U8 no){
U8 i;
I2CStart();
I2CSendByte(sla);
if (!WaitAck()) return 0;
I2CSendByte(suba);
if (!WaitAck()) return 0;
I2CStart();
I2CSendByte(sla+1);
if (!WaitAck()) return 0;
for(i=0;i<no-1;i++){
*s=I2CReceiveByte();
SendAck();
s++;
}
*s=I2CReceiveByte();
SendNotAck();
I2CStop();
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -