📄 program.asm
字号:
;******************************************************************
;FUNCTION: THIS ROUTINE INITIALIZES BUTTON PROGRAMMING PROCEDURES
; ALLOWING USERS TO MODIFY BUTTON DATA RAM AND UPDATE EERPOM
; DATA.
;FILENAME: \PROJECTS\SV363\PROGRAM.ASM
;NAME: PROCPGM
;OUTPUT: RAM AREA DATA MEMORY AND EEPROM UPDATED
;RAM USAGE: BANK 1 - 0A6H TO 0FFH TOTAL 90 BYTES FOR BUTTON DATA
; BANK 0 - 070H TO 07FH TOTAL 16 BYTES FOR CONTROL DATA
; BANK 0 - 060H TO 06FH TOTAL 16 BYTES AS SCRATCHPAD RAM
;SUBROUTINE CALLS: P_BEEP, NEXTKEY, A_NDX, WAITKEY, P_TIMER,
; CODING, GEN_CRC_8 AND MEM_EEP.
;******************************************************************
;
;
;DEFINE VARIABLE NAMES
;crc_byte equ 0x6f ;BUFFER FOR CRC VALUE
;mov_count equ 0x6d ;COUNTER NO. OF BYTES TO BE MOVED
;mov_buffer equ 0x6c ;TEMPORARY BUFFER FOR DATA MOVE
;?mem_free equ 0x6c ;MEMORY FREE LEFT FOR DATA
;ptr_nxt equ 0x69 ;CURRENT STEP POINTER
;data_length equ 0x68 ;DATA LENGTH FOR A STEP
;pgm_buf0 equ 0x67 ;LOWEST ORDER BYTE OF ENCODE KEY(S)
;pgm_buf1 equ 0x66 ;MIDDLE ORDER BYTE OF ENCODE KEY(S)
;pgm_buf2 equ 0x65 ;HIGHEST ORDER BYTE OF ENCODE KEY(S)
;temp_buf1 equ 0x63 ;TEMPORARY BUFFER #1
;temp_buf2 equ 0x62 ;TEMPORARY BUFFER #2
;pb_data_crc equ 0x7f ;CRC FOR BUTTON DATA
;DEFINE CONSTANT NAMES
;PGM_BUF_PTR equ H'067' ;POINTER POINTS AT PGM_BUF0
;PBID_PTR equ H'070' ;POINTER POINTS AT FIRST PBID DATA LENGTH
;
;--------------------------------------------------------------------
procpgm:
movlw DBC500MS ;SET 0.5MSEC KEY RELEASE DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
bcf f_keystb ;CLEAR KEY STABLE FLAG
bcf f_autled2
pgm_dbc:
call readport
nop
call p_timer ;DEBOUCE PROGRAM KEY FOR 0.5 SECOND
btfss f_keystb ;IF PROGRAM RELEASES WITHIN THE DEBOUNCE TIME
goto pgm_dbc ;THE PROGRAM ROUTINE WILL EXIT WITHOUT DOING
btfsc pgm_bit ;ANYTHING
return
pgm_int_off:
bcf STATUS,RP0
bsf f_dbcpb ;INCLUDE FIRE BUTTON DEBOUNCE
bsf f_prog_mode
bcf s_motor ;off motor 11/7/00
clrf pwmduty ;
movlw 0x01 ;RESET PLED COUNTER -> START FLASH IMMEDIATE
movwf tmr_pled
movlw PLED1ST ;SET SLOW FLASHING PROGRAM LED
bsf STATUS,RP0
movwf pled_cmd
bcf STATUS,RP0
movlw DBC100MS ;SET 0.1MSEC KEY RELEASE DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
movlw BEEP_2 ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
call p_beep ;WAIT UNTIL BEEP FINISHED
wpgmoff:
bcf STATUS,RP0
movlw 0x00 ;WAIT UNTIL PROGRAM KEY RELEASE AND NO KEY
call waitkey
btfss pgm_bit ;EXIT WAIT LOOP IF PROGRAM KEY RELEASED
goto wpgmoff
movlw DBC200MS ;SET 0.2MSEC KEY PRESSED DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
movlw 0x01 ;WAIT UNTIL ONLY ONE BUTTON KEY PRESSED
call waitkey
btfss pgm_bit ;EXIT PROGRAM MODE IF PROGRAM KEY PRESSED
goto p_end1
prog_get_1st:
movlw 0x0f ;LOCATE THE FIRST KEY'S BIT ASSERTED
call nextkey
btfsc STATUS,C ;skpnc
goto p_err1 ;ERROR IF INVALID KEY BIT FOUND (pgm_end)
movwf pbid ;STORE POSITION OF ASSERTED BIT
pgm_2:
movlw PLEDON ;SET LED ON NOT BLINKING
bsf STATUS,RP0
movwf pled_cmd
bcf STATUS,RP0
movlw DBC100MS ;SET 0.1MSEC KEY RELEASE DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
movlw BEEP_1 ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
call p_beep ;WAIT UNTIL BEEP FINISHED
movf pbid,W
bsf STATUS,RP0 ; to page 1
movwf force_id
bcf STATUS,RP0
call check_f_id
bsf f_set_force
movlw 0x00 ;WAIT UNTIL DEFINED KEY RELEASE AND NO KEY
call waitkey
btfss pgm_bit ;EXIT IF PROGRAM KEY RELEASED
goto p_end1
movf pbid,W ;LOCATE THE PBID+1 POINTER AS END POINTER
movwf temp_buf3
incf temp_buf3,F
movf temp_buf3,W
; addlw 0x01
call a_ndx
movwf ptr_end
pgm_3:
movlw PBMAX ;LOCATE THE PBMAX POINTER AS THE START POINTER
call a_ndx
movwf ptr_src
movf ptr_end,W
subwf ptr_src,W ;EVALUATE DATA LENGTH TO BE MOVED AND STORE
movwf temp_buf3
incf temp_buf3,F
movf temp_buf3,W
; addlw 0x01 ;TO BUFFER MOV_COUNT WHICH IS USED TO KEEP
movwf mov_count ;COUNTING
movlw MEMTOP ;REDEFINE THE END POINTER AS DESTINATION
movwf ptr_end ;POINTER DURING MEMORY TRANSFER
p_shfu: ;ROUTINE TO SHIFT MEMORY UP TO MEMTOP
call p_timer ;REFRESH TIMER ROUTINE
movf ptr_src,W ;TRANSFER DATA STARTING FROM SOURCE POINTER
movwf FSR
movf INDF,W
movwf mov_buffer
movf ptr_end,W
movwf FSR
movf mov_buffer,W
movwf INDF
decf ptr_src,F
decf ptr_end,F
decfsz mov_count,F
goto p_shfu
incf ptr_end,W ;ADJUST THE END POINTER AND STORE IT AS
movwf ptr_src ;SOURCE POINTER FOR MEMORY REFILLING LATER
movf pbid,W ;LOCATE THE PBID+1 POINTER AS END POINTER
movwf temp_buf3
incf temp_buf3,F
movf temp_buf3,W
; addlw 0x01 ; it is used if exit NOW
call a_ndx
movwf ptr_end
movf pbid,W ;LOCATE THE ASSERTED BIT POINTER
call a_ndx ;AND STORE AS STEP POINTER
movwf ptr_nxt
subwf ptr_src,W ;CALCULATE THE MEMORY FREE FOR PROGRAMMING
bsf STATUS,RP0
movwf mem_free ;AND STORE IT TO BUFFER MEM_FREE
bcf STATUS,RP0
clrf data_length ;RESET STEP LENGTH COUNTER
bcf f_valid_pgm
movlw DBC500MS ;SET 0.5S KEY HOLD DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
pgm_lpx:
btfsc D_A_mode
bsf f_wait_mode
movlw 0x02 ;WAIT FOR KEY(S) PRESSED OR PROGRAM PRESSED
call waitkey
bcf f_wait_mode
btfss pgm_bit ;EXIT IF PROGRAM KEY PRESSED
goto p_end2
btfss o_st_bit ;DO NOT ACCEPT THE FIRST KEY(S) INVOLVING
goto pgm_lpx ;START KEY
btfsc mode_bit
goto pgm_lp1
btfss f_set_force
goto pgm_lpx
goto set_force
pgm_lp1:
bcf f_set_force
pgm_lp:
call p_timer
nop
call coding ;ENCODE KEY(S) AND STORE TO PROGRAM BUFFER
movwf temp_buf1 ;STORE THE STEP LENGTH TO TEMPORARY BUFFER
bcf STATUS,C ;clrc
bsf STATUS,RP0
subwf mem_free,W ;CHECK IF ENOUGH MEMORY TO FIT NEW DATA
bcf STATUS,RP0
btfsc STATUS,C ;bc pgm_4;PROCEED IF ENOUGH MEMORY
goto pgm_4
movlw PLEDMEM ;SET LED FLASHES AT FAST RATE
bsf STATUS,RP0
movwf pled_cmd
bcf STATUS,RP0
movlw BEEP_3 ;SET TO BEEP THREE TIMES
call p_beep ;WAIT UNTIL BEEP FINISHES
movlw PLEDON ;TURN LED PERMANENT ON
bsf STATUS,RP0
movwf pled_cmd
bcf STATUS,RP0
goto pgm_5 ;PROCEED TO WAIT UNTIL KEY(S) RELEASED
pgm_4:
bsf f_valid_pgm ; valid button received
bsf STATUS,RP0
movwf mem_free ;STORE THE UPDATED MEMORY LEFT DATA
bcf STATUS,RP0
movlw PLEDSTEP ;SET LED TO BLINK ONCE
bsf STATUS,RP0
movwf pled_cmd
bcf STATUS,RP0
movlw BEEP_1 ;SET TO BEEP ONCE
call p_beep ;WAIT UNTIL BEEP FINISHES
movlw PGM_BUF_PTR ;SET PROGRAM BUFFER POINTER
movwf temp_buf2 ;USE TEMPORARY BUFFER #2 AS PGM_BUF POINTER
p_store: ;STORE PROGRAM BUFFER TO MEMORY DATA AREA
movf temp_buf2,W
movwf FSR
movf INDF,W
movwf temp_buf3 ;USE TEMPORARY BUFFER #3 TO TRANSFER BUFFER
movf ptr_nxt,W
movwf FSR
movf temp_buf3,W
movwf INDF
incf ptr_nxt,F ;NEXT DESTINATION POINTERS
incf data_length,F ;UPDATE TOTAL DATA LENGTH
decf temp_buf2,F ;NEXT SOURCE POINTER
decfsz temp_buf1,F ;DECREMENT NUMBER OF BYTES STORED AND SKIP
goto p_store ;IF ZERO
movf ptr_nxt,W ;UPDATE END POINTER
movwf ptr_end
movlw PBID_PTR ;UPDATE DATA LENGTH TO PBID DATA LENGTH AREA
addwf pbid,W ;W NOW POINTS AT CORRESPONDING DATA LENGTH
movwf FSR
movf data_length,W
movwf INDF
pgm_5: ;NEXT KEY(S)
movlw DBC100MS ;SET 0.1S KEY RELEASE DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
movlw 0x00 ;WAIT UNTIL ALL KEYS RELEASED OR PGM PRESSED
call waitkey
btfss pgm_bit ;EXIT IF PROGRAM PRESSED
goto p_end2
movlw DBC500MS ;SET 0.5S KEY PRESS DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
btfss f_valid_pgm
goto pgm_lpx
movlw 0x02 ;WAIT UNTIL KEY(S) OR PGM PRESSED
call waitkey
btfsc pgm_bit ;EXIT IF PROGRAM PRESSED
goto pgm_lp
p_end2:
bcf f_set_force
p_shfd: ;ROUTINE TO SHIFT MEMORY DOWN
call p_timer ;REFRESH TIMER ROUTINE
movf ptr_src,W ;TRANSFER DATA STARTING FROM SOURCE POINTER
movwf FSR
movf INDF,W
movwf mov_buffer
movf ptr_end,W
movwf FSR
movf mov_buffer,W
movwf INDF
incf ptr_end,F
bcf STATUS,C ; clrc
incfsz ptr_src,F
goto p_shfd
p_end_to_ee:
call gen_crc_8 ;CALCULATE THE 8-BIT CRC VALUE FOR BUTTON DATA
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -