📄 pgm.asm
字号:
;----------------------------
; PROGRAM FIRE PERIOD
;-----------------------------
pgm_fire:
movf key_raw1,W
bsf STATUS,RP0
movwf pgm_temp1
bcf STATUS,RP0
movf key_raw0,W
bsf STATUS,RP0
movwf pgm_temp0
bcf STATUS,RP0
bsf STATUS,RP0
movlw 0xff
xorwf pgm_raw1,W
btfss STATUS,Z
goto pgm_main
movlw 0xff
xorwf pgm_raw0,W
btfss STATUS,Z
goto pgm_main
bcf STATUS,RP0
return
;loop which key pressed and call out key function
pgm_main:
; bcf PCLATH,3
; call conver_raw_to_out
; bsf PCLATH,3
bsf STATUS,RP0 ;All in RAM page 1
movlw 0x08
movwf pgm_lp_count
clrf pgm_stage ;key stage value
clrf pgm_steps ;No. of steps for each
movlw 0x01
movwf pgm_lp_temp ;temp data for loop count
movlw 0x08 ;0108h
movwf pgm_N_step ;start address for Digital mode (EEPROM)
btfss D_A_mode ;L=digital mode
goto pgm_lp1 ;set=analogy mode
movlw 0x50 ;0150h
movwf pgm_N_step ;start address for Analog mode (EEPROM)
movlw pgm_stage_1st ;start address of pgm_stage
movwf FSR
pgm_lp1:
movf indf,W
movwf temp_stage
clrf pgm_force ;----------------
btfss temp_stage,7 ;;Force Factor Setting
goto check_force1 ;
movlw 0xff ;
movwf pgm_force ;
goto check_pgm_step ;
;
check_force1: ;
btfss temp_stage,6 ;
goto check_pgm_step ;
movlw 0x7f ;
movwf pgm_force ;
;
check_pgm_step: ;-----------------
bcf temp_stage,7 ;Mask start and select key
bcf temp_stage,6 ;----------------
;--------------------
movf temp_stage,W ; Store PGM_steps
movwf pgm_steps ;no. of step for each
;----------------
pgm_lp_first:
movf pgm_lp_temp,W
bcf STATUS,RP0
andwf key_raw1,W
bsf STATUS,RP0
;with force and no. of step
btfsc STATUS,Z
call pgm_key_out ;have pgm key pressed, call out key routine
bcf STATUS,C ;Clear Carry flag for loop count
rlf pgm_lp_temp,F
movf pgm_steps,W
addwf pgm_steps,F ;X2
movf pgm_steps,W
addwf pgm_N_step,F ;next Starting Address
incf fsr,f ;key no pressed, increase fsr point
decfsz pgm_lp_count,f
goto pgm_lp1
;2nd pgm loop
movlw 0x06
movwf pgm_lp_count
movlw 0x01
movwf pgm_lp_temp ;temp 0x01 for loop count
movlw pgm_stage_2nd ;start address of pgm_stage
movwf FSR
pgm_lp2:
movf indf,W
movwf temp_stage
clrf pgm_force ;------------------
;check Force Factor
btfss temp_stage,7 ;
goto check_force2 ;
movlw 0xff ;
movwf pgm_force ;
goto check_pgm_step2 ;
;
check_force2: ;
btfss temp_stage,6 ;
goto check_pgm_step2 ;
movlw 0x7f ;
movwf pgm_force ;
;-----------------
check_pgm_step2:
bcf temp_stage,7 ;Mask Data
bcf temp_stage,6 ;Mask Data
movf temp_stage,W ;Store pgm_steps
movwf pgm_steps
pgm_lp_second:
movf pgm_lp_temp,W
bcf STATUS,RP0
andwf key_raw0,W
bsf STATUS,RP0
btfsc STATUS,C ;key pressed?
call pgm_key_out ;Yes. Call pgm_key_out
bcf STATUS,C ;Clear Carry flag for loop count
rlf pgm_lp_temp,F
movf pgm_steps,W
addwf pgm_steps,F ;X2
movf pgm_steps,W
addwf pgm_N_step,F
incf fsr,f ;Increase FSR
decfsz pgm_lp_count,F ;check finished 6?
goto pgm_lp2
clrf pgm_N_step
clrf pgm_steps ;No. of steps for each
bcf STATUS,RP0
return
pgm_exit:
bcf STATUS,RP0
return
;===================================================
pgm_key_out:
;pgm_N_step = Starting address of pgm key out
;pgm_steps = no. of steps need to send out
;pgm_force = force factor for keys
;key_out0 = what key out
;key_out1 = what key out
movf fsr,W ;save FSR for temp
movwf pgm_fsr
movf pgm_steps,W
btfsc STATUS,Z ;check pgm_steps, 0?
goto pgm_no_steps ;Yes, goto
;check pgm_steps = 1?
movlw 0x01
subwf pgm_steps,W
btfsc STATUS,Z
goto pgm_1_steps
;pgm_steps = 2 or more. Send out pgm data to SIO?
pgm_out_lp:
;Read EEPROM DATA for PGM OUT
movf pgm_N_step,W ;Starting address
change_to_page2 ;marco for change RAM page
movwf FSR
movf indf,W
change_back_page1 ;marco for change RAM page
movwf pgm_out0 ;low byte for pgm_out data from EEPROM
incf fsr,F ;increase FSR +1
change_to_page2 ;marco for change RAM page
movf indf,W
change_back_page1
movwf pgm_out1
;check pgm data is space
btfsc pgm_start_out
goto pgm_copy_data
movlw 0xff
movwf pgm_out0
movwf pgm_out1
pgm_copy_data:
movf pgm_out0,W ;copy to key_out for SIO
movwf pgm_out_old0 ;store data for next time
bcf STATUS,RP0
movwf key_out0
bsf STATUS,RP0
movf pgm_out1,W ;copy to key_out for SIO
movwf pgm_out_old1 ;store data for next time
bcf STATUS,RP0
movwf key_out1
bsf STATUS,RP0
bcf STATUS,RP0
bsf pgm_led ;call mapkey
bsf STATUS,RP0
bcf PCLATH,3 ;for update SIO data
call mapkey
bsf PCLATH,3
bcf tmrctrl,tmr_en ;Stop timer
bsf tmrctrl,tmr_en ;Start again timer
pgm_count_lp:
btfss tmrcnt,3 ;to count 64ms for next data out
goto pgm_count_lp
nop
nop
bcf STATUS,RP0
bcf pgm_led
bsf STATUS,RP0
incf fsr,F ;increase FSR +1
decfsz pgm_N_step,F
goto pgm_out_lp
pgm_out_exit:
movf pgm_fsr,W
movwf fsr
return
;===================================================
;--------------------------------------
; No pgm data, out same key_out
;--------------------------------------
pgm_no_steps:
movf pgm_fsr,W
movwf fsr
return
;-----------------------------------------
; pgm data = 1. Means relocte to other key
; need change force factor
;-----------------------------------------
pgm_1_steps:
movf pgm_N_step,W ;Starting address
change_to_page2 ;marco for change RAM page
movwf FSR
movf indf,W
change_back_page1 ;marco for change RAM page
movwf pgm_out0 ;low byte for pgm_out data from EEPROM
incf fsr,F ;increase FSR +1
change_to_page2 ;marco for change RAM page
movf indf,W
change_back_page1
movwf pgm_out1
movf pgm_out0,W ;copy to key_out for SIO
bcf STATUS,RP0
movwf key_out0
bsf STATUS,RP0
movf pgm_out1,W ;copy to key_out for SIO
bcf STATUS,RP0
movwf key_out1
bsf STATUS,RP0
call pgm_map_force
movf pgm_fsr,W
movwf fsr
return
;-------------------------------------------
; Force Factor out
;-------------------------------------------
pgm_map_force:
pgm_map_square:
btfsc pgm_square_out
goto pgm_map_X
btfsc pgm_force,7
goto pgm_map_square2
btfss pgm_force,0
goto pgm_map_X
pgm_map_square1:
movlw 0x7F
subwf square_val,W
btfss STATUS,C
goto pgm_map_X
movlw 0x7F
movwf square_val
goto pgm_map_X
pgm_map_square2:
movlw 0xff
movwf square_val
;-----------------
pgm_map_X:
btfsc pgm_X_out
goto pgm_map_O
btfsc pgm_force,7
goto pgm_map_X2
btfss pgm_force,0
goto pgm_map_O
pgm_map_X1:
movlw 0x7F
subwf X_val,W
btfss STATUS,C
goto pgm_map_O
movlw 0x7F
movwf X_val
goto pgm_map_O
pgm_map_X2:
movlw 0xff
movwf X_val
;-------------------
pgm_map_O:
btfsc pgm_O_out
goto pgm_map_tri
btfsc pgm_force,7
goto pgm_map_O2
btfss pgm_force,0
goto pgm_map_tri
pgm_map_O1:
movlw 0x7F
subwf O_val,W
btfss STATUS,C
goto pgm_map_tri
movlw 0x7F
movwf O_val
goto pgm_map_tri
pgm_map_O2:
movlw 0xff
movwf O_val
;-------------------
pgm_map_tri:
btfsc pgm_tri_out
goto pgm_map_R1
btfsc pgm_force,7
goto pgm_map_tri2
btfss pgm_force,0
goto pgm_map_R1
pgm_map_tri1:
movlw 0x7F
subwf tri_val,W
btfss STATUS,C
goto pgm_map_R1
movlw 0x7F
movwf tri_val
goto pgm_map_R1
pgm_map_tri2:
movlw 0xff
movwf tri_val
;-------------------
pgm_map_R1:
btfsc pgm_R1_out
goto pgm_map_L1
btfsc pgm_force,7
goto pgm_map_R12
btfss pgm_force,0
goto pgm_map_L1
pgm_map_R11:
movlw 0x7F
subwf R1_val,W
btfss STATUS,C
goto pgm_map_L1
movlw 0x7F
movwf R1_val
goto pgm_map_L1
pgm_map_R12:
movlw 0xff
movwf R1_val
;-------------------
pgm_map_L1:
btfsc pgm_L1_out
goto pgm_map_R2
btfsc pgm_force,7
goto pgm_map_L12
btfss pgm_force,0
goto pgm_map_R2
pgm_map_L11:
movlw 0x7F
subwf L1_val,W
btfss STATUS,C
goto pgm_map_R2
movlw 0x7F
movwf L1_val
goto pgm_map_R2
pgm_map_L12:
movlw 0xff
movwf L1_val
;-------------------
pgm_map_R2:
btfsc pgm_R2_out
goto pgm_map_L2
btfsc pgm_force,7
goto pgm_map_R22
btfss pgm_force,0
goto pgm_map_L2
pgm_map_R21:
movlw 0x7F
subwf R2_val,W
btfss STATUS,C
goto pgm_map_L2
movlw 0x7F
movwf R2_val
goto pgm_map_L2
pgm_map_R22:
movlw 0xff
movwf R2_val
;-------------------
pgm_map_L2:
btfsc pgm_L2_out
goto pgm_map_left
btfsc pgm_force,7
goto pgm_map_L22
btfss pgm_force,0
goto pgm_map_left
pgm_map_L21:
movlw 0x7F
subwf L2_val,W
btfss STATUS,C
goto pgm_map_left
movlw 0x7F
movwf L2_val
goto pgm_map_left
pgm_map_L22:
movlw 0xff
movwf L2_val
;-------------------
pgm_map_Left:
btfsc pgm_left_out
goto pgm_map_down
btfsc pgm_force,7
goto pgm_map_left2
btfss pgm_force,0
goto pgm_map_down
pgm_map_left1:
movlw 0x7F
subwf left_val,W
btfss STATUS,C
goto pgm_map_down
movlw 0x7F
movwf left_val
goto pgm_map_down
pgm_map_Left2:
movlw 0xff
movwf left_val
;-------------------
pgm_map_down:
btfsc pgm_down_out
goto pgm_map_right
btfsc pgm_force,7
goto pgm_map_down2
btfss pgm_force,0
goto pgm_map_right
pgm_map_down1:
movlw 0x7F
subwf down_val,W
btfss STATUS,C
goto pgm_map_right
movlw 0x7F
movwf down_val
goto pgm_map_right
pgm_map_down2:
movlw 0xff
movwf down_val
;-------------------
pgm_map_right:
btfsc pgm_right_out
goto pgm_map_up
btfsc pgm_force,7
goto pgm_map_right2
btfss pgm_force,0
goto pgm_map_up
pgm_map_right1:
movlw 0x7F
subwf right_val,W
btfss STATUS,C
goto pgm_map_up
movlw 0x7F
movwf right_val
goto pgm_map_up
pgm_map_right2:
movlw 0xff
movwf down_val
;-------------------
pgm_map_up:
btfsc pgm_up_out
return
btfsc pgm_force,7
goto pgm_map_up2
btfss pgm_force,0
return
pgm_map_up1:
movlw 0x7F
subwf up_val,W
btfss STATUS,C
return
movlw 0x7F
movwf up_val
return
pgm_map_up2:
movlw 0xff
movwf up_val
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -