📄 mem_eep.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 + -