⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 eeprom.asm

📁 EEPROM5045的汇编读写程序
💻 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 + -