贴出来好了。
调用前指明B_E2(收/发),E2ADDS(24C02起始地址),E2LONG(读写多少BYTES),E2START(目标起始地址)
设置B_T0OV和B_TR0是为了防止读死(在TIMER0里加标志)。
> ;***************************
;READ AND WRITE 24C02(E2ROM)
;INPUT B_E2(WRITE OR READ),E2ADDS(BEGIN ADDRESS),E2LONG(WR OR RD LONG)
;IF READ,OUT=SIZE++,IF WRITE,IN=SIZE++ ;FROM R0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
E2ROM:
PUSH ACC
E2_1: CLR B_T0OV
MOV TH0,#2BH
MOV TL0,#0B4H
MOV R_T0,#02H
SETB B_TR0
LCALL SBEGIN
JB B_E2,E2W
E2R: MOV A,#0A0H ;24C02地址
LCALL SWR
LCALL SWRACK
JB B_T0OV,E2RET
MOV A,E2ADDS
LCALL SWR
LCALL SWRACK
JB B_T0OV,E2RET
LCALL SBEGIN
MOV A,#0A1H ;24C02地址
LCALL SWR
LCALL SWRACK
JB B_T0OV,E2RET
MOV R0,E2START
E2R1: MOV R6,E2LONG
CJNE R6,#00H,E2R3
SJMP E2RET
E2R3: DEC R6
CJNE R6,#00H,E2R2
LCALL SRD
MOV @R0,A
LCALL SRDNACK
E2RET: LCALL SEND
CLR B_TR0
JNB B_START,E2_2
E2_2: POP ACC
RET
E2R2: LCALL SRD
MOV @R0,A
LCALL SRDACK
INC R0
SJMP E2R3
E2W: MOV A,#0A0H
LCALL SWR
LCALL SWRACK
JB B_T0OV,E2RET
MOV A,E2ADDS
LCALL SWR
LCALL SWRACK
JB B_T0OV,E2RET
MOV R0,E2START
mov a,@r0
E2W1: LCALL SWR
LCALL SWRACK
JB B_T0OV,E2RET
INC R0
MOV A,@R0
DJNZ E2LONG,E2W1
SJMP E2RET
;*******************
SBEGIN: SETB SDA
SETB SCL
;nop
CLR SDA
CLR SCL
;nop
RET
;**************
;INCLUDE A,
SWR: MOV R7,#08H
;MOV A,#0A0H
SWR1: RLC A
MOV SDA,C
SETB SCL
;nop
CLR SCL
;nop
DJNZ R7,SWR1
RET
;*******************
SRD: MOV R7,#08H
SRD1: setb sda
SETB SCL
MOV C,SDA
RLC A
CLR SCL
DJNZ R7,SRD1
RET
;*****************
SEND: SETB CON2
CLR SDA
SETB SCL
;nop
SETB SDA
RET
;*****************
SWRACK: setb sda
SETB SCL
;nop
SWRACK3: JB SDA,SWRACK1
CLR SCL
;nop
SWRACK2: RET
SWRACK1: JB B_T0OV,SWRACK2
SJMP SWRACK3
;*****************
SRDACK: CLR SDA
SETB SCL
;nop
CLR SCL
;nop
RET
;**************
SRDNACK: SETB SDA
SETB SCL
;nop
CLR SCL
;nop
RET
发表时间:2003年11月14日11:38:03