📄 i2c_sub.c
字号:
#include"stdafx.h"
//#include"i2c_fun.h"
//SDA p1.7 SCL p3.3
#include"rt1602c_lcd.h"
sbit SDA=P1^7;
sbit SCL=P3^3;
#define UP 1
#define DOWN 0
#define ACK 0
#define FREE 1
#define N 2
#define SubAddr 0x5e
void job(void);
sbit P11=P1^1;
bit I2CStart;
//bit I2CStop;
bit WorkFlag;
bit I2CConnected;
//uchar num;
uchar ddata;
uchar SorceData[2]={5,8};
void main(void)
{
uchar temp,temp1,i,j;
Delay400Ms();
//LCMInit();
EX1=1;EA=1;IT1=1;
while(1){
ReSet:
SDA=FREE;
WorkFlag=0;
I2CStart=I2CConnected=DOWN;
while(I2CStart==DOWN){
//job();
if(WorkFlag)
{
WorkFlag=0;
while(SCL==0);
temp=SDA;
while(SCL==1);
temp1=SDA;
if(temp!=temp1)
if(temp==1 && temp1==0) I2CStart=UP;
}
}
ddata=j=0;
for(i=0;i<8;i++)
{
while(WorkFlag==0);
WorkFlag=0;
while(SCL==0);
temp=SDA;
ddata=(ddata<<1) | temp;
}
if((ddata/2)==(SubAddr/2)) I2CConnected=UP;
else {I2CConnected=DOWN;I2CStart=DOWN;goto ReSet;}
while(WorkFlag==0);WorkFlag=0;
SDA=ACK;
while(WorkFlag==0);
SDA=FREE;
//WorkFlag=0;
if(ddata&0x01)
{//主read
while(1){
// Resent:
for(i=0;i<8;i++)
{
while(WorkFlag==0);
SDA=(SorceData[j]&0x80);
WorkFlag=0;
SorceData[j]=SorceData[j]<<1;
}
while(WorkFlag==0);
SDA=FREE;
WorkFlag=0;
while(SCL==0);
temp=SDA;
if((temp==0)) goto Next;
else {goto ReSet;} //若主机产生NOT ACK信号时默认结束
Next:
/*while(WorkFlag==0);
WorkFlag=0;
while(SCL==0);
temp=SDA;
while(SCL==1);
if(SDA!=temp) {I2CStart=DOWN;I2CConnected=DOWN;goto ReSet;} */
j++;
j=j%N;
}
}
else
{//主write
// Receive:
//P1=0x55;while(1);
while(1){
temp=0;
//while(WorkFlag==0);WorkFlag=0;
while(SCL==0);
temp=SDA;
while(SCL==1);
if(temp!=SDA) break;
for(i=1;i<8;i++)
{
while(WorkFlag==0);WorkFlag=0;
while(SCL==0);
temp=(temp<<1) | SDA;
}
while(WorkFlag==0);WorkFlag=0;
SDA=ACK;
while(WorkFlag==0);WorkFlag=0;
SDA=FREE;
SorceData[j]=temp;
j++;j=j%N;
//P1=temp;while(1);
}
P1=SorceData[0];
//DisplayOneChar(0,0,SorceData[0]|0x30);
//DisplayOneChar(0,0,SorceData[1]|0x30);
break;
}
}
LCMInit();
DisplayOneChar(0,0,SorceData[0]|0x30);
}
void negtive(void) interrupt 2
{
// bit i2c_temp;
WorkFlag=1;
return;
}
/*
while(SCL==0);
i2c_temp=SDA;
while(SCL==high);
if(i2c_temp!=SDA)
if((i2c_temp==high)&&(SDA==low)) {i2cstart=UP;num=1;}
else i2cstop = DOWN;
else {ddata=ddata<<1 |i2c_temp;num++;}
} */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -