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

📄 program.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;******************************************************************
;FUNCTION: THIS ROUTINE INITIALIZES BUTTON PROGRAMMING PROCEDURES
;          ALLOWING USERS TO MODIFY BUTTON DATA RAM AND UPDATE EERPOM
;          DATA.
;FILENAME: \PROJECTS\SV363\PROGRAM.ASM
;NAME: PROCPGM
;INPUT: NIL
;OUTPUT: RAM AREA DATA MEMORY AND EEPROM UPDATED
;RAM USAGE: BANK 1 - 0A6H TO 0FFH TOTAL 90 BYTES FOR BUTTON DATA
;           BANK 0 - 070H TO 07FH TOTAL 16 BYTES FOR CONTROL DATA
;           BANK 0 - 060H TO 06FH TOTAL 16 BYTES AS SCRATCHPAD RAM
;SUBROUTINE CALLS: P_BEEP, NEXTKEY, A_NDX, WAITKEY, P_TIMER,
;                  CODING, GEN_CRC_8 AND MEM_EEP.
;******************************************************************
;
;
;DEFINE VARIABLE NAMES
;all_intr        equ     INTCON,GIE      ;GLOBAL INTERRUPT ENABLE BIT
;crc_byte        equ     0x6f            ;BUFFER FOR CRC VALUE
;mov_count       equ     0x6e            ;COUNTER NO. OF BYTES TO BE MOVED
;mov_buffer      equ     0x6d            ;TEMPORARY BUFFER FOR DATA MOVE
;mem_free        equ     0x6c            ;MEMORY FREE LEFT FOR DATA
;ptr_nxt         equ     0x6b            ;CURRENT STEP POINTER
;data_length     equ     0x6a            ;DATA LENGTH FOR A STEP
;pgm_buf0        equ     0x69            ;LOWEST ORDER BYTE OF ENCODE KEY(S)
;pgm_buf1        equ     0x68            ;MIDDLE ORDER BYTE OF ENCODE KEY(S)
;pgm_buf2        equ     0x67            ;HIGHEST ORDER BYTE OF ENCODE KEY(S)
;temp_buf1       equ     0x66            ;TEMPORARY BUFFER #1
;temp_buf2       equ     0x65            ;TEMPORARY BUFFER #2
;pb_data_crc     equ     0x7f            ;CRC FOR BUTTON DATA


;DEFINE CONSTANT NAMES
;BEEP_2          equ     D'002'          ;BEEP ONCE
;BEEP_1          equ     D'001'          ;BEEP TWICE
;BEEP_3          equ     D'003'          ;BEEP THREE TIMES
;PGM_BUF_PTR     equ     H'069'          ;POINTER POINTS AT PGM_BUF0
;PBID_PTR        equ     H'06f'          ;POINTER POINTS AT FIRST PBID DATA LENGTH
;
procpgm:
        movlw   DBC500MS        ;SET 0.5MSEC KEY RELEASE DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER
        bcf     f_keystb        ;CLEAR KEY STABLE FLAG
pgm_dbc:
;$$$$$$$$$$$$$$$$$
	call	readport
;$$$$$$$$$$$$$$$$$
	call    p_timer         ;DEBOUCE PROGRAM KEY FOR 0.5 SECOND
        btfss   f_keystb        ;IF PROGRAM RELEASES WITHIN THE DEBOUNCE TIME
        goto    pgm_dbc         ;THE PROGRAM ROUTINE WILL EXIT WITHOUT DOING
        btfsc   pgm_bit         ;ANYTHING
        return
;
pgm_int_off:        
        bcf     all_intr        ;DISABLE ALL INTERRUPTS
        btfsc   all_intr        ;REPEAT THIS STEP TO ENSURE DISABLE VALID
        goto    pgm_int_off
;
        bsf     f_dbcpb         ;INCLUDE FIRE BUTTON DEBOUNCE
;
        bcf     STATUS,RP0      ;USE RAM BANK 0
;
        movlw   0x1             ;RESET PLED COUNTER -> START FLASH IMMEDIATE
        movw    tmr_pled
        movlw   PLED1ST         ;SET SLOW FLASHING PROGRAM LED
        movw    pled_cmd
        movlw   DBC100MS        ;SET 0.1MSEC KEY RELEASE DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER
        movlw   BEEP_2          ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
        call    p_beep          ;WAIT UNTIL BEEP FINISHED

wpgmoff:
        movlw   0x0             ;WAIT UNTIL PROGRAM KEY RELEASE AND NO KEY
        call    waitkey
        btfss   pgm_bit         ;EXIT WAIT LOOP IF PROGRAM KEY RELEASED
        goto    wpgmoff

        movlw   DBC200MS        ;SET 0.2MSEC KEY PRESSED DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER

;	bsf	f_wait_mode
	        
        movlw   0x1             ;WAIT UNTIL ONLY ONE BUTTON KEY PRESSED
        call    waitkey
;	bcf	f_wait_mode
        btfss   pgm_bit         ;EXIT PROGRAM MODE IF PROGRAM KEY PRESSED
        goto    p_end1

;	btfsc	mode_bit
;	goto	prog_get_1st
;	call	set_force
;	goto	p_end1

prog_get_1st:
        movlw   0x0f            ;LOCATE THE FIRST KEY'S BIT ASSERTED
        call    nextkey
        skpnc
        goto    p_err1          ;ERROR IF INVALID KEY BIT FOUND
        movw    pbid            ;STORE POSITION OF ASSERTED BIT
pgm_2:
        movlw   PLEDON          ;SET LED ON NOT BLINKING
        movw    pled_cmd
        movlw   DBC100MS        ;SET 0.1MSEC KEY RELEASE DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER
        movlw   BEEP_1          ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
        call    p_beep          ;WAIT UNTIL BEEP FINISHED

        movlw   0x0             ;WAIT UNTIL DEFINED KEY RELEASE AND NO KEY
        call    waitkey
        btfss   pgm_bit         ;EXIT IF PROGRAM KEY RELEASED
        goto    p_end1

        movfw   pbid            ;LOCATE THE PBID+1 POINTER AS END POINTER
        addlw   0x1             
        call    a_ndx
        movw    ptr_end

pgm_3:
        movlw   PBMAX           ;LOCATE THE PBMAX POINTER AS THE START POINTER
        call    a_ndx
        movw    ptr_src
        
        movfw   ptr_end
        subwf   ptr_src,W       ;EVALUATE DATA LENGTH TO BE MOVED AND STORE
        addlw   0x1             ;TO BUFFER MOV_COUNT WHICH IS USED TO KEEP 
        movw    mov_count       ;COUNTING
        
        movlw   MEMTOP          ;REDEFINE THE END POINTER AS DESTINATION
        movw    ptr_end         ;POINTER DURING MEMORY TRANSFER

p_shfu:                         ;ROUTINE TO SHIFT MEMORY UP TO MEMTOP
        call    p_timer         ;REFRESH TIMER ROUTINE
        movfw   ptr_src         ;TRANSFER DATA STARTING FROM SOURCE POINTER
        movw    FSR
        movfw   INDF
        movw    mov_buffer
        movfw   ptr_end
        movw    FSR
        movfw   mov_buffer
        movw    INDF
        decf    ptr_src,F
        decf    ptr_end,F
        decfsz  mov_count,F
        goto    p_shfu

        incf    ptr_end,W       ;ADJUST THE END POINTER AND STORE IT AS
        movw    ptr_src         ;SOURCE POINTER FOR MEMORY REFILLING LATER

        movfw   pbid            ;LOCATE THE ASSERTED BIT POINTER
        call    a_ndx           ;AND STORE AS STEP POINTER
        movw    ptr_nxt
        
        subwf   ptr_src,W       ;CALCULATE THE MEMORY FREE FOR PROGRAMMING
        movw    mem_free        ;AND STORE IT TO BUFFER MEM_FREE

;        movfw   ptr_step        ;DEFINE MEXT STEP POINTER AS CURRENT POINTER
;        movw    ptr_nxt

        clrf    data_length     ;RESET STEP LENGTH COUNTER

        movlw   DBC500MS        ;SET 0.5S KEY HOLD DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER

pgm_lpx:
	btfsc	D_A_mode
	bsf	f_wait_mode
        movlw   0x2             ;WAIT FOR KEY(S) PRESSED OR PROGRAM PRESSED
        call    waitkey
        bcf	f_wait_mode
        btfss   pgm_bit         ;EXIT IF PROGRAM KEY PRESSED
        goto    p_end2
        btfss   o_st_bit        ;DO NOT ACCEPT THE FIRST KEY(S) INVOLVING
        goto    pgm_lpx         ;START KEY

        btfss	mode_bit
        goto	set_force

pgm_lp:
        call    p_timer
        call    coding          ;ENCODE KEY(S) AND STORE TO PROGRAM BUFFER
        movw    temp_buf1       ;STORE THE STEP LENGTH TO TEMPORARY BUFFER
        clrc
        subwf   mem_free,W      ;CHECK IF ENOUGH MEMORY TO FIT NEW DATA
        bc      pgm_4           ;PROCEED IF ENOUGH MEMORY

        movlw   PLEDMEM         ;SET LED FLASHES AT FAST RATE
        movw    pled_cmd
        movlw   BEEP_3          ;SET TO BEEP THREE TIMES
        call    p_beep          ;WAIT UNTIL BEEP FINISHES
        movlw   PLEDON          ;TURN LED PERMANENT ON
        movw    pled_cmd
        goto    pgm_5           ;PROCEED TO WAIT UNTIL KEY(S) RELEASED

pgm_4:
        movw    mem_free        ;STORE THE UPDATED MEMORY LEFT DATA
        movlw   PLEDSTEP        ;SET LED TO BLINK ONCE
        movw    pled_cmd
        movlw   BEEP_1          ;SET TO BEEP ONCE
        call    p_beep          ;WAIT UNTIL BEEP FINISHES

        movlw   PGM_BUF_PTR     ;SET PROGRAM BUFFER POINTER
        movw    temp_buf2       ;USE TEMPORARY BUFFER #2 AS PGM_BUF POINTER

p_store:                        ;STORE PROGRAM BUFFER TO MEMORY DATA AREA
        movfw   temp_buf2
        movw    FSR
        movfw   INDF
        movw    temp_buf3      ;USE TEMPORARY BUFFER #3 TO TRANSFER BUFFER
        movfw   ptr_nxt
        movw    FSR
        movfw   temp_buf3
        movw    INDF
        incf    ptr_nxt,F       ;NEXT DESTINATION POINTERS
        incf    data_length,F   ;UPDATE TOTAL DATA LENGTH
        decf    temp_buf2,F     ;NEXT SOURCE POINTER
        decfsz  temp_buf1,F     ;DECREMENT NUMBER OF BYTES STORED AND SKIP
        goto    p_store         ;IF ZERO

        movfw   ptr_nxt         ;UPDATE END POINTER
        movw    ptr_end
        movlw   PBID_PTR        ;UPDATE DATA LENGTH TO PBID DATA LENGTH AREA
        addwf   pbid,W          ;W NOW POINTS AT CORRESPONDING DATA LENGTH
        movw    FSR
        movfw   data_length
        movw    INDF

pgm_5:                          ;NEXT KEY(S)
        movlw   DBC100MS        ;SET 0.1S KEY RELEASE DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER
        movlw   0x0             ;WAIT UNTIL ALL KEYS RELEASED OR PGM PRESSED
        call    waitkey
        btfss   pgm_bit         ;EXIT IF PROGRAM PRESSED
        goto    p_end2

        movlw   DBC500MS        ;SET 0.5S KEY PRESS DEBOUNCE
        movw    dur_dbc
        movw    tmr_dbc         ;RESET DEBOUNCE TIMER
        movlw   0x2             ;WAIT UNTIL KEY(S) OR PGM PRESSED
        call    waitkey
        btfsc   pgm_bit         ;EXIT IF PROGRAM PRESSED
        goto    pgm_lp

p_end2:
p_shfd:                         ;ROUTINE TO SHIFT MEMORY DOWN
        call    p_timer         ;REFRESH TIMER ROUTINE
        movfw   ptr_src         ;TRANSFER DATA STARTING FROM SOURCE POINTER
        movw    FSR
        movfw   INDF
        movw    mov_buffer
        movfw   ptr_end
        movw    FSR
        movfw   mov_buffer
        movw    INDF
        incf    ptr_end,F
        clrc
        incfsz  ptr_src,F
        goto    p_shfd

        call    gen_crc_8       ;CALCULATE THE 8-BIT CRC VALUE FOR BUTTON DATA
        movfw   crc_byte        ;STORE THE CRC VALUE TO DATA_CRC
        movw    pb_data_crc
        call    mem_eep         ;COPY RAM DATA TO EEPROM

p_err1:
p_end1:
        movlw   BEEP_2          ;BEEP TWICE
        call    p_beep
        movlw   PLEDOFF         ;TURN LED OFF
        movw    pled_cmd 

	bcf	mode_led2

        movlw   DBC100MS        ;SET 0.1S PROGRAM KEY RELEASE DEBOUNCE
        movw    dur_dbc

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -