📄 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
;INPUT: NIL
;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
;all_intr equ INTCON,GIE ;GLOBAL INTERRUPT ENABLE BIT
;crc_byte equ 0x6f ;BUFFER FOR CRC VALUE
;mov_count equ 0x6e ;COUNTER NO. OF BYTES TO BE MOVED
;mov_buffer equ 0x6d ;TEMPORARY BUFFER FOR DATA MOVE
;mem_free equ 0x6c ;MEMORY FREE LEFT FOR DATA
;ptr_nxt equ 0x6b ;CURRENT STEP POINTER
;data_length equ 0x6a ;DATA LENGTH FOR A STEP
;pgm_buf0 equ 0x69 ;LOWEST ORDER BYTE OF ENCODE KEY(S)
;pgm_buf1 equ 0x68 ;MIDDLE ORDER BYTE OF ENCODE KEY(S)
;pgm_buf2 equ 0x67 ;HIGHEST ORDER BYTE OF ENCODE KEY(S)
;temp_buf1 equ 0x66 ;TEMPORARY BUFFER #1
;temp_buf2 equ 0x65 ;TEMPORARY BUFFER #2
;pb_data_crc equ 0x7f ;CRC FOR BUTTON DATA
;DEFINE CONSTANT NAMES
;BEEP_2 equ D'002' ;BEEP ONCE
;BEEP_1 equ D'001' ;BEEP TWICE
;BEEP_3 equ D'003' ;BEEP THREE TIMES
;PGM_BUF_PTR equ H'069' ;POINTER POINTS AT PGM_BUF0
;PBID_PTR equ H'06f' ;POINTER POINTS AT FIRST PBID DATA LENGTH
;
procpgm:
movlw DBC500MS ;SET 0.5MSEC KEY RELEASE DEBOUNCE
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
bcf f_keystb ;CLEAR KEY STABLE FLAG
pgm_dbc:
;$$$$$$$$$$$$$$$$$
call readport
;$$$$$$$$$$$$$$$$$
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 all_intr ;DISABLE ALL INTERRUPTS
btfsc all_intr ;REPEAT THIS STEP TO ENSURE DISABLE VALID
goto pgm_int_off
;
bsf f_dbcpb ;INCLUDE FIRE BUTTON DEBOUNCE
;
bcf STATUS,RP0 ;USE RAM BANK 0
;
movlw 0x1 ;RESET PLED COUNTER -> START FLASH IMMEDIATE
movw tmr_pled
movlw PLED1ST ;SET SLOW FLASHING PROGRAM LED
movw pled_cmd
movlw DBC100MS ;SET 0.1MSEC KEY RELEASE DEBOUNCE
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
movlw BEEP_2 ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
call p_beep ;WAIT UNTIL BEEP FINISHED
wpgmoff:
movlw 0x0 ;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
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
; bsf f_wait_mode
movlw 0x1 ;WAIT UNTIL ONLY ONE BUTTON KEY PRESSED
call waitkey
; bcf f_wait_mode
btfss pgm_bit ;EXIT PROGRAM MODE IF PROGRAM KEY PRESSED
goto p_end1
; btfsc mode_bit
; goto prog_get_1st
; call set_force
; goto p_end1
prog_get_1st:
movlw 0x0f ;LOCATE THE FIRST KEY'S BIT ASSERTED
call nextkey
skpnc
goto p_err1 ;ERROR IF INVALID KEY BIT FOUND
movw pbid ;STORE POSITION OF ASSERTED BIT
pgm_2:
movlw PLEDON ;SET LED ON NOT BLINKING
movw pled_cmd
movlw DBC100MS ;SET 0.1MSEC KEY RELEASE DEBOUNCE
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
movlw BEEP_1 ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
call p_beep ;WAIT UNTIL BEEP FINISHED
movlw 0x0 ;WAIT UNTIL DEFINED KEY RELEASE AND NO KEY
call waitkey
btfss pgm_bit ;EXIT IF PROGRAM KEY RELEASED
goto p_end1
movfw pbid ;LOCATE THE PBID+1 POINTER AS END POINTER
addlw 0x1
call a_ndx
movw ptr_end
pgm_3:
movlw PBMAX ;LOCATE THE PBMAX POINTER AS THE START POINTER
call a_ndx
movw ptr_src
movfw ptr_end
subwf ptr_src,W ;EVALUATE DATA LENGTH TO BE MOVED AND STORE
addlw 0x1 ;TO BUFFER MOV_COUNT WHICH IS USED TO KEEP
movw mov_count ;COUNTING
movlw MEMTOP ;REDEFINE THE END POINTER AS DESTINATION
movw ptr_end ;POINTER DURING MEMORY TRANSFER
p_shfu: ;ROUTINE TO SHIFT MEMORY UP TO MEMTOP
call p_timer ;REFRESH TIMER ROUTINE
movfw ptr_src ;TRANSFER DATA STARTING FROM SOURCE POINTER
movw FSR
movfw INDF
movw mov_buffer
movfw ptr_end
movw FSR
movfw mov_buffer
movw 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
movw ptr_src ;SOURCE POINTER FOR MEMORY REFILLING LATER
movfw pbid ;LOCATE THE ASSERTED BIT POINTER
call a_ndx ;AND STORE AS STEP POINTER
movw ptr_nxt
subwf ptr_src,W ;CALCULATE THE MEMORY FREE FOR PROGRAMMING
movw mem_free ;AND STORE IT TO BUFFER MEM_FREE
; movfw ptr_step ;DEFINE MEXT STEP POINTER AS CURRENT POINTER
; movw ptr_nxt
clrf data_length ;RESET STEP LENGTH COUNTER
movlw DBC500MS ;SET 0.5S KEY HOLD DEBOUNCE
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
pgm_lpx:
btfsc D_A_mode
bsf f_wait_mode
movlw 0x2 ;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
btfss mode_bit
goto set_force
pgm_lp:
call p_timer
call coding ;ENCODE KEY(S) AND STORE TO PROGRAM BUFFER
movw temp_buf1 ;STORE THE STEP LENGTH TO TEMPORARY BUFFER
clrc
subwf mem_free,W ;CHECK IF ENOUGH MEMORY TO FIT NEW DATA
bc pgm_4 ;PROCEED IF ENOUGH MEMORY
movlw PLEDMEM ;SET LED FLASHES AT FAST RATE
movw pled_cmd
movlw BEEP_3 ;SET TO BEEP THREE TIMES
call p_beep ;WAIT UNTIL BEEP FINISHES
movlw PLEDON ;TURN LED PERMANENT ON
movw pled_cmd
goto pgm_5 ;PROCEED TO WAIT UNTIL KEY(S) RELEASED
pgm_4:
movw mem_free ;STORE THE UPDATED MEMORY LEFT DATA
movlw PLEDSTEP ;SET LED TO BLINK ONCE
movw pled_cmd
movlw BEEP_1 ;SET TO BEEP ONCE
call p_beep ;WAIT UNTIL BEEP FINISHES
movlw PGM_BUF_PTR ;SET PROGRAM BUFFER POINTER
movw temp_buf2 ;USE TEMPORARY BUFFER #2 AS PGM_BUF POINTER
p_store: ;STORE PROGRAM BUFFER TO MEMORY DATA AREA
movfw temp_buf2
movw FSR
movfw INDF
movw temp_buf3 ;USE TEMPORARY BUFFER #3 TO TRANSFER BUFFER
movfw ptr_nxt
movw FSR
movfw temp_buf3
movw 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
movfw ptr_nxt ;UPDATE END POINTER
movw ptr_end
movlw PBID_PTR ;UPDATE DATA LENGTH TO PBID DATA LENGTH AREA
addwf pbid,W ;W NOW POINTS AT CORRESPONDING DATA LENGTH
movw FSR
movfw data_length
movw INDF
pgm_5: ;NEXT KEY(S)
movlw DBC100MS ;SET 0.1S KEY RELEASE DEBOUNCE
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
movlw 0x0 ;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
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
movlw 0x2 ;WAIT UNTIL KEY(S) OR PGM PRESSED
call waitkey
btfsc pgm_bit ;EXIT IF PROGRAM PRESSED
goto pgm_lp
p_end2:
p_shfd: ;ROUTINE TO SHIFT MEMORY DOWN
call p_timer ;REFRESH TIMER ROUTINE
movfw ptr_src ;TRANSFER DATA STARTING FROM SOURCE POINTER
movw FSR
movfw INDF
movw mov_buffer
movfw ptr_end
movw FSR
movfw mov_buffer
movw INDF
incf ptr_end,F
clrc
incfsz ptr_src,F
goto p_shfd
call gen_crc_8 ;CALCULATE THE 8-BIT CRC VALUE FOR BUTTON DATA
movfw crc_byte ;STORE THE CRC VALUE TO DATA_CRC
movw pb_data_crc
call mem_eep ;COPY RAM DATA TO EEPROM
p_err1:
p_end1:
movlw BEEP_2 ;BEEP TWICE
call p_beep
movlw PLEDOFF ;TURN LED OFF
movw pled_cmd
bcf mode_led2
movlw DBC100MS ;SET 0.1S PROGRAM KEY RELEASE DEBOUNCE
movw dur_dbc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -