📄 eeprom.asm
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; EEPROM.ASM ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
PROC READ_EE,AWRITE,AREAD,WWRITE,WREAD,BWRITE,BREAD,WREN,WRDI,WRSR_CMD
READ_EE:
NOP
MOV R0,#SHOWMD
MOV R5,#SHOWMDH_AD
MOV R4,#SHOWMDL_AD
MOV R2,#03H
LCALL AREAD
MOV R0,#KU1L
MOV R5,#KU1H_AD
MOV R4,#KU1L_AD
MOV R2,#04H
LCALL AREAD
RET
WRITE_EE:
NOP
XRL A,#0AAH
JZ WRITE_EE_END
WRITE_EE_END:
RET
; address(r0) lenght(r2) RAM => address(DPTR) EEPROM
; stack=10
AWRITE:
NOP
LCALL WREN
CLR XSCK
CLR XCS
MOV A,#WRITE_INST
MOV B,R5
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT ;SEND WRITE INSTRUCTION INCLUDE MSB OF ADDR
MOV A,R4
LCALL OUTBYT ;SEND 8 LSBS OF ADDR
AWRITE1:
MOV A,@R0
LCALL OUTBYT
INC R0
;MOV A,@R0
;LCALL OUTBYT
;INC R0
;MOV A,@R0
;LCALL OUTBYT
;INC R0
;MOV A,@R0
;LCALL OUTBYT
DJNZ R2,AWRITE1
CLR XSCK
SETB XCS
LCALL WIP_POLL ;POLL FOR COMPLETION OF WRITE CYCLE
LCALL WRDI
RET
;*****************************************************************************
;* NAME:S_READ
;* DESCRIPTION:SEQUENTIAL READ
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO READ THREE CONSECUTIVE BYTES TO
;* THE EEPROM MEMORY ARRAY
;* CALLS:OUTBYT,INBYT stack=4
;* INPUT:NONE
;* OUTPUT:A=LAST READ BYTE
;* REGISTER USAGE:A,B
;* adress(DPTR) lenght(r2) EEPROM => adress(r0) RAM
;****************************************************************************
AREAD:
NOP
CLR XSCK
CLR XCS
MOV A,#READ_INST
MOV B,R5
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT ;SEND READ INSTRUCTION INCLUDE MSB OF ADDR
MOV A,R4
LCALL OUTBYT ;SEND 8 LSBS OF ADDRESS
AREAD1:
LCALL INBYT ;READ 1ST DATA BYTE
MOV @R0,A
INC R0
DJNZ R2,AREAD1
CLR XSCK
SETB XCS
RET
;;***********************************************************************
;----- EEPROM X25045 Max stack = 10 sub call = 5
;
; R3R2 => address(R5R4) EEPROM
; stack=8
WWRITE:
NOP
LCALL WREN
CLR XSCK
CLR XCS
MOV A,#WRITE_INST
MOV B,R5
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT ;SEND WRITE INSTRUCTION INCLUDE MSB OF ADDR
MOV A,R4
LCALL OUTBYT ;SEND 8 LSBS OF ADDR
MOV A,R2
LCALL OUTBYT
MOV A,R3
LCALL OUTBYT
CLR XSCK
SETB XCS
LCALL WIP_POLL ;POLL FOR COMPLETION OF WRITE CYCLE
LCALL WRDI
RET
;;*********************************************************************
; adress(R5R4) EEPROM 2 byte => R3R2 stack=4
WREAD:
NOP
CLR XSCK
CLR XCS
MOV A,#READ_INST
MOV B,R5
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT ;SEND READ INSTRUCTION INCLUDE MSB OF ADDR
MOV A,R4
LCALL OUTBYT ;SEND 8 LSBS OF ADDR
LCALL INBYT ;READ 1ST DATA BYTE
MOV R2,A
LCALL INBYT ;READ 2ND DATA BYTE
MOV R3,A
CLR XSCK
SETB XCS
RET
;*********************************************************************
;* NAME:B_READ
;* DESCRIPTION:SINGLE BYTE WRITE
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO READ A SINGLE BYTE FROM THE EEPROM
;* MEMORY ARRAY
;* CALLS:OUTBYT,INBYT stack=8
;* INPUT:NONE
;* OUTPUT:NONE
;* REGISTER USAGE:A,B
; adress(R5R4) EEPROM => R2
;****************************************************************************
BREAD:
NOP
CLR XSCK
CLR XCS
MOV A,#READ_INST
MOV B,R5
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT ;SEND READ INSTRUCTION INCLUDE MSB OF ADDR
MOV A,R4
LCALL OUTBYT ;SEND 8 LSBS OF ADDR
LCALL INBYT ;READ DATA BYTE
MOV R2,A
CLR XSCK
SETB XCS
RET
;*****************************************************************************
;* NAME:B_WRITE
;* DESCRIPTION:SINGLE BYTE WRITE
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO WRITE A SINGLE BYTE TO THE EEPROM
;* MEMORY ARRAY
;* CALLS:OUTBYT,WIP_POLL stack=8
;* INPUT:NONE
;* OUTPUT:NONE
;* REGISTER USAGE:A,B
;* R2 => adress(R5R4) EEPROM
BWRITE:
NOP
LCALL WREN
CLR XSCK
CLR XCS
MOV A,#WRITE_INST
MOV B,R5
MOV C,B.0
MOV ACC.3,C
LCALL OUTBYT ;SEND WRITE INSTRUCTION INCLUDE MSB OF ADDR
MOV A,R4
LCALL OUTBYT ;SEND 8 LSBS OF ADDR
MOV A,R2
LCALL OUTBYT
CLR XSCK
SETB XCS
LCALL WIP_POLL ;POLL FOR COMPLETION OF WRITE CYCLE
LCALL WRDI
RET
;****************************************************************************
;;*********************************************************************
;* NAME:WREN
;* DESCRIPTION:SET WRITE ENABLE LATCH
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO ENABLE WRITE TO THE EEPROM ARRAY
;* OR STATUS REGISTER
;* CALLS:OUTBYT stack=4
;* INPUT:NONE
;* OUTPUT:NONE
;* REGISTER USAGE:A
;****************************************************************************
WREN:
NOP
CLR XSCK
CLR XCS
MOV A,#WREN_INST
LCALL OUTBYT ;SEND WREN INSTRUCTION
CLR XSCK
SETB XCS
RET
;*****************************************************************************
;* NAME:WRDI
;* DESCRIPTION:RESET WRITE ENABLE LATCH
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO DISABLE WRITE TO THE EEPROM ARRAY
;* OR STATUS REGISTER
;* CALLS:OUTBYT stack=4
;* INPUT:NONE
;* OUTPUT:NONE
;* REGISTER USAGE:A
;****************************************************************************
WRDI:
NOP
CLR XSCK
CLR XCS
MOV A,#WRDI_INST
LCALL OUTBYT ;SEND WRDI INSTRUCTION
CLR XSCK
SETB XCS
RET
;*****************************************************************************
;* NAME:WRSR_CMD
;* DESCRIPTION:WRITE STATUS REGISTER
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO WRITE THE WD0,WD1,BP0 AND BP0
;* EEPROM BITS IN THE STATUS REGISTER
;* CALLS:OUTBYT,WIP_POLL stack=8
;* INPUT:NONE
;* OUTPUT:NONE
;* REGISTER USAGE:A
;****************************************************************************
WRSR_CMD:
NOP
CLR XSCK
CLR XCS
MOV A,#WRSR_INST
LCALL OUTBYT ;SEND WRSR INSTRUCTION
MOV A,#STATUS_REG
LCALL OUTBYT
CLR XSCK
SETB XCS
LCALL WIP_POLL ;POLL FOR COMPLETION OF WRITE CYCLE
RET
;*****************************************************************************
;* NAME:RDSR_CMD
;* DESCRIPTION:READ STATUS REGISTER
;* FUNCTION: THIS ROUTINE SEND THE COMMAND TO READ THE STATUS REGISTER
;* CALLS:OUTBYT,INBYT stack=4
;* INPUT:NONE
;* OUTPUT:A=STATUS REGISTER
;* REGISTER USAGE:A
;****************************************************************************
RDSR_CMD:
NOP
CLR XSCK
CLR XCS
MOV A,#RDSR_INST
LCALL OUTBYT ;SEND RDSR INSTRUCTION
LCALL INBYT ;READ STATUS REGISTER
CLR XSCK
SETB XCS
RET
;***********************************************************************
;
;*****************************************************************************
;* NAME:WIP_POLL
;* DESCRIPTION:WRITE_IN_PROGRESS POLLING
;* FUNCTION: THIS ROUTINE POLLS FOR COMPLETION OF A NONVOLATILE WRITE CYCLE
;* BY EXAMINING THE WIP BIT OF THE STATUS REGISTER
;* CALLS:RDSR_CMD stack=6
;* INPUT:NONE
;* OUTPUT:NONE
;* REGISTER USAGE:R7,A
;****************************************************************************
WIP_POLL:
NOP
MOV R7,#MAX_POLL ;SET MAXIMUM NUMBER OF POLLS
WIP_POLL1:
LCALL RDSR_CMD ;READ STATUS REGISTER
JNB ACC.0,WIP_POLL2
DJNZ R7,WIP_POLL1
WIP_POLL2:
RET
;*****************************************************************************
;* NAME:OUTBYT
;* DESCRIPTION:SENDS BYTE TO EEPROM
;* FUNCTION: THIS ROUTINE SHIFTS OUT A BYTE ,STARTING WITH THE MSB,TO EEPROM
;* CALLS:NONE stack=2
;* INPUT:A=BYTE TO BE SENT
;* OUTPUT:NONE
;* REGISTER USAGE:R7,A
;****************************************************************************
OUTBYT:
NOP
MOV R7,#08H
OUTBYT1:
CLR XSCK
RLC A
MOV XSI,C
SETB XSCK
DJNZ R7,OUTBYT1
CLR XSI
RET
;*****************************************************************************
;* NAME:INBYT
;* DESCRIPTION:RECEIVES BYTE FROM EEPROM
;* FUNCTION: THIS ROUTINE RECEIVES A BYTE ,MSB FIRST,FROM EEPROM
;* CALLS:NONE stack=2
;* INPUT:NONE
;* OUTPUT:A=RECEIVED BYTE
;* REGISTER USAGE:R7,A
;****************************************************************************
INBYT:
NOP
MOV R7,#08H
INBYT1:
SETB XSCK
CLR XSCK
MOV C,XSO
RLC A
DJNZ R7,INBYT1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -