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

📄 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
;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
;crc_byte        equ     0x6f            ;BUFFER FOR CRC VALUE
;mov_count       equ     0x6d            ;COUNTER NO. OF BYTES TO BE MOVED
;mov_buffer      equ     0x6c            ;TEMPORARY BUFFER FOR DATA MOVE
;?mem_free       equ     0x6c            ;MEMORY FREE LEFT FOR DATA
;ptr_nxt         equ     0x69            ;CURRENT STEP POINTER
;data_length     equ     0x68            ;DATA LENGTH FOR A STEP
;pgm_buf0        equ     0x67            ;LOWEST ORDER BYTE OF ENCODE KEY(S)
;pgm_buf1        equ     0x66            ;MIDDLE ORDER BYTE OF ENCODE KEY(S)
;pgm_buf2        equ     0x65            ;HIGHEST ORDER BYTE OF ENCODE KEY(S)
;temp_buf1       equ     0x63            ;TEMPORARY BUFFER #1
;temp_buf2       equ     0x62            ;TEMPORARY BUFFER #2
;pb_data_crc     equ     0x7f            ;CRC FOR BUTTON DATA


;DEFINE CONSTANT NAMES
;PGM_BUF_PTR     equ     H'067'          ;POINTER POINTS AT PGM_BUF0
;PBID_PTR        equ     H'070'          ;POINTER POINTS AT FIRST PBID DATA LENGTH
;
;--------------------------------------------------------------------
procpgm:
        movlw   DBC500MS        ;SET 0.5MSEC KEY RELEASE DEBOUNCE
        movwf    dur_dbc
        movwf    tmr_dbc         ;RESET DEBOUNCE TIMER
        bcf     f_keystb        ;CLEAR KEY STABLE FLAG
	bcf	f_autled2

pgm_dbc:
	call	readport
        nop
	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	STATUS,RP0  
        bsf     f_dbcpb         ;INCLUDE FIRE BUTTON DEBOUNCE
	bsf	f_prog_mode

	bcf	s_motor		;off motor 11/7/00
	clrf	pwmduty		;
	
        movlw   0x01             ;RESET PLED COUNTER -> START FLASH IMMEDIATE
        movwf   tmr_pled

        movlw   PLED1ST         ;SET SLOW FLASHING PROGRAM LED
	bsf	STATUS,RP0
        movwf    pled_cmd
        bcf	STATUS,RP0

        movlw   DBC100MS        ;SET 0.1MSEC KEY RELEASE DEBOUNCE
        movwf    dur_dbc
        movwf    tmr_dbc         ;RESET DEBOUNCE TIMER

        movlw   BEEP_2          ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
        call    p_beep          ;WAIT UNTIL BEEP FINISHED

wpgmoff:
	bcf	STATUS,RP0
        movlw   0x00             ;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
        movwf    dur_dbc
        movwf    tmr_dbc         ;RESET DEBOUNCE TIMER
	        
        movlw   0x01             ;WAIT UNTIL ONLY ONE BUTTON KEY PRESSED
        call    waitkey
        btfss   pgm_bit         ;EXIT PROGRAM MODE IF PROGRAM KEY PRESSED
        goto    p_end1

prog_get_1st:
        movlw   0x0f            ;LOCATE THE FIRST KEY'S BIT ASSERTED
        call    nextkey
	btfsc	STATUS,C	;skpnc
        goto    p_err1          ;ERROR IF INVALID KEY BIT FOUND (pgm_end)
        movwf   pbid           ;STORE POSITION OF ASSERTED BIT

pgm_2:
        movlw   PLEDON          ;SET LED ON NOT BLINKING
	bsf	STATUS,RP0
        movwf    pled_cmd
        bcf	STATUS,RP0

        movlw   DBC100MS        ;SET 0.1MSEC KEY RELEASE DEBOUNCE
        movwf    dur_dbc
        movwf    tmr_dbc         ;RESET DEBOUNCE TIMER
        movlw   BEEP_1          ;BEEP TWICE TO SHOW PROGRAM MODE ACTIVATED
        call    p_beep          ;WAIT UNTIL BEEP FINISHED

	movf	pbid,W
	bsf	STATUS,RP0	; to page 1
	movwf	force_id
        bcf	STATUS,RP0

	call	check_f_id

	bsf	f_set_force

        movlw   0x00             ;WAIT UNTIL DEFINED KEY RELEASE AND NO KEY
        call    waitkey

        btfss   pgm_bit         ;EXIT IF PROGRAM KEY RELEASED
        goto    p_end1

        movf   pbid,W            ;LOCATE THE PBID+1 POINTER AS END POINTER

	movwf	temp_buf3
        incf	temp_buf3,F
        movf	temp_buf3,W

;  	addlw   0x01

        call    a_ndx
        movwf    ptr_end

pgm_3:
        movlw   PBMAX           ;LOCATE THE PBMAX POINTER AS THE START POINTER
        call    a_ndx
        movwf    ptr_src
        
        movf   ptr_end,W
        subwf   ptr_src,W       ;EVALUATE DATA LENGTH TO BE MOVED AND STORE

	movwf	temp_buf3
        incf	temp_buf3,F
        movf	temp_buf3,W

;        addlw   0x01             ;TO BUFFER MOV_COUNT WHICH IS USED TO KEEP 

        movwf    mov_count       ;COUNTING
        
        movlw   MEMTOP          ;REDEFINE THE END POINTER AS DESTINATION
        movwf    ptr_end         ;POINTER DURING MEMORY TRANSFER

p_shfu:                         ;ROUTINE TO SHIFT MEMORY UP TO MEMTOP
        call    p_timer         ;REFRESH TIMER ROUTINE
        movf   ptr_src,W        ;TRANSFER DATA STARTING FROM SOURCE POINTER
        movwf    FSR
        movf   INDF,W
        movwf    mov_buffer
        movf   ptr_end,W
        movwf    FSR
        movf   mov_buffer,W
        movwf    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
        movwf    ptr_src         ;SOURCE POINTER FOR MEMORY REFILLING LATER

        movf   pbid,W            ;LOCATE THE PBID+1 POINTER AS END POINTER

	movwf	temp_buf3
        incf	temp_buf3,F
        movf	temp_buf3,W

;       addlw   0x01		; it is used if exit NOW             

        call    a_ndx
        movwf    ptr_end

        movf   pbid,W            ;LOCATE THE ASSERTED BIT POINTER
        call    a_ndx           ;AND STORE AS STEP POINTER
        movwf   ptr_nxt
        
        subwf   ptr_src,W       ;CALCULATE THE MEMORY FREE FOR PROGRAMMING
	bsf	STATUS,RP0
        movwf    mem_free        ;AND STORE IT TO BUFFER MEM_FREE
	bcf	STATUS,RP0

        clrf    data_length     ;RESET STEP LENGTH COUNTER
	bcf	f_valid_pgm
	
        movlw   DBC500MS        ;SET 0.5S KEY HOLD DEBOUNCE
        movwf    dur_dbc
        movwf    tmr_dbc         ;RESET DEBOUNCE TIMER

pgm_lpx:
	btfsc	D_A_mode
	bsf	f_wait_mode
        movlw   0x02             ;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

        btfsc	mode_bit
        goto	pgm_lp1
        
	btfss	f_set_force
        goto	pgm_lpx
        goto	set_force

pgm_lp1:
        bcf	f_set_force

pgm_lp:
        call    p_timer
        nop
        call    coding          ;ENCODE KEY(S) AND STORE TO PROGRAM BUFFER
        movwf    temp_buf1       ;STORE THE STEP LENGTH TO TEMPORARY BUFFER
	bcf	STATUS,C	;clrc
        bsf	STATUS,RP0
        subwf   mem_free,W      ;CHECK IF ENOUGH MEMORY TO FIT NEW DATA
	bcf	STATUS,RP0
	btfsc	STATUS,C	;bc     pgm_4;PROCEED IF ENOUGH MEMORY
	goto	pgm_4

        movlw   PLEDMEM         ;SET LED FLASHES AT FAST RATE
	bsf	STATUS,RP0
        movwf   pled_cmd
        bcf	STATUS,RP0

        movlw   BEEP_3          ;SET TO BEEP THREE TIMES
        call    p_beep          ;WAIT UNTIL BEEP FINISHES

        movlw   PLEDON          ;TURN LED PERMANENT ON
	bsf	STATUS,RP0
        movwf   pled_cmd
        bcf	STATUS,RP0

        goto    pgm_5           ;PROCEED TO WAIT UNTIL KEY(S) RELEASED

pgm_4:
	bsf	f_valid_pgm	; valid button received
	bsf	STATUS,RP0	
        movwf    mem_free        ;STORE THE UPDATED MEMORY LEFT DATA
	bcf	STATUS,RP0
        movlw   PLEDSTEP        ;SET LED TO BLINK ONCE

	bsf	STATUS,RP0
        movwf    pled_cmd
        bcf	STATUS,RP0

        movlw   BEEP_1          ;SET TO BEEP ONCE
        call    p_beep          ;WAIT UNTIL BEEP FINISHES

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

p_store:                        ;STORE PROGRAM BUFFER TO MEMORY DATA AREA
        movf   	temp_buf2,W
        movwf    FSR
        movf   	INDF,W
        movwf    temp_buf3      ;USE TEMPORARY BUFFER #3 TO TRANSFER BUFFER
        movf   	ptr_nxt,W
        movwf    FSR
        movf   	temp_buf3,W
        movwf    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

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

pgm_5:                          ;NEXT KEY(S)
        movlw   DBC100MS        ;SET 0.1S KEY RELEASE DEBOUNCE
        movwf   dur_dbc
        movwf   tmr_dbc         ;RESET DEBOUNCE TIMER

        movlw   0x00             ;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
        movwf   dur_dbc
        movwf   tmr_dbc         ;RESET DEBOUNCE TIMER
	
	btfss	f_valid_pgm
	goto	pgm_lpx

        movlw   0x02             ;WAIT UNTIL KEY(S) OR PGM PRESSED
        call    waitkey

        btfsc   pgm_bit         ;EXIT IF PROGRAM PRESSED
        goto    pgm_lp

p_end2:
        bcf	f_set_force

p_shfd:                         ;ROUTINE TO SHIFT MEMORY DOWN
        call    p_timer         ;REFRESH TIMER ROUTINE
        movf   	ptr_src,W        ;TRANSFER DATA STARTING FROM SOURCE POINTER
        movwf    FSR
        movf   	INDF,W
        movwf    mov_buffer
        movf   	ptr_end,W
        movwf    FSR
        movf   	mov_buffer,W
        movwf    INDF
        incf    ptr_end,F
	bcf	STATUS,C	;        clrc
        incfsz  ptr_src,F
        goto    p_shfd

p_end_to_ee:
        call    gen_crc_8       ;CALCULATE THE 8-BIT CRC VALUE FOR BUTTON DATA

⌨️ 快捷键说明

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