📄 program.asm
字号:
movw tmr_dbc ;RESET DEBOUNCE TIMER
pgm_lp2:
movlw 0x0 ;WAIT FOR PROGRAM KEY OFF BEFORE EXIT
call waitkey
btfss pgm_bit
goto pgm_lp2
movlw DBC100MS ;SET DEBOUNCE TIME BACK TO 0.1 SECOND
movw dur_dbc
movw tmr_dbc ;RESET DEBOUNCE TIMER
bcf f_time_reset
bcf PCLATH,3
call init_vars
bsf PCLATH,3
bsf all_intr ;ENABLE ALL INTERRUPTS
return
;
;
;
;
;********************************************************************
;FUNCTION: THIS ROUTINE ENCODES BUTTON(S) PRESSED DURING PROGRAMMING
; PROCEDURES. BUTTON DATA ARE FETCHED FROM PB_OLD BUFFER.
; ENCODED KEYS ARE STORED TO BUFFER "PGM_BUF0" TO "PGM_BUF3"
; ENCODED KEY SIZE IS STORED TO W REGISTER. ENCODING
; ALGORITHM IS:-
; FOR ONE BUTTON STEP - (H = L) < = 14, W=1
; FOR TWO BUTTON STEP - (H != L) < = 13, W=1
; FOR REPEAT STEP - H = 0E; L =0,1,2 OR , W=1
; FOR THREE BUTTON STEP - (H = 0F, L = 1ST KEY),
; (H = 2ND KEY, L = 3RD KEY),
; W = 2
; FOR MORE THAN 3 BUTTON - (H = L = 0F) FOLLOWED BY 2 BYTES
; CONTAINING PB_OLD, W =3
;
;FILENAME: \PROJECTS\SV363\PROGRAM.ASM
;NAME: CODING
;INPUT: PB_OLD
;OUTPUT: PGM_BUF0, PGM_BUF1, PGM_BUF2, W
;RAM AFFECTED: 5FH
;SUBROUTINE CALL: COUNTKEY, NEXTKEY
;******************************************************************
;
;#define total_bit temp_buf3 ;RAM LOCATION 5FH
;
;DEFINING CONSTANT
;IDLE equ 0xee ;IDLE PERIOD
;CODE_1 equ D'01' ;CODED ONE BYTE
;CODE_2 equ D'02' ;CODED TWO BYTES
;CODE_3 equ D'03' ;CODED THREE BYTES
;REPEAT equ 0xef ;REPEAT CODE
coding:
call countkey
movw total_bit ;STORE THE NUMBER OF BIT ASSERTED
skpz ;DEFAULT SPACE KEY
goto cg_1key
movlw IDLE ;SPACE CODE
movw pgm_buf0
movlw CODE_1 ;SIZE ONE BYTE
goto codggood
cg_1key:
decfsz total_bit,F ;SEE IF ONLY ONE KEY PRESSED
goto cg_2key ;PROCEED TO SEE IF TWO KEYS PRESSED
movlw 0x0f ;LOCATE THE FIRST BIT ASSERTED
call nextkey
movw pgm_buf0 ;STORE TO THE FIRST PGM_BUF
swapf pgm_buf0,F ;SHIFT THE LOWER DIGIT UP TO HIGHER DIGIT
iorwf pgm_buf0,F ;MAKE UPPER AND LOWER DIGIT EQUAL
clrc
sublw 0x3 ;SEE IF REPEAT STEP FUNCTION KEY PRESSED
bnc cg_1key_end
btfsc o_st_bit ;SEE IF REPEAT STEP FUNCTION KEYS VALID
goto cg_1key_end ;PROCEED TO END SINGLE KEY PRESSED
movlw 0xf0 ;IF VALID REPEAT STEP, LOAD HIGHER DIGIT
iorwf pgm_buf0,F ;WITH E AND KEEP THE LOWER DIGIT UNCHANGED
bcf pgm_buf0,4
cg_1key_end:
movlw CODE_1 ;STEP SIZE = 1 BYTE
goto codggood
cg_2key:
decfsz total_bit,F ;SEE IF ONLY TWO KEYS PRESSED
goto cg_3key ;PROCEED TO SEE IF TWO KEYS PRESSED
movlw 0x0f ;LOCATE THE FIRST BIT ASSERTED
call nextkey
movw pgm_buf0 ;STORE TO THE FIRST PGM_BUF
swapf pgm_buf0,F ;SHIFT THE LOWER DIGIT UP TO HIGHER DIGIT
call nextkey ;LOCATE THE 2ND ASSERTED BIT
iorwf pgm_buf0,F ;STORE TO THE LOWER DIGIT OF PROGRAM BUFFER
movlw CODE_1 ;STEP SIZE = 1 BYTE
goto codggood
cg_3key:
decfsz total_bit,F ;SEE IF ONLY THREE KEYS PRESSED
goto cg_4key ;IF NOT, PROCEED TO CHECK 4 KEYS
movlw 0x0f ;LOCATE THE FIRST BIT ASSERTED
call nextkey
movw pgm_buf1 ;STORE TO THE PGM_BUF1
swapf pgm_buf1,F ;SHIFT THE LOWER DIGIT UP TO HIGHER DIGIT
call nextkey ;LOCATE THE 2ND ASSERTED BIT
iorwf pgm_buf1,F ;STORE TO THE LOWER DIGIT OF PROGRAM BUFFER
call nextkey ;LOCATE THE 3RD BIT ASSERTED
movw pgm_buf0 ;STORE TO THE PGM_BUF0
movlw 0xf0 ;LOAD THE HIGHER DIGIT OF THE PGM_BUF0
iorwf pgm_buf0,F ;TO F
movlw CODE_2 ;STEP SIZE = 2 BYTES
goto codggood
cg_4key:
movlw 0xff ;STORE THE FOUR KEYS ASSETED CODE TO THE
movw pgm_buf0 ;LOWEST BYTE OF THE PROGRAM BUFFER
movfw pb_old1 ;LOAD THE HIGHER BYTES KEY INFO FROM PB_OLD
movw pgm_buf1 ;TO SECOND BYTE OF PROGRAM BUFFER
movfw pb_old0 ;LOAD THE LOWER BYTES KEY INFO FROM PB_OLD
movw pgm_buf2 ;TO THE HIGHEST BYTE OF PROGRAM BUFFER
movlw CODE_3 ;STEP SIZE = 3 BYTES
codggood:
return
;--------------------------------------
; set_force:
; programming the force of each button
;--------------------------------------
set_force:
movlw BEEP_1 ;BEEP ONCE
call p_beep
movlw DUR_AUTO
movwf tmr_auto
movf pbid,W
bsf STATUS,RP0 ; to page 1
movwf force_id
call check_f_id
bsf f_set_force
movlw DBC100MS
movwf dur_dbc
movwf tmr_dbc
movlw 0x00
call waitkey ; wait for key release
get_force_lp2:
bsf f_wait_mode
movlw 0x01
call waitkey
bcf f_wait_mode
btfss pgm_bit
goto end_set_force
btfsc mode_bit
goto get_force_lp2
movlw BEEP_1 ;BEEP ONCE
call p_beep
incf pforce_0,F
movf pforce_0,W
sublw d'2'
btfss STATUS,C
clrf pforce_0
bsf f_wait_mode
movlw 0x00
call waitkey ; wait for key release
goto get_force_lp2
end_set_force:
movlw b'11111100'
movwf pforce_1
bsf STATUS,RP0
movf force_id,W ; 0 ~ 3
btfsc STATUS,Z
goto get_force_pos
chk_force_lp2:
bcf STATUS,RP0
bcf STATUS,C
rlf pforce_0,F
bcf STATUS,C
rlf pforce_0,F
bsf STATUS,C
rlf pforce_1,F
rlf pforce_1,F
bsf STATUS,RP0
decfsz force_id,F
goto chk_force_lp2
get_force_pos: ; place to bu_force
bsf STATUS,RP0
movf force_tmp1,W
bcf STATUS,RP0
movwf FSR
movf pforce_1,W
andwf INDF,F
movf pforce_0,W
iorwf INDF,F
bcf f_set_force
goto p_end1
;------------------------------------
; check_f_id:
; get the force setting
; input : put pbid to force_id
; output : result place in pforce_0
;------------------------------------
check_f_id:
bsf STATUS,RP0
movlw bu_force1
movwf FSR
movf force_id,W
sublw d'3'
btfsc STATUS,C
goto checked_id
check_f_id1:
incf FSR,F ; pbid > 3
movf force_id,W
sublw d'7'
btfss STATUS,C
goto check_f_id2
movlw d'4'
subwf force_id,F
goto checked_id
check_f_id2:
incf FSR,F ; pbid > 7
movf force_id,W
sublw d'11'
btfss STATUS,C
goto check_f_id3
movlw d'8'
subwf force_id,F
goto checked_id
check_f_id3: ; pbid > 11
incf FSR,F
movlw d'12'
subwf force_id,F
checked_id:
movf FSR,W
; bsf STATUS,RP0 ; already in page 1
movwf force_tmp1
bcf STATUS,RP0
movf INDF,W
movwf pforce_0
bsf STATUS,RP0
movf force_id,W ; 0 ~ 3
bcf STATUS,RP0
movwf pforce_1
btfsc STATUS,Z
goto get_force_v
chk_force_lp1:
rrf pforce_0,F
rrf pforce_0,F
decfsz pforce_1,F
goto chk_force_lp1
get_force_v:
movlw 0x03
andwf pforce_0,F
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -