?? test_24c02.asm
字號(hào):
;-------------------------------------------------------------------------------------------------------
; AT24C02 EEPROM 的讀寫(xiě)程序
;將內(nèi)部RAM61H-68H單元中的數(shù)據(jù)寫(xiě)入到EEPROM內(nèi)從50H開(kāi)始的單元中,并將他們讀出來(lái)存放在 30H-37H 單元中。
;-------------------------------------------------------------------------------------------------------
SLAW EQU 0A0H ;AT24C02的節(jié)點(diǎn)地址(寫(xiě)入)
SLAR EQU 0A1H ;AT24C02的節(jié)點(diǎn)地址(讀出)
NUMBYT EQU 75H ;被傳送的字節(jié)數(shù)存放單元。
MTD EQU 20H ;發(fā)送數(shù)據(jù)緩沖區(qū)首地址。
MRD EQU 30H ;接收字節(jié)緩沖區(qū)首地址。
VSDA EQU P3.4 ;AT24C02的數(shù)據(jù)線(xiàn)。
VSCL EQU P3.3 ;AT24C02的時(shí)鐘線(xiàn)。
SLA EQU 76H ;
ORG 00H
SJMP STAR
ORG 30H
STAR:
MOV SP,#90H
LCALL SETDATA ;給RAM中寫(xiě)入數(shù)據(jù)。
MAIN:
LCALL WREEPROM ;將50H,0,1,2,3,4,5,6,7共9個(gè)數(shù)字先傳到20H-28H中,再寫(xiě)入EEPROM。
LCALL RDEEPROM ;將 EEPROM 的 50H-57H 中8個(gè)數(shù)字讀出,并保存到RAM的30-37單元。
LOOP:
SJMP LOOP
;-----------------------------------------------------------------------------------
; 在 RAM 的 61H-68H 中放入8個(gè)數(shù)字。(0--7)
;
;------------------------------------------------------------------------------------
SETDATA:
MOV 60H,#50H ;50H 是要寫(xiě)入的 EEPROM 中的子地址。
MOV 61H,#11H
MOV 62H,#22H
MOV 63H,#33H
MOV 64H,#44H
MOV 65H,#55H
MOV 66H,#66H
MOV 67H,#77H
MOV 68H,#88H
RET
;----------------------------------------------------------------------------------
; 向 EEPROM 中寫(xiě)9個(gè)字節(jié)數(shù)據(jù)
;----------------------------------------------------------------------------------
WREEPROM:
ACALL WMOV9 ;將 RAM 中60H--68H 中的9個(gè)數(shù)放到20H(MTD)開(kāi)始的單元中。
MOV SLA,#SLAW
MOV NUMBYT,#09H
LCALL WRNBYT ;把以(MTD)內(nèi)容為首址的(NUMBYT)個(gè)數(shù)據(jù)寫(xiě)到EEPROM中。
RET
;----------------------------------------------------------------------------------
; 將 RAM 中60H--68H 單元內(nèi)的9個(gè)數(shù)放到20H(MTD)開(kāi)始的單元中。
;----------------------------------------------------------------------------------
WMOV9:
MOV R0,#MTD
MOV R1,#60H
MOV R2,#9
WMOV:
MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,WMOV
RET
;-----------------------------------------------------------------------------------
RDEEPROM:
MOV MTD,#50H ;50H 是要讀寫(xiě)的 EEPROM 內(nèi)部子地址。
MOV SLA,#SLAW ;置入寫(xiě)命令。
MOV NUMBYT,#1
LCALL WRNBYT ;
MOV SLA,#SLAR
MOV NUMBYT,#08 ;8個(gè)字節(jié)數(shù)據(jù)。
LCALL RDNBYT ;讀出EEPROM內(nèi)從 50H 單元開(kāi)始的8個(gè)字節(jié)數(shù)據(jù)。
RET
;----------------------------------------------------
; 啟動(dòng)子程序
;----------------------------------------------------
STA:
SETB VSDA
SETB VSCL
NOP
NOP
CLR VSDA
NOP
NOP
CLR VSCL
RET
;-------------------------------------------------------
; 停止子程序
;-------------------------------------------------------
STOP:
CLR VSDA
SETB VSCL
NOP
NOP
SETB VSDA
NOP
NOP
CLR VSDA
CLR VSCL
RET
;----------------------------------------------------
; 發(fā)送應(yīng)答位子程序
;----------------------------------------------------
MACK:
CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
;---------------------------------------------------
; 發(fā)送非應(yīng)答位子程序
;---------------------------------------------------
MNACK:
SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
;---------------------------------------------------- ;
; 應(yīng)答位檢查子程序
;----------------------------------------------------
CACK:
SETB VSDA
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND:
CLR VSCL
RET
;---------------------------------------------------
; 發(fā)送一個(gè)字節(jié)數(shù)據(jù)子程序
;---------------------------------------------------
WRBYT:
MOV R0,#08H
WLP:
RLC A
JC WR1
AJMP WR0
WLP1:
djnz r0,wlp
RET
WR1:
SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
AJMP WLP1
WR0:
CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
AJMP WLP1
;---------------------------------------------------------
; 讀出一個(gè)字節(jié)數(shù)據(jù)子程序
;---------------------------------------------------------
RDBYT:
MOV R0,#08H
RLP:
SETB VSDA
SETB VSCL
MOV C,VSDA
MOV A,R2
RLC A
MOV R2,A
CLR VSCL
DJNZ R0,RLP
RET
;---------------------------------------------------------
; 向EEPROM中寫(xiě)入 N 個(gè)字節(jié)數(shù)據(jù)子程序
; 入口:NUMBYT--要寫(xiě)入的字節(jié)數(shù)
; MTD--要寫(xiě)入數(shù)據(jù)在RAM緩存區(qū)中的首地址
;---------------------------------------------------------
WRNBYT:
MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT ;送出寫(xiě)命令。
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA:
MOV A,@R1 ;取出要寫(xiě)的數(shù)據(jù)。
LCALL WRBYT ;執(zhí)行寫(xiě)操作。
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
;---------------------------------------------------------
; 從EEPROM中讀出 N 個(gè)字節(jié)數(shù)據(jù)子程序
; 入口:NUMBYT--要讀出的字節(jié)數(shù)
; MRD--讀出的數(shù)據(jù)在RAM緩存區(qū)中存放的首地址
;---------------------------------------------------------
RDNBYT:
MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT ;送出讀命令。
LCALL CACK
JB F0,RDNBYT
RDN:
MOV R1,#MRD
RDN1:
LCALL RDBYT ;讀出數(shù)據(jù)。
MOV @R1,A ;存放數(shù)據(jù)。
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK:
LCALL MACK
INC R1
SJMP RDN1
;-----------------------------------------------------------
END
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -