void I2C_start()
{
SDAT=1;
SCLK=1;
nop;
nop;
nop;
nop;
SDAT=0;
}
void I2C_write(uchar com)
{
uchar i,dat=0;
dat=com;
for(i=0;i<8;i++)
{
SCLK=0;
nop;
dat=dat<<1;
SDAT=CY;
nop;
SCLK=1;
delay();
}
SCLK=0;
delay();
SCLK=1;
while(SDAT==1);
SCLK=0;
}
void I2C_stop()
{
SDAT=0;
delay();
SCLK=1;
delay();
SDAT=1;
}
以上是c语言写的I2C,其中nop被宏定义了。
EEPW: SETB SDA
SETB SCL
NOP
NOP
NOP
NOP
CLR SDA
MOV A,#0BAH ;送器件地址 BA接电源接,B8地
ACALL SUBS
MOV A,R2 ;送片内字节地址
ACALL SUBS
AGAIN: MOV A,R3
ACALL SUBS ;调发送单字节子程序
CLR SDA ;SDA置0, 准备送停止信号
ACALL DELAY ;延时以满足传输速率要求
SETB SCL ;发停止信号
ACALL DELAY
SETB SDA
RET
SUBS: MOV R0,#8 ;发送单字节子程序
LOOP: CLR SCL
;RLC A
ADD A,ACC
MOV SDA,C
NOP
SETB SCL
ACALL DELAY
DJNZ R0,LOOP
CLR SCL
ACALL DELAY
SETB SCL
REP: MOV C,SDA
JC REP ;判应答到否,未到则等待
CLR SCL
; CLR CH_LED_GREEN_Pin
RET
DELAY: NOP
NOP
NOP
NOP
RET
END
以上是汇编代码,汇编代码可以顺利执行,求解。时钟分频我用的是一样的而且都比实际要求偏大。
|