MOVX @DPTR,A
SETB ISDA ;User variable initialization
SETB ISMA
CLR A
MOV ADDR,A
MOV R0,A
MOVX A,@R0
MOV DPTR,#I2CTXD
MOVX @DPTR,A
LOOP:
MOV DPTR,#I2CSLST ;Detect slave status
MOVX A,@DPTR
JB ACC.6,STARTIF
JB ACC.5,RXIF
JB ACC.4,TXIF
JB ACC.3,STOPIF
JMP LOOP
STARTIF:
ANL A,#NOT 40H ;Handle the START event
MOVX @DPTR,A
JMP LOOP
RXIF:
ANL A,#NOT 20H ;Handle the RECV event
MOVX @DPTR,A
MOV DPTR,#I2CRXD
MOVX A,@DPTR
JBC ISDA,RXDA
JBC ISMA,RXMA
MOV R0,ADDR ;Handle the RECV event (RECV DATA)
MOVX @R0,A
INC ADDR
JMP LOOP
RXDA:
JMP LOOP ;Handle the RECV event (RECV DEVICE ADDR)
RXMA:
MOV ADDR,A ;Handle the RECV event (RECV MEMORY ADDR)
MOV R0,A
MOVX A,@R0
MOV DPTR,#I2CTXD
MOVX @DPTR,A
JMP LOOP
TXIF:
ANL A,#NOT 10H ;Handle the SEND event
MOVX @DPTR,A
JB ACC.1,RXNAK
INC ADDR
MOV R0,ADDR
MOVX A,@R0
MOV DPTR,#I2CTXD
MOVX @DPTR,A
JMP LOOP
RXNAK:
MOVX A,#0FFH
MOV DPTR,#I2CTXD
MOVX @DPTR,A
JMP LOOP