📄 firing.asm
字号:
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO MASK THE PB_RAW BUFFER TO IMPLEMENT AUTO
; FIRE FUNCTION WHEN AUTO FIRE IS ACTIVATED, PRESSING THAT BUTTON
; WILL ALSO SET THE AUTO LED TO BLINK.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: PRE_KEY
;INPUT: NIL
;OUTPUT: MASK PB_RAW BUFFERS AND PB_OLD BUFFERS TO ALLOW AUTO FIRING
; BLINK AUTO LED IF PRESSED BUTTON IS SET TO AUTO FIRE.
;RAM AFFECTED:
;SUBROUTINE CALL: NIL
;****************************************************************************
;
pre_key:
btfsc f_fire ;SEE IF NOW IS FIRING PERIOD
goto pk_fire_on
movfw pb_auto0
iorwf pb_raw0,F ;AUTO FIRE BUTTON TO GENERATE AUTO FIRE
movfw pb_auto1
iorwf pb_raw1,F
pk_fire_on:
movfw pb_raw0 ;USE PB_OLD = (PB_RAW OR PB_OLD) TO MARK
iorwf pb_old0,F ;THE BUTTON WHICH HAS BEEN PROCESSED BY
movfw pb_raw1 ;THE SCANKEY ROUTINE
iorwf pb_old1,F
return
;
;
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO SCAN THE ASSERTED BIT AND CONVERT IT INTO
; BUTTON PATTERN. IT SCANS THE ASSERTED BIT IN THE PB_RAW BUFFERS.
; IT CHECKS TO SEE IF THE ASSERTED BIT REPRESENTS A MULTI-STEP OR
; A SINGLE STEP BUTTON. IF IT IS A MULTI-STEP BUTTON, IT USES THE
; PB_OLD BUFFERS TO MARK THE PROCESSED BUTTON AND SET THE F_EOB FLAG
; FOR THE FIRESTEP TO PROCESS. IF IT IS A SINGLE STEP, IT WILL COPY
; THE BUTTON PATTERN TO THE PB_OUT BUFFERS.
;FILENAME: C:\PROJECTS\SV363\FIRING.ASM
;ROUTINE NAME: SCANKEY
;INPUT: PB_RAW0, PB_RAW1
;OUTPUT: CLEAR BITS IN PB_OUT0 & PB_OUT1, AND SET F_EOB FLAG FOR SINGLE STEP
; MARKS PROCESSED BITS IN PB_OLD0 & PB_OLD1, AND CLEAR F_EOB FOR
; MULTI-STEP
;RAM AFFECTED: 6AH
;SUBROUTINE CALL: A_NDX, NEXTKEY, DECODE, UPD_EOB,
;****************************************************************************
;
#define sk_buf0 data_length ;LOCATION 6A
;
scankey:
movlw 0xff ;RESET OUTPUT BUFFERS
movw pb_out0
movw pb_out1
bsf f_eob ;PRESET TO SINGLE STEP IN CASE NO BUTTON
movlw 0x0f ;SCAN WHICH BIT ASSERTED FROM THE BEGINNING
call nextkey ;CARRY SET IF NO ASSERTED BIT FOUND
skpnc
goto skeyend ;DO NOTHING IF NO ASSERTED BIT FOUND
skeyloop:
bsf f_pbpress ;SET BUTTON PRESSED FLAG
movw pbid ;STORE THE ASSERTED BIT LOCATION TO PBID
call a_ndx ;LOCATION THE CORRESPONDING DATA POINTER
skpnc ;CARRY SET IF DATA AREA ERROR DETECTED
goto skeyerr
movw ptr_nxt ;STORE THE VALID DATA POINTER TO PTR_NXT
incf pbid,W ;FIND THE NEXT DATA POINTER TO LOCATE THE
call a_ndx ;END POINTER
skpnc
goto skeyerr
movw ptr_end
call decode ;DECODE THE STEP INFO TO BUTTON PATTERN AND
;UPDATE THE NEXT POINTER VALUE
call upd_eob ;CHECK TO SEE IF SINGLE STEP OR LAST BUTTON
;BUTTON DATA REACHED ==> SET F_EOB
btfsc f_eob ;SKIP IF MULTI STEP FOUND
goto skeyovry ;GOTO SINGLE STEP PROCESSING
;
movfw pbid ;USE THE SK_BUF0 AS BIT COUNTER
movw sk_buf0
clrc
sublw d'7' ;SEE IF PBID > 7 --> USE PB_OLD1,ELSE PB_OLD0
skpnc
goto sc_key1 ;USE PB_OLD0 IF BIT COUNTER < OR = 7
movlw d'8' ;ADJUST THE BIT COUNTER
subwf sk_buf0,F
skpz
goto sc_chk9
btfss pb_old1,0 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old1,0 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
movlw 0x1
movw tmr_step ;RESET STEP COUNTER TO ENABLE IMMEDIATE ACTION
goto skeydone
sc_chk9:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk10 ;IF NOT CHECK NEXT BIT
btfss pb_old1,1 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old1,1 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk10:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk11 ;IF NOT CHECK NEXT BIT
btfss pb_old1,2 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old1,2 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk11:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk12 ;IF NOT CHECK NEXT BIT
btfss pb_old1,3 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old1,3 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk12:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk13 ;IF NOT CHECK NEXT BIT
btfss pb_old1,4 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old1,4 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk13:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto skeyerr ;IF NOT, THERE MUST BE ERROR
btfss pb_old1,5 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old1,5 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
;
sc_key1: ;PROCESS PB_OLD0
tstf sk_buf0
skpz
goto sc_chk1
btfss pb_old0,0 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,0 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk1:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk2 ;IF NOT CHECK NEXT BIT
btfss pb_old0,1 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,1 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk2:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk3 ;IF NOT CHECK NEXT BIT
btfss pb_old0,2 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,2 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk3:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk4 ;IF NOT CHECK NEXT BIT
btfss pb_old0,3 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,3 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk4:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk5 ;IF NOT CHECK NEXT BIT
btfss pb_old0,4 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,4 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk5:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk6 ;IF NOT CHECK NEXT BIT
btfss pb_old0,5 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,5 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk6:
decfsz sk_buf0,F ;SEE IF PROCESS THIS BIT
goto sc_chk7 ;IF NOT CHECK NEXT BIT
btfss pb_old0,6 ;SEE IF THAT BIT MARKED
goto skeynext ;IF MARKED, SCAN NEXT ASSERTED BUTTON BIT
bcf pb_old0,6 ;IF NOT, MARK IT AND THEN EXIT THIS ROUTINE
goto skeydone
sc_chk7:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -