; (R3)=器件地址
; (R4)=片内字节地址
; (R1)=欲写数据存放地址指针
; (R7)=连续写字节数n
EEPW: MOV R7,#06H
MOV R1,#30
MOV R3,#0
SETB SDA
SETB SCL
NOP
NOP
CLR SDA;发开始信号
NOP
NOP
MOV A,R3;送器件地址
ACALL SUBS
;MOV A,R4;送片内字节地址
;ACALL SUBS
AGAIN: MOV A,@R1
ACALL SUBS;调发送单字节子程序
INC R1
DJNZ R7,AGAIN;连续写n个字节
CLR SDA;SDA置0, 准备送停止信号
ACALL DELAY;延时以满足传输速率要求
SETB SCL;发停止信号
ACALL DELAY
SETB SDA
RET
SUBS: MOV R0,#07H;发送单字节子程序
LOOP: ;CLR SCL
SETB SCL
RLC A
MOV SDA,C
NOP
;SETB SCL
CLR SCL
ACALL DELAY
DJNZ R0,LOOP ;循环8次送8个bit
;CLR SCL
SETB SCL
ACALL DELAY
;SETB SCL
CLR SCL
ACALL DELAY
REP: MOV C,SDA
JC REP;判应答到否,未到则等待
CLR SCL
RET
DELAY: NOP
NOP
RET
;读串行E2PROM子程序EEPR
;(R1)=欲读数据存放地址指针
;(R3)=器件地址
;(R4)=片内字节地址
;(R7)=连续读字节数
EEPR: MOV R7,#06H
MOV R3,#0
MOV R1,#30
SETB SDA
SETB SCL
NOP
NOP
CLR SDA;发开始信号
NOP
NOP
;MOV A,R3;送器件地址
;ACALL SUBS ;调发送单字节子程序
;MOV A,R4 ;送片内字节地址
;ACALL SUBS
;MOV P3,#0FFH
;CLR SDA ;再发开始信号
MOV A,R3
SETB ACC.0;发读命令
ACALL SUBS
MORE: ACALL SUBR
MOV @R1,A
INC R1
DJNZ R7,MORE
CLR SDA
ACALL DELAY
SETB SCL
ACALL DELAY
SETB SDA ;送停止信号
ACALL DELAY
RET
SUBR: MOV R0,#07H ;接受单字节子程序
LOOP2: SETB SCL
ACALL DELAY
MOV C,SDA
RLC A
CLR SCL
ACALL DELAY
DJNZ R0,LOOP2
CJNE R7,#01H,LOOW
SETB SDA;若是最后一个字节置A=1
AJMP SETOK
LOOW: CLR SDA;否则置A=0
SETOK: ACALL DELAY
SETB SCL
ACALL DELAY
CLR SCL
ACALL DELAY
SETB SDA;应答毕,SDA置1
RET
TABLE: DB 07H,08H,09H,0CH; 7 8 9 C
DB 04H,05H,06H,0DH; 4 5 6 D
DB 01H,02H,03H,0EH; 1 2 3 E
DB 0AH,00H,0BH,0FH; A 0 B F
END