?? i2c.c
字號:
#define SCL _RB3
#define SDA _RB2
#define HIGH 1
#define LOW 0
void DEFI2C(char *name); //To define which pin is SDA and which pin is SCL
void I2CInit(); //Initialization For I2C Bus
void I2CStart(); //Start I2C Bus
void I2CStop(); //Stop I2C Bus
void I2CClock(); //return SDA while SCL is HIGH
void I2CDelay(); //Delay
void I2CAck(); //Answer
uchar I2CSend(uchar I2CData);/ nd data with I2C Bus
uchar I2CReceive(); //Receive data
void I2CStart()
{
SDA=HIGH;
I2CDelay();
SCL=HIGH;
I2CDelay();
SDA=LOW;
I2CDelay();
SCL=LOW;
I2CDelay();
}
void I2CStop()
{
SDA=LOW;
I2CDelay();
SCL=HIGH;
I2CDelay();
SDA=HIGH;
I2CDelay();
SCL=LOW;
I2CDelay();
}
void I2CInit()
{
SCL=LOW;
I2CStop();
}
void I2CClock() //return SDA while SCL is HIGH
{
SCL=HIGH;
I2CDelay();
SCL=LOW;
I2CDelay();
}
void sendI2CClock(void)
{
SCL=HIGH;
I2CDelay();
SCL=LOW;
I2CDelay();
}
uchar I2CSend(uchar I2CData)
{
uchar i;
for(i=0;i<8;i++)
{
if(I2CData & 0x80)
{
SDA = 1;
}
else SDA = 0;
sendI2CClock();
I2CData=I2CData << 1;
}
SDA=HIGH;
// return (~I2CClock());
}
void I2CAck()
{
SDA=LOW;
I2CClock();
SDA=HIGH;
}
void I2CNAck()
{
SDA=HIGH;
I2CClock();
SDA=HIGH;
}
uchar I2C_GetACK(void)
{
uchar nTemp = 0;
int j;
SCL = 0;
Nop();
Nop();
SDA = 1;
Nop();
Nop();
TRISB |= 0x0004;
Nop();
Nop();
Nop();
SCL = 1;
for(j=0;j<20;j++);
nTemp = SDA; //獲得數據
for(j=0;j<30;j++);
SCL = 0;
TRISB &= 0xFFFB;
Nop();
Nop();
Nop();
return nTemp;
}
void I2CDelay()
{
unsigned int ll;
for(ll=0;ll<50;ll++)
{
;
}
}
uchar I2CReceive()
{
uchar I2CData=0;
uchar kk,j;
TRISB |= 0x0004;
Nop();
Nop();
Nop();
for(kk=0;kk<8;kk++)
{
I2CData <<= 1;
SCL=HIGH;
for(j=0;j<20;j++);
if(SDA==HIGH) I2CData |= 1;
for(j=0;j<30;j++);
SCL=LOW;
I2CDelay();
}
TRISB &= 0xFFFB;
SDA= HIGH;
return I2CData;
}
int main(void)
{
uchar iiii = 0,jjjj = 0;
AD1PCFG=0xFFFF;
TRISB=0x0301; // INT1 AND INT2 INPUT
LATB =0;
// SRbits.IPL =2; // CPU PRIORITY=2
// SRbits.IPL =2; // CPU PRIORITY=2
// InitINT1();
// InitINT2();
// RXTX_485=0; //485處于從電腦接收數據狀態
// INITUART1();
// INITRTCC ();
// LED4=0;
// jdq1=ON; //繼電器動作標志
// jdq2=ON;
I2CInit();
while(1)
{
I2CStart();
I2CSend(0xa0);
I2C_GetACK();
// I2CDelay();
// I2CClock();
I2CSend(0x14);
I2C_GetACK();
// I2CDelay();
// I2CClock();
I2CSend(0x77);
I2C_GetACK();
// I2CDelay();
// I2CClock();
I2CStop();
delay(10);
I2CStart();
I2CSend(0xa0);
I2C_GetACK();
// I2CClock();
// I2CDelay();
I2CSend(0x13);
I2C_GetACK();
// I2CDelay();
// I2CClock();
I2CStart();
// I2CDelay();
I2CSend(0xa1);
// I2CClock();
I2C_GetACK();
iiii = I2CReceive();
I2CAck();
jjjj = I2CReceive();
I2CNAck();
I2CStop();
while(1);
}
// while(1)
// { ReadRTCC();
// Run();
// }
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -