📄 bat512.asm
字号:
;这是读写AT24CXX EEPROM程序,文件名为BAT512.ASM
;功能: 适用AT24CXX EEPROM系列共11个型号的读写,具体为
; (1) 页写入
; (2) 页写入校验
; (3) 字节写入
; (4) 字节写入校验
SDA BIT INT1
SCL BIT INT0
FADDR EQU 0A0H ;AT24CXX固定地址
PADDR EQU 0 ;可编程地址(0-7)
SIZE EQU 10000H ;AT24CXX所包含的字节数(80H,100H,200H,400H,800H,1000H,2000H,4000H,8000H,10000H)
PSIZE EQU 128 ;每页字节数(8,16,32,64,128,256)
FILL EQU 77H ;待写入的数值(0-255)
ZDATA EQU 7DH
ADDRLO EQU 7EH
ADDRHI EQU 7FH
BUFFER EQU 80H ;缓冲区地址
ORG 0000H
LJMP MAIN
ORG 0080H
MAIN: MOV SP,#050H
CLR EA
SETB SDA
SETB SCL
NOP
LCALL BYTE_FILL
JC ERRO
LCALL VERIFY_BYTE_FILL
JC ERRO
LCALL PAG_FILL
JC ERRO
LCALL VERIFY_PAG_FILL
ERRO:
SJMP $
PAG_FILL: ;页写入
MOV B,#PSIZE
MOV R0,#BUFFER
X61:
MOV @R0 ,#FILL
INC R0
DJNZ B, X61
MOV DPTR,#0000H
X62: MOV ADDRLO,DPL
MOV ADDRHI,DPH
MOV R1 ,#PSIZE
MOV B,#120
X63: MOV A,#PADDR
LCALL WRITE_BLOCK
JNC X64
DJNZ B,X63
SETB C
LJMP X66
X64: MOV A,DPL
ADD A,#PSIZE
MOV DPL,A
JNC X65
INC DPH
X65: CJNE A,#00H,X62
MOV A,DPH
CJNE A,#0ffH,X62
CLR C
X66: RET
BYTE_FILL: ;字节写入
MOV ZDATA,#FILL
MOV DPTR,#00000H
X51: MOV ADDRLO,DPL
MOV ADDRHI,DPH
MOV B,#120
X52: MOV A,#PADDR
LCALL WRITE_BYTE
JNC X53
DJNZ B,X52
SETB C
LJMP X54
X53: INC DPTR
MOV A,DPL
CJNE A,#00H,X51
MOV A,DPH
CJNE A,#01H,X51
CLR C
X54: RET
VERIFY_PAG_FILL: ;页写入校验
MOV DPTR,#0000H
X71: MOV ADDRLO,DPL
MOV ADDRHI,DPH
MOV R1 ,#PSIZE
MOV B,#120
X72: MOV A,#PADDR
LCALL READ_BLOCK
JNC X74
DJNZ B,X72
X73: SETB C
LJMP X77
X74: MOV B,#PSIZE
MOV R0 ,#BUFFER
X75: CJNE @R0,#FILL,X73
INC R0
DJNZ B, X75
MOV A,DPL
ADD A,#PSIZE
MOV DPL,A
JNC X76
INC DPH
X76: CJNE A,#00H,X71
MOV A,DPH
CJNE A,#0ffH,X71
CLR C
X77: RET
VERIFY_BYTE_FILL: ;字节写入校验
MOV DPTR,#0000H
MOV ADDRLO,DPL
MOV ADDRHI,DPH
MOV B,#120
X81: MOV A,#PADDR
LCALL READ_RANDOM
JNC X82
DJNZ B,X81
LJMP X86
X82: CJNE A,#FILL,X86
LJMP X85
X83: MOV A,#PADDR
LCALL READ_CURRENT
JC X87
CJNE A,#FILL,X86
X85: INC DPTR
MOV A,DPH
CJNE A,#01H,X83
CLR C
LJMP X87
X86: SETB C
X87: RET
WRITE_BLOCK: ;块写入
LCALL START
JC X38
RL A
ORL A,#FADDR
CLR ACC.0
LCALL SHOUT
JC X37
MOV A,ADDRHI
LCALL SHOUT
JC X37
MOV A,ADDRLO
LCALL SHOUT
JC X37
MOV R0 ,#BUFFER
X36:MOV A, @R0
LCALL SHOUT
JC X37
INC R0
DJNZ R1 ,X36
CLR C
X37:LCALL STOP
X38:RET
WRITE_BYTE: ;字节写入
LCALL START
JC X49
RL A
ORL A,#FADDR
CLR ACC.0
LCALL SHOUT
JC X48
MOV A,ADDRHI
LCALL SHOUT
JC X48
MOV A,ADDRLO
LCALL SHOUT
JC X48
MOV A ,ZDATA
LCALL SHOUT
JC X48
CLR C
X48:LCALL STOP
X49:RET
READ_CURRENT: ;现行地址读
LCALL START
JC X45
RL A
ORL A,#FADDR
SETB ACC.0
LCALL SHOUT
JC X44
LCALL SHIN
LCALL NAK
CLR C
X44:LCALL STOP
X45:RET
READ_RANDOM: ;随机读
PUSH B
MOV B,A
LCALL START
JC X47
RL A
ORL A,#FADDR
CLR ACC.0
LCALL SHOUT
JC X46
MOV A,ADDRHI
LCALL SHOUT
JC X46
MOV A,ADDRLO
LCALL SHOUT
JC X46
MOV A,B
LCALL READ_CURRENT
LJMP X47
X46:LCALL STOP
X47:POP B
RET
READ_BLOCK: ;序列读
LCALL START
JC X35
RL A
ORL A,#FADDR
MOV R0 ,A
CLR ACC.0
LCALL SHOUT
JC X34
MOV A,ADDRHI
LCALL SHOUT
JC X34
MOV A,ADDRLO
LCALL SHOUT
JC X34
LCALL START
JC X34
MOV A,R0
SETB ACC.0
LCALL SHOUT
JC X34
MOV R0 ,#BUFFER
X31:LCALL SHIN
MOV @R0 ,A
CJNE R1 ,#1,X32
LCALL NAK
LJMP X33
X32:LCALL ACK
INC R0
DJNZ R1 ,X31
X33: CLR C
X34: LCALL STOP
X35: RET
START:SETB SDA
SETB SCL
JNB SDA,X40
JNB SCL,X40
NOP
CLR SDA
NOP
NOP
NOP
NOP
NOP
CLR SCL
CLR C
LJMP X41
X40: SETB C
X41: RET
STOP: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
RET
SHOUT:PUSH B
MOV B,#8
X42: RLC A
MOV SDA,C
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
DJNZ B,X42
SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
MOV C,SDA
CLR SCL
POP B
RET
SHIN: SETB SDA
PUSH B
MOV B,#8
X43: NOP
NOP
NOP
SETB SCL
NOP
NOP
MOV C,SDA
RLC A
CLR SCL
DJNZ B,X43
POP B
RET
ACK: CLR SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
RET
NAK: SETB SDA
NOP
NOP
SETB SCL
NOP
NOP
NOP
NOP
CLR SCL
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -