📄 program.asm
字号:
movf crc_byte,W ;STORE THE CRC VALUE TO DATA_CRC
movwf pb_data_crc
call mem_eep ;COPY RAM DATA TO EEPROM
bcf f_mapbad
p_err1:
p_end1:
movlw BEEP_2 ;BEEP TWICE
call p_beep
movlw PLEDOFF ;TURN LED OFF
bsf STATUS,RP0
movwf pled_cmd
bcf STATUS,RP0
movlw DBC100MS ;SET 0.1S PROGRAM KEY RELEASE DEBOUNCE
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
pgm_lp2:
movlw 0x00 ;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
movwf dur_dbc
movwf tmr_dbc ;RESET DEBOUNCE TIMER
bcf f_time_reset
bcf f_set_force
bcf f_prog_mode
bcf f_wait_mode
call set_auto_mask ; copy pb_auto bit
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:
nop
call countkey
movwf total_bit ;STORE THE NUMBER OF BIT ASSERTED
btfss STATUS,Z ;skpz;DEFAULT SPACE KEY
goto cg_1key
movlw IDLE ;SPACE CODE
movwf 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
nop
call convert_dummy
movwf 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
bcf STATUS,C ;clrc
sublw 0x03 ;SEE IF REPEAT STEP FUNCTION KEY PRESSED
btfss STATUS,C
goto 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
nop
call convert_dummy
movwf 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
call convert_dummy
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
nop
call convert_dummy
movwf 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
nop
call convert_dummy
iorwf pgm_buf1,F ;STORE TO THE LOWER DIGIT OF PROGRAM BUFFER
call nextkey ;LOCATE THE 3RD BIT ASSERTED
nop
call convert_dummy
movwf 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
movwf pgm_buf0 ;LOWEST BYTE OF THE PROGRAM BUFFER
movf pb_old1,W ;LOAD THE HIGHER BYTES KEY INFO FROM PB_OLD
movwf pgm_buf1 ;TO SECOND BYTE OF PROGRAM BUFFER
movf pb_old0,W ;LOAD THE LOWER BYTES KEY INFO FROM PB_OLD
movwf pgm_buf2 ;TO THE HIGHEST BYTE OF PROGRAM BUFFER
btfss pgm_buf1,4 ; convert dummy E1, E2 to L1, L2
bcf pgm_buf2,5
btfss pgm_buf1,5
bcf pgm_buf2,4
bsf pgm_buf1,4
bsf pgm_buf1,5
movlw CODE_3 ;STEP SIZE = 3 BYTES
codggood:
bsf pwmctrl,7 ;enable PWM
return
;--------------------------------------
; set_force:
; programming the force of each button
;--------------------------------------
set_force:
movlw DBC100MS
movwf dur_dbc
movwf tmr_dbc
goto set_force_entry
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
set_force_entry:
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_end2
;------------------------------------
; 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
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
bcf STATUS,RP0
return
;--------------------------------------------
; convert_dummy:
; used to convert key if dummy is pressed
; dummy : E1, E2
; input : W
; output : W
; register used : pforce_0 (ee_io_buf) as tmp
;--------------------------------------------
convert_dummy:
movwf pforce_0
xorlw 0x0c ; E1
btfss STATUS,Z
goto convert_not_0c
movlw 0x05
goto end_convert_dummy
convert_not_0c:
movlw 0x0d ; E2
xorwf pforce_0,W
movlw 0x04
btfss STATUS,Z
movf pforce_0,W ; not E1 or E2
end_convert_dummy:
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -