⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firing.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;****************************************************************************
;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 + -