?? i2c.txt
字號(hào):
;24c02的1、2、3、4、7腳接地,5腳接P3.5,6腳接p3.4,8腳接5V電源
SDA BIT P3.5 ;p3.5作數(shù)據(jù)線
SCL BIT P3.4 ;p3.4作時(shí)鐘線
NUMBYT EQU 54H ; 存發(fā)送或接收字節(jié)數(shù)
MTD EQU 50H ;發(fā)送數(shù)據(jù)的首址
MRD EQU 51H ;接收到的數(shù)據(jù)存放首址
SLAW EQU 52H ;存寫(xiě)的控制字
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---寫(xiě)狀態(tài)控制字
MOV SLAR,#0A1H ;10100001---讀狀態(tài)控制字
MOV MTD,#30H ;發(fā)送數(shù)據(jù)的起始單元為30H
MOV MRD,#40H ;接受到的數(shù)據(jù)所存放的地址
MOV NUMBYT,#20H ;發(fā)送或接收的數(shù)據(jù)個(gè)數(shù)
MOV R0,#30H
MOV A,#00H
LOOP: MOV @R0,A
INC A
INC R0
CJNE A,#20H,LOOP
A1: LCALL STA ;開(kāi)始發(fā)送數(shù)據(jù)
NOP
MOV A,SLAW
LCALL WRBYT
LCALL CACK
JB F0, A1
NOP
/* MOV A,#19H ;寫(xiě)一個(gè)字節(jié)
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 ;開(kāi)始從EEPROM讀數(shù)據(jù)
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 ;啟動(dòng),當(dāng)時(shí)鐘(SCL)為高,數(shù)據(jù)(SDA)由高到低的變化
; 為傳送開(kāi)始標(biāo)志
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
CLR SCL
RET
STOP: CLR SDA ;停止,當(dāng)時(shí)鐘(SCL)為高時(shí),數(shù)據(jù)(SDA)由低到高的變化
;為數(shù)據(jù)停止傳送的標(biāo)志
NOP
NOP
SETB SCL
NOP
NOP
SETB SDA
NOP
NOP
CLR SCL
RET
MACK: CLR SDA ;發(fā)送應(yīng)答位
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
MNACK: SETB SDA ;發(fā)送反態(tài)應(yīng)答位
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
RET
CACK: SETB SDA ;應(yīng)答位檢查子程序
SETB SCL
NOP
MOV C, SDA
MOV F0,C
CLR SCL
NOP
RET
WRBYT: PUSH 7
MOV R7,#08H ;字節(jié)數(shù)據(jù)發(fā)送子程序
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 ;字節(jié)數(shù)據(jù)接收子程序
RLP: SETB SDA ;準(zhǔn)備讀
SETB SCL
MOV C,SDA
RLC A
CLR SCL
DJNZ R7,RLP
POP 7
RET
/*WRNBYT: LCALL STA ;N個(gè)字節(jié)數(shù)據(jù)發(fā)送子程序,但最多傳送8個(gè)字節(jié)
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 ;寫(xiě)字節(jié)數(shù)n
WRDA: MOV A,@R0
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R0
DJNZ R5,WRDA
LCALL STOP
RET */
WRNBYT: PUSH 0 ;可發(fā)送任意多個(gè)字節(jié)
PUSH 2
PUSH 3
PUSH 5
MOV R0,MTD
MOV R5,NUMBYT ;寫(xiě)字節(jié)數(shù)n
MOV R2,#00H
MOV R3,#00H
BYT8: LCALL STA ;N個(gè)字節(jié)數(shù)據(jù)發(fā)送子程序
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 ;延時(shí)子程序(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
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -