- ;简洁的24C02读写汇编程序
- ;--------------------------------------------
- I2C_SDA EQU P1.6 ; PIN 5
- I2C_SCL EQU P1.7 ; PIN 6
- ;=============================================
- I2C_WRITE: ; WRITE 8 BYTES TO EEROM ; INPUT: A - A*8 = EEROM START ADDR
- ; R0 - RAN START ADDR
- ; USE: C, A, R0, R6, R7
- ACALL I2C_START
- ACALL OUT
- MOV R6, #8
- WR_LP:MOV A, @R0
- ACALL OUT
- INC R0
- DJNZ R6, WR_LP
- AJMP I2C_STOP
- ;==========================================
- I2C_READ: ; READ 8 BYTES FROM EEROM ; INPUT: A - A*8 = EEROM START ADDR
- ; R0 - RAN START ADDR
- ; USE: C, A, R0, R6, R7
- ACALL I2C_START
- ACALL OUT
- MOV R6, #8
- MOV A, #0A1H; #RDCMD
- ACALL OUTS
- BRDLP:
- MOV R7, #8
- SETB I2C_SDA
- INLP: CLR I2C_SCL
- ACALL DELAY6
- SETB I2C_SCL
- NOP
- MOV C, I2C_SDA
- RLC A
- DJNZ R7, INLP
- CLR I2C_SCL
- MOV @R0, A
- INC R0
- DJNZ R6, ACKLP
- ;;;;----------------------------
- I2C_STOP:
- CLR I2C_SDA
- ACALL DELAY5
- SETB I2C_SCL
- ACALL DELAY5
- SETB I2C_SDA
- DELAY6:
- NOP
- DELAY5:
- NOP
- RET
- ;;-----------------------------
- I2C_START:
- SWAP A
- RR A
- MOV R6, A
- MOV A, #0A0H; #WTCMD
- ACALL OUTS
- MOV A, R6
- RET
- ;-------------------------------
- ACKLP:
- CLR I2C_SDA
- SETB I2C_SCL
- ACALL DELAY5
- CLR I2C_SCL
- AJMP BRDLP
- ;=======================
- OUTS:
- SETB I2C_SDA
- SETB I2C_SCL
- ACALL DELAY5
- CLR I2C_SDA
- ACALL DELAY5
- CLR I2C_SCL
- ;========================
- OUT:
- SETB C
- MOV R7, #9
- OTLP: RLC A
- NOP
- MOV I2C_SDA, C
- NOP
- NOP
- SETB I2C_SCL
- ACALL DELAY5
- CLR I2C_SCL
- DJNZ R7, OTLP
- RET
- ;========================
- END