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

📄 mem_eep.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
字号:
;***********************************************************************
;FUNCTION: THIS ROUTINE IS TO COPY DATA FROM MCU'S BUTTON DATA TO 
;          EEPROM. ALL BUTTON DATA, ADDRESS FROM 0A6H TO 0FFH, AS WELL
;          AS DATA LENGTH DATA AND CRC, ADDRESS FROM 06F TO 07F, ARE
;          COPIED TO EEPROM ADDRESS FROM 00H TO 2CH AND FROM 2DH TO 34H
;          RESPECTIVELY.
;FILENAME: C:\PROJECTS\SV363\MEM_EEP.ASM
;ROUTINE NAME: MEM_EEP
;INPUT: DATA FETCHED FROM RAM ADDRESS 06FH - 07FH AND 0A6F - 0FFH
;OUTPUT: DATA COPIED IN SEQUENCE TO EEPROM FROM ADDRESS 0H - 034H
;RAM AFFECTED: FSR, 62, 6D
;SUBROUTINE CALL: EEDETECT, EEWPROT, P_TIMER, EEWRITE
;***********************************************************************
;
;#define do_meloop       loop_count      ;RAM LOCATION 62
;#define byte_count      mov_count       ;RAM LOCATION 6D
;
mem_eep:
;       call    ee_detect       ;SEE IF EEPROM EXISTS
;        btfss   f_eeexist       ;ONLY DO IF EEPROM EXISTS
;        goto    me_end
;
me_int_lp:        
        bcf     all_intr        ;DISABLE ALL INTERRUPTS
        btfsc   all_intr
        goto    me_int_lp
;
        clrc                    ;ENABLE EEPROM WRITE ACTION
        call    ee_wprot
;
        movlw   0x2             ;SET TO DO EE_LOOP1 TWICE
        movw    do_meloop
        movlw   CNTL_DATA_WORD  ;SET NUMBER OF WORD TRANSFERED COUNTER
        movw    byte_count
        movlw   CNTL_POINTER    ;INITIALIZE DATA POINTER TO FSR REGISTER
        movw    FSR       
	movlw	EEP_ADDR_1	; digital mode
	btfsc	D_A_mode
	movlw	EEP_ADDR_2	; analog mode
        movwf   ee_addr         ;STARTING FROM EEPROM ADDRESS 00
;        
me_loop1:                       ;STORE DATA TO EEPROM
        call    p_timer
        movfw   INDF            ;FIRST STORE CONTROL DATA
        movw    ee_buf0
        incf    FSR,F
        movfw   INDF
        movw    ee_buf1
;        movfw   ee_addr
        call    ee_erase        ;ERASE LOCATION BEFORE WRITE
        call    ee_write        ;WRITE EE_BUF TO EEPROM TO ADDRSS EE_ADDR
        incf    FSR,F           ;NEXT RAM DATA
        incf    ee_addr,F       ;NEXT EEPROM ADDRESS
        decfsz  byte_count,F
        goto    me_loop1
;        
        decf    do_meloop,F
        bz      me_end
;        
        movlw   PB_DATA_WORD    ;REPEAT THE LOOP TO STORE BUTTON DATA
        movw    byte_count
        movlw   DATA_POINTER
        movw    FSR
        goto    me_loop1
;
me_end:
        setc                    ;SET EEPROM TO PROTECT MODE TO PREVENT FROM
        call    ee_wprot        ;ACCIDENTALLY WRITTEN
;        bsf     all_intr        ;ENABLE ALL INTERRUPTS
        return
;
;
;
;***********************************************************************
;FUNCTION: THIS ROUTINE IS TO COPY DATA FROM EEPROM'S BUTTON DATA TO 
;          MCU. ALL BUTTON DATA, FROM EEPROM STARTING ADDRESS 00H 
;          ARE COPIED TO MCU'S RAM BUTTON DATA ADDRESS 0A8H TO 
;          0FFH, AS WELL AS DATA LENGTH AND CRC DATA, ADDRESS FROM 06F 
;          TO 07F RESPECTIVELY.
;FILENAME: C:\PROJECTS\SV363\MEM_EEP.ASM
;ROUTINE NAME: EEP_MEM
;INPUT: NIL
;OUTPUT: DATA COPIED IN SEQUENCE TO MCU FROM ADDRESS 6FH - 7FH AND
;        0A6F - 0FFH
;RAM AFFECTED: FSR, 62, 6D
;SUBROUTINE CALL: EEDETECT, P_TIMER, EEREAD
;***********************************************************************
;
;#define do_emloop       loop_count      ;RAM LOCATION 62
;#define byte_count      mov_count       ;RAM LOCATION 6D
;
eep_mem:
        			;STARTING EEPROM ADDRESS
	movlw	EEP_ADDR_1	; digital mode
	btfsc	D_A_mode
	movlw	EEP_ADDR_2	; analog mode
        movw    ee_addr         ;STARTING EEPROM ADDRESS
;       call    ee_detect       ;SEE IF EEPROM EXISTS
;        btfss   f_eeexist       ;ONLY DO IF EEPROM EXISTS
;        goto    em_end
;
em_int_lp:        
        bcf     all_intr        ;DISABLE ALL INTERRUPTS
        btfsc   all_intr
        goto    em_int_lp
;
        movlw   0x2             ;SET TO DO EM_LOOP1 TWICE
        movw    do_emloop
        movlw   CNTL_DATA_WORD  ;SET NUMBER OF WORD TRANSFERED COUNTER
        movw    byte_count       ;TO 8 BYTES
        movlw   CNTL_POINTER    ;INITIALIZE DATA POINTER TO FSR REGISTER
        movw    FSR       
;        
em_loop1:                       ;READ DATA FROM EEPROM TO MCU'S RAM
        call    p_timer
;        movfw   ee_addr         ;FIRST TRANSFER CONTROL DATA
        call    ee_read
        movfw   ee_buf0
        movw    INDF            
        incf    FSR,F
        movfw   ee_buf1
        movw    INDF
        incf    FSR,F           ;NEXT RAM DATA
        incf    ee_addr,F       ;NEXT EEPROM ADDRESS
        decfsz  byte_count,F
        goto    em_loop1
;        
        decf    do_emloop,F
        bz      em_end
;        
        movlw   PB_DATA_WORD    ;REPEAT THE LOOP TO TRANSFER BUTTON DATA
        movw    byte_count
        movlw   DATA_POINTER
        movw    FSR
        goto    em_loop1
;
em_end:
;        bsf     all_intr        ;ENABLE ALL INTERRUPTS
        return
;
;
;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO SET THE MCU'S BUTTON DATA.  THE RESET FLAG,
;          F_RESET IS FIRST EXAMINED TO SEE IF SPECIAL RESET REQUIRED.  IF 
;          F_RESET IS SET, THE DEFAULT PAGE IN THE EEPROM IS IGNORED. 
;          OTHERWISE, IT WILL FIRST LOAD DATA FROM THE DEFAULT SECTION 
;          OF THE EEPROM AND CHECK THE CRC BYTE TO SEE IF DATA VALID.
;          IF NOT, THE MCU'S RAM DATA WILL BE GENERATED INSTEAD.
;          THE EEPROM'S DATA SECTION WILL ALSO BE UPDATED. DEFAULT BUTTON 
;          WILL BE GENERATED SUCH THAT EACH BUTTON LENGTH WILL
;          BE ONE AND THE BUTTON WILL BE ASSIGNED IN SEQUENCE FROM O TO 13.
;          BUTTON #14 IS A DUMMY BUTTON WHERE THE LENGTH IS 0 AND NO VALUE
;          ASSIGNED.
;FILENAME: C:\PROJECTS\SV363\MEM_EEP.ASM
;ROUTINE NAME: DEF_PB
;INPUT: F_MAPBAD, F_RESET
;OUTPUT: THE MCU'S BUTTON DATA RAM AND EEPROM'S DATA SECTION WILL BE FILLED 
;        WITH DEFAULT BUTTON DATA.
;        THE F_MAPBAD FLAG WILL BE CLEAR ON EXIT
;RAM AFFECTED: FSR, 6D
;SUBROUTINE CALL: EEP_MEM, GEN_CRC_8, MEM_EEP
;****************************************************************************
;
;#define byte_count      mov_count       ;RAM LOCATION 6D
;
def_pb:
;        btfsc   f_reset         ;IF SPECIAL RESET USE GENERATED DATA
;        goto    def_gen
;        movlw   EEP_ADDR_2      ;LOAD DATA FROM EEPROM DEFAULT PAGE
;        call    eep_mem
;        call    gen_crc_8       ;GENERATES 8 BIT CRC IN BUFFER CRC_BYTE
;        movfw   pb_data_crc
;        subwf   crc_byte,W      ;COMPARE THE TWO CRC's
;        bz      def_end         ;EXITS IF TWO CRC'S ARE THE SAME
;
def_gen:        
        movlw   CNTL_POINTER    ;SET DATA LENGTH TO 1 
        movw    FSR 
        movlw   CNTL_DATA       ;14 BYTES CONTROL DATA = 1
        movw    byte_count
        movlw   SIZE_LENGTH 
def_loop1:        
        movw    INDF
        incf    FSR,F
        decfsz  byte_count,F
        goto    def_loop1
        movlw   0x0             ;LOAD DATA LENGTH =0 FOR THE LAST BYTE
        movw    INDF
;
        movlw   DATA_POINTER    ;SET DEFAULT BUTTON DATA FROM BOTTOM UP
        movw    FSR 
        movlw   PB_DATA         ;14 BYTES DEFAULT DATA
        movw    byte_count
        addwf   FSR,F           ;INDIRECT POINTS AT END OF DATA+1
        decf    FSR,F           ;ADJUST INDIRECT POINTER
def_loop2:        
        decf    byte_count,W
        movw    INDF
        swapf   INDF,F
        iorwf   INDF,F
        decf    FSR,F
        decfsz  byte_count,F
        goto    def_loop2

;---- added for dummy keys of SV-0009
;        bsf     STATUS,RP0
;        movlw   0x22            ; button A
;        movwf   DATA_POINTER+8  
;        movlw   0x33            ; button X
;        movwf   DATA_POINTER+9
;        bcf     STATUS,RP0

;
        call    gen_crc_8       ;CALCULATE THE 8 BIT CRC
        movfw   crc_byte        ;STORE TO BUTTON DATA CRC ADDRSS
        movw    pb_data_crc
def_end:
        call    mem_eep         ;LOAD DEFAULT DATA TO EEPROM NORMAL DATA AREA
        bcf     f_mapbad        ;RESET F_MAPBAD FLAG

        bcf   	PCLATH,3
       	call  	init_vars
        bsf   	PCLATH,3
        
	bsf	all_intr
;        bcf     f_reset         ;USE NORMAL RESET DATA AFTERWARD
        return
;
;
;
;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO SET CHECK EEPROM'S DATA.  IF VALID, THE MCU'S
;          RAM BUTTON DATA AREA WILL BE FILLED WITH EEPROM'S DATA.  IF LOADED
;          DATA IS NOT VALID OR IF THE RESET BUTTONS ARE PRESSED AT POWER ON, 
;          THE F_MAPBAD WILL BE SET TO SIGNAL MAIN PROGRAM TO LOAD DEFAULT
;          DATA.
;FILENAME: C:\PROJECTS\SV363\MEM_EEP.ASM
;ROUTINE NAME: SET_PB
;INPUT: DATA READ FROM EEPROM AND RESET BUTTON COMBINATION CHECK
;OUTPUT: IF EEPROM DATA NOT VALID OR RESET BUTTON COMBINATION FOUND, F_MAPBAD
;        FLAG WILL BE SET.
;RAM AFFECTED: 6F,7F
;SUBROUTINE CALL: EEP_MEM, GEN_CRC_8, P_TIMER, P_BEEP
;****************************************************************************
;
;
set_pb:
;        movlw   EEP_ADDR_1      ;LOAD DATA FROM EEPROM NORMAL PAGE
        btfss   f_eeexist
        bsf     f_mapbad
        call    eep_mem    
        call    gen_crc_8       ;SEE IF DATA VALID
        movfw   pb_data_crc
        subwf   crc_byte,W      ;COMPARE THE TWO CRC's
        skpz                    ;SET F_MAPBAD IF TWO CRC'S ARE NOT THE SAME
        bsf     f_mapbad
        tstf    crc_byte        ;TEST FURTHER IF CRC BYTE ZERO
        skpz
        goto    spb_1
        tstf    pbid_0          ;TEST FIRST DATA LENGTH
        skpnz
        bsf     f_mapbad
;
spb_1:        
        bsf     f_dbcpb         ;INCLUDE BUTTON DEBOUNCE
spb_loop1:
;$$$$$$$$$$$$$$$
        call    readport
;$$$$$$$$$$$$$$$
        call    p_timer         ;READ BUTTON INPUT AND WAIT FOR KEY STABLE
        btfss   f_keystb
        goto    spb_loop1
        movlw   RESET_PB0       ;SEE IF BUTTONS PRESSED IS RESET COMBINATION
        subwf   pb_old0,W
        skpz                    ;IF PRESSED IS NOT RESET THEN EXITS
        goto    spb_end
        movlw   RESET_PB1
        xorwf   pb_old1,W
        andlw   b'01111111'     ; except auto button 26/10/99
;        subwf   pb_old1,W
        skpnz                   ;SEE IF SPECIAL RESET BUTTON COMBINATION
        goto    spb_set_flag    ;SET ERROR FLAG
        goto    spb_end
;        movlw   RESET_PB2       ;SEE IF 2ND RESET BUTTON COMBINATION
;        subwf   pb_old1,W
;        skpz
;        goto    spb_end
;        bsf     f_reset         ;SET F_RESET TO INDICATE SPECIAL RESET
spb_set_flag:        
        bsf     f_mapbad
        movlw   BEEP_3          ;BEEP THREE TIMES IF RESET BUTTONS PRESSED
        call    p_beep
spb_end:
        bcf   	PCLATH,3
       	call  	init_vars
        bsf   	PCLATH,3

	bsf	all_intr
        return

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -