📄 test_24c02.asm
字号:
;-------------------------------------------------------------------------------------------------------
; AT24C02 EEPROM 的读写程序
;将内部RAM61H-68H单元中的数据写入到EEPROM内从50H开始的单元中,并将他们读出来存放在 30H-37H 单元中。
;-------------------------------------------------------------------------------------------------------
SLAW EQU 0A0H ;AT24C02的节点地址(写入)
SLAR EQU 0A1H ;AT24C02的节点地址(读出)
NUMBYT EQU 75H ;被传送的字节数存放单元。
MTD EQU 20H ;发送数据缓冲区首地址。
MRD EQU 30H ;接收字节缓冲区首地址。
VSDA EQU P3.4 ;AT24C02的数据线。
VSCL EQU P3.3 ;AT24C02的时钟线。
SLA EQU 76H ;
ORG 00H
SJMP STAR
ORG 30H
STAR:
MOV SP,#90H
LCALL SETDATA ;给RAM中写入数据。
MAIN:
LCALL WREEPROM ;将50H,0,1,2,3,4,5,6,7共9个数字先传到20H-28H中,再写入EEPROM。
LCALL RDEEPROM ;将 EEPROM 的 50H-57H 中8个数字读出,并保存到RAM的30-37单元。
LOOP:
SJMP LOOP
;-----------------------------------------------------------------------------------
; 在 RAM 的 61H-68H 中放入8个数字。(0--7)
;
;------------------------------------------------------------------------------------
SETDATA:
MOV 60H,#50H ;50H 是要写入的 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 中写9个字节数据
;----------------------------------------------------------------------------------
WREEPROM:
ACALL WMOV9 ;将 RAM 中60H--68H 中的9个数放到20H(MTD)开始的单元中。
MOV SLA,#SLAW
MOV NUMBYT,#09H
LCALL WRNBYT ;把以(MTD)内容为首址的(NUMBYT)个数据写到EEPROM中。
RET
;----------------------------------------------------------------------------------
; 将 RAM 中60H--68H 单元内的9个数放到20H(MTD)开始的单元中。
;----------------------------------------------------------------------------------
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 是要读写的 EEPROM 内部子地址。
MOV SLA,#SLAW ;置入写命令。
MOV NUMBYT,#1
LCALL WRNBYT ;
MOV SLA,#SLAR
MOV NUMBYT,#08 ;8个字节数据。
LCALL RDNBYT ;读出EEPROM内从 50H 单元开始的8个字节数据。
RET
;----------------------------------------------------
; 启动子程序
;----------------------------------------------------
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
;----------------------------------------------------
; 发送应答位子程序
;----------------------------------------------------
MACK:
CLR VSDA
SETB VSCL
NOP
NOP
CLR VSCL
SETB VSDA
RET
;---------------------------------------------------
; 发送非应答位子程序
;---------------------------------------------------
MNACK:
SETB VSDA
SETB VSCL
NOP
NOP
CLR VSCL
CLR VSDA
RET
;---------------------------------------------------- ;
; 应答位检查子程序
;----------------------------------------------------
CACK:
SETB VSDA
SETB VSCL
CLR F0
MOV C,VSDA
JNC CEND
SETB F0
CEND:
CLR VSCL
RET
;---------------------------------------------------
; 发送一个字节数据子程序
;---------------------------------------------------
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
;---------------------------------------------------------
; 读出一个字节数据子程序
;---------------------------------------------------------
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中写入 N 个字节数据子程序
; 入口:NUMBYT--要写入的字节数
; MTD--要写入数据在RAM缓存区中的首地址
;---------------------------------------------------------
WRNBYT:
MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT ;送出写命令。
LCALL CACK
JB F0,WRNBYT
MOV R1,#MTD
WRDA:
MOV A,@R1 ;取出要写的数据。
LCALL WRBYT ;执行写操作。
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
;---------------------------------------------------------
; 从EEPROM中读出 N 个字节数据子程序
; 入口:NUMBYT--要读出的字节数
; MRD--读出的数据在RAM缓存区中存放的首地址
;---------------------------------------------------------
RDNBYT:
MOV R3,NUMBYT
LCALL STA
MOV A,SLA
LCALL WRBYT ;送出读命令。
LCALL CACK
JB F0,RDNBYT
RDN:
MOV R1,#MRD
RDN1:
LCALL RDBYT ;读出数据。
MOV @R1,A ;存放数据。
DJNZ R3,ACK
LCALL MNACK
LCALL STOP
RET
ACK:
LCALL MACK
INC R1
SJMP RDN1
;-----------------------------------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -