📄 i2c.txt
字号:
;24c02的1、2、3、4、7脚接地,5脚接P3.5,6脚接p3.4,8脚接5V电源
SDA BIT P3.5 ;p3.5作数据线
SCL BIT P3.4 ;p3.4作时钟线
NUMBYT EQU 54H ; 存发送或接收字节数
MTD EQU 50H ;发送数据的首址
MRD EQU 51H ;接收到的数据存放首址
SLAW EQU 52H ;存写的控制字
SLAR EQU 53H ;存读的控制字
ORG 0000H
SJMP START
ORG 0003H
RETI
ORG 000BH
RETI
ORG 0013H
RETI
ORG 001BH
RETI
ORG 0023H
RETI
ORG 0040H
START:
MOV SP,#60H
MOV SLAW,#0A0H ;10100000---写状态控制字
MOV SLAR,#0A1H ;10100001---读状态控制字
MOV MTD,#30H ;发送数据的起始单元为30H
MOV MRD,#40H ;接受到的数据所存放的地址
MOV NUMBYT,#20H ;发送或接收的数据个数
MOV R0,#30H
MOV A,#00H
LOOP: MOV @R0,A
INC A
INC R0
CJNE A,#20H,LOOP
A1: LCALL STA ;开始发送数据
NOP
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0, A1
NOP
/* MOV A,#19H ;写一个字节
LCALL WRBYT
LCALL CACK
JB F0,A1
MOV A,#25H
LCALL WRBYT
LCALL CACK
JB F0,A1
LCALL STOP */
LCALL WRNBYT
LCALL DELAY
A2: LCALL STA ;开始从EEPROM读数据
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,A2
MOV A,#00H
LCALL WRBYT
LCALL CACK
JB F0,A2
LCALL STA
MOV A,SLAR
LCALL WRBYT
NOP
NOP
NOP
LCALL RDBYT
CPL A
MOV P1,A
LCALL DELAY
LCALL MNACK
LCALL STOP
NOP
NOP
NOP
LCALL RDNBYT
RET
;///////////////////////////////////////////////////////////////////////////////
;子程序部分
STA: SETB SDA ;启动,当时钟(SCL)为高,数据(SDA)由高到低的变化
; 为传送开始标志
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
CLR SCL
RET
STOP: CLR SDA ;停止,当时钟(SCL)为高时,数据(SDA)由低到高的变化
;为数据停止传送的标志
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
RET
MACK: CLR SDA ;发送应答位
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
MNACK: SETB SDA ;发送反态应答位
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
RET
CACK: SETB SDA ;应答位检查子程序
SETB SCL
NOP
MOV C, SDA
MOV F0,C
CLR SCL
NOP
RET
WRBYT: PUSH 7
MOV R7,#08H ;字节数据发送子程序
WLP: RLC A
JC WR1
CLR SDA
SETB SCL
NOP
NOP
CLR SCL
DJNZ R7,WLP
POP 7
RET
WR1: SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
DJNZ R7,WLP
POP 7
RET
RDBYT: PUSH 7
MOV R7,#09H ;字节数据接收子程序
RLP: SETB SDA ;准备读
SETB SCL
MOV C,SDA
RLC A
CLR SCL
DJNZ R7,RLP
POP 7
RET
/*WRNBYT: LCALL STA ;N个字节数据发送子程序,但最多传送8个字节
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV A,#00H
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R0,MTD
MOV R5,NUMBYT ;写字节数n
WRDA: MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R0
DJNZ R5,WRDA
LCALL STOP
RET */
WRNBYT: PUSH 0 ;可发送任意多个字节
PUSH 2
PUSH 3
PUSH 5
MOV R0,MTD
MOV R5,NUMBYT ;写字节数n
MOV R2,#00H
MOV R3,#00H
BYT8: LCALL STA ;N个字节数据发送子程序
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV A,R3
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
MOV R2,#00H
WRDA: MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R0
INC R2
INC R3
DJNZ R5,XIA
SJMP END1
XIA: CJNE R2,#08H,WRDA
LJMP BYT8
LCALL STOP
END1: LCALL STOP
POP 5
POP 3
POP 2
POP 0
RET
RDNBYT: PUSH 0
PUSH 1
PUSH 2
MOV R2,#00H
;MOV R0,MRD
MOV R1,NUMBYT
LOOP1:
LCALL STA
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0,LOOP1
MOV A,R2
LCALL WRBYT
LCALL CACK
JB F0,LOOP1
LCALL STA
MOV A,SLAR
LCALL WRBYT
NOP
NOP
NOP
LCALL RDBYT
LCALL MNACK
LCALL STOP
;MOV @R0,A
CPL A
MOV P1,A
LCALL DELAY
NOP
NOP
LCALL DELAY
NOP
NOP
NOP
NOP
NOP
;INC R0
INC R2
DJNZ R1,LOOP1
POP 2
POP 1
POP 0
RET
DELAY: PUSH 0 ;延时子程序(1秒)
PUSH 1
PUSH 2
MOV R0,#0DH
DELAY1: MOV R1,#7DH
DELAY2: MOV R2,#98H
DJNZ R2,$
DJNZ R1,DELAY2
DJNZ R0,DELAY1
POP 2
POP 1
POP 0
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -