I2C總線在單片機上的實現
MOV A,#0A1H ;SEND THE CNOTROL BYTE
LCALL SENDBYTE
LCALL ACK
LCALL READBYTE
LCALL BSTOP
POP 0EH
RET
送字節程序:
SENDBYTE:PUSH 0EH
PUSH 00H
MOV R0,#08H
LOOP1:CLR P1.3
NOP
NOP
RLC A
MOV P1.2,C
CPL P1.3 ;P1.3=1
NOP
NOP
DJNZ R0,LOOP1
POP 00H
POP 0EH
RET
讀字節子程序:
READBYTE:PUSH 0EH
PUSH 00H
MOV R0,#08H;READ THE CONTENT
CLR A
LOOP4:CLR P1.3
NOP
NOP
NOP
SETB P1.3 ;P1.3=1
MOV C,P1.2
RLC A
DJNZ R0,LOOP4
MOV R2,A
POP 00H
POP 0EH
RET
c.寫數據程序:
WRITE:PUSH 0EH
CLR P1.4
LCALL BSTART
MOV A,#0A0H
CLALL SENDBYTE ;SEND THE CONTROL BYTE
LCALL ACK
MOV A,R1 ;SEND THE ADDRESS
LCALL SENDBYTE
LCALL ACK
MOV A,R2 ;WRITE THE CONTENT
LCALL SENDBYTE
LCALL ACK
LCALL BSTOP
POP 0EH
RET
連續寫的兩個字節之間最好是有10ms的延時。當然,也可以進行頁寫(PAGE WRITE),即一次性連續寫8個字節,但采用頁寫方式時每個字節后要有一個應答信號。
d.停止位程序:
BSTOP:CLR P1.3
NOP
NOP
CLR P1.2
NOP
NOP
NOP
SETB P1.3
NOP
NOP
NOP
SETB P1.2
RET
評論