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

📄 program.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        movf   	crc_byte,W        ;STORE THE CRC VALUE TO DATA_CRC
        movwf    pb_data_crc
        call    mem_eep         ;COPY RAM DATA TO EEPROM
	bcf	f_mapbad

p_err1:
p_end1:
        movlw   BEEP_2          ;BEEP TWICE
        call    p_beep

        movlw   PLEDOFF         ;TURN LED OFF
	bsf	STATUS,RP0
        movwf   pled_cmd 
        bcf	STATUS,RP0

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

pgm_lp2:
        movlw   0x00             ;WAIT FOR PROGRAM KEY OFF BEFORE EXIT
        call    waitkey
        btfss   pgm_bit
        goto    pgm_lp2

        movlw   DBC100MS        ;SET DEBOUNCE TIME BACK TO 0.1 SECOND
        movwf    dur_dbc
        movwf    tmr_dbc         ;RESET DEBOUNCE TIMER

	bcf	f_time_reset

	bcf	f_set_force
	bcf	f_prog_mode
	bcf	f_wait_mode

	call	set_auto_mask	; copy pb_auto bit

        return


;
;********************************************************************
;FUNCTION: THIS ROUTINE ENCODES BUTTON(S) PRESSED DURING PROGRAMMING
;          PROCEDURES.  BUTTON DATA ARE FETCHED FROM PB_OLD BUFFER.           
;          ENCODED KEYS ARE STORED TO BUFFER "PGM_BUF0" TO "PGM_BUF3"
;          ENCODED KEY SIZE IS STORED TO W REGISTER.  ENCODING 
;          ALGORITHM IS:-
;               FOR ONE BUTTON STEP -  (H = L) < = 14, W=1
;               FOR TWO BUTTON STEP -  (H != L) < = 13, W=1
;               FOR REPEAT STEP -  H = 0E; L =0,1,2 OR , W=1
;               FOR THREE BUTTON STEP - (H = 0F, L = 1ST KEY),
;                                       (H = 2ND KEY, L = 3RD KEY),
;                                       W = 2
;               FOR MORE THAN 3 BUTTON - (H = L = 0F) FOLLOWED BY 2 BYTES
;                                        CONTAINING PB_OLD, W =3
;
;FILENAME: \PROJECTS\SV363\PROGRAM.ASM
;NAME: CODING
;INPUT: PB_OLD
;OUTPUT: PGM_BUF0, PGM_BUF1, PGM_BUF2, W
;RAM AFFECTED: 5FH
;SUBROUTINE CALL: COUNTKEY, NEXTKEY
;******************************************************************
;
;#define total_bit       temp_buf3       ;RAM LOCATION 5FH
;
;DEFINING CONSTANT
;IDLE            equ     0xee    ;IDLE PERIOD
;CODE_1          equ     D'01'   ;CODED ONE BYTE
;CODE_2          equ     D'02'   ;CODED TWO BYTES
;CODE_3          equ     D'03'   ;CODED THREE BYTES
;REPEAT          equ     0xef    ;REPEAT CODE

coding:
	nop
        call    countkey
        movwf    total_bit       ;STORE THE NUMBER OF BIT ASSERTED
	btfss	STATUS,Z	;skpz;DEFAULT SPACE KEY
        goto    cg_1key    

        movlw   IDLE            ;SPACE CODE
        movwf    pgm_buf0
        movlw   CODE_1          ;SIZE ONE BYTE
        goto    codggood

cg_1key:
        decfsz  total_bit,F     ;SEE IF ONLY ONE KEY PRESSED
        goto    cg_2key         ;PROCEED TO SEE IF TWO KEYS PRESSED
        movlw   0x0f            ;LOCATE THE FIRST BIT ASSERTED
        call    nextkey
        nop
        call	convert_dummy
        movwf   pgm_buf0        ;STORE TO THE FIRST PGM_BUF
        swapf   pgm_buf0,F      ;SHIFT THE LOWER DIGIT UP TO HIGHER DIGIT
        iorwf   pgm_buf0,F      ;MAKE UPPER AND LOWER DIGIT EQUAL
	bcf	STATUS,C	;clrc
        sublw   0x03             ;SEE IF REPEAT STEP FUNCTION KEY PRESSED
	btfss	STATUS,C
        goto	cg_1key_end
        btfsc   o_st_bit        ;SEE IF REPEAT STEP FUNCTION KEYS VALID
        goto    cg_1key_end     ;PROCEED TO END SINGLE KEY PRESSED
        movlw   0xf0            ;IF VALID REPEAT STEP, LOAD HIGHER DIGIT
        iorwf   pgm_buf0,F      ;WITH E AND KEEP THE LOWER DIGIT UNCHANGED
        bcf     pgm_buf0,4        
cg_1key_end:        
        movlw   CODE_1          ;STEP SIZE = 1 BYTE
        goto    codggood

cg_2key:
        decfsz  total_bit,F     ;SEE IF ONLY TWO KEYS PRESSED
        goto    cg_3key         ;PROCEED TO SEE IF TWO KEYS PRESSED
        movlw   0x0f            ;LOCATE THE FIRST BIT ASSERTED
        call    nextkey
        nop
        call	convert_dummy
        movwf   pgm_buf0        ;STORE TO THE FIRST PGM_BUF
        swapf   pgm_buf0,F      ;SHIFT THE LOWER DIGIT UP TO HIGHER DIGIT
        call    nextkey         ;LOCATE THE 2ND ASSERTED BIT
	call	convert_dummy
        iorwf   pgm_buf0,F      ;STORE TO THE LOWER DIGIT OF PROGRAM BUFFER
        movlw   CODE_1          ;STEP SIZE = 1 BYTE
        goto    codggood

cg_3key:
        decfsz  total_bit,F     ;SEE IF ONLY THREE KEYS PRESSED
        goto    cg_4key         ;IF NOT, PROCEED TO CHECK 4 KEYS
        movlw   0x0f            ;LOCATE THE FIRST BIT ASSERTED
        call    nextkey
        nop
        call	convert_dummy
        movwf   pgm_buf1        ;STORE TO THE PGM_BUF1
        swapf   pgm_buf1,F      ;SHIFT THE LOWER DIGIT UP TO HIGHER DIGIT
        call    nextkey         ;LOCATE THE 2ND ASSERTED BIT
        nop
	call	convert_dummy
        iorwf   pgm_buf1,F      ;STORE TO THE LOWER DIGIT OF PROGRAM BUFFER
        call    nextkey         ;LOCATE THE 3RD BIT ASSERTED
        nop
	call	convert_dummy
        movwf   pgm_buf0        ;STORE TO THE PGM_BUF0
        movlw   0xf0            ;LOAD THE HIGHER DIGIT OF THE PGM_BUF0
        iorwf   pgm_buf0,F      ;TO F
        movlw   CODE_2          ;STEP SIZE = 2 BYTES
        goto    codggood

cg_4key:
        movlw   0xff            ;STORE THE FOUR KEYS ASSETED CODE TO THE
        movwf   pgm_buf0        ;LOWEST BYTE OF THE PROGRAM BUFFER
        movf   pb_old1,W         ;LOAD THE HIGHER BYTES KEY INFO FROM PB_OLD
        movwf   pgm_buf1        ;TO SECOND BYTE OF PROGRAM BUFFER
        movf   pb_old0,W         ;LOAD THE LOWER BYTES KEY INFO FROM PB_OLD
        movwf   pgm_buf2        ;TO THE HIGHEST BYTE OF PROGRAM BUFFER

	btfss	pgm_buf1,4	; convert dummy E1, E2 to L1, L2
	bcf	pgm_buf2,5
	btfss	pgm_buf1,5
	bcf	pgm_buf2,4
	bsf	pgm_buf1,4
	bsf	pgm_buf1,5

        movlw   CODE_3          ;STEP SIZE = 3 BYTES

codggood:  
	bsf	pwmctrl,7	;enable PWM      
        return


;--------------------------------------
; set_force:
; programming the force of each button
;--------------------------------------
set_force:
	movlw	DBC100MS
	movwf	dur_dbc
	movwf	tmr_dbc
	goto	set_force_entry
	
get_force_lp2:
	bsf	f_wait_mode
	movlw	0x01
	call	waitkey
	bcf	f_wait_mode
	btfss	pgm_bit
	goto	end_set_force
	btfsc	mode_bit
	goto	get_force_lp2

set_force_entry:
        movlw   BEEP_1          ;BEEP ONCE
        call    p_beep

	incf	pforce_0,F
	movf	pforce_0,W
	sublw	d'2'
	btfss	STATUS,C
	clrf	pforce_0
	
	bsf	f_wait_mode	
	movlw	0x00
	call	waitkey		; wait for key release
	goto	get_force_lp2
	
	
end_set_force:
	movlw	b'11111100'
	movwf	pforce_1
	bsf	STATUS,RP0
	movf	force_id,W	; 0 ~ 3
	btfsc	STATUS,Z
	goto	get_force_pos
	
chk_force_lp2:
	bcf	STATUS,RP0
	bcf	STATUS,C
	rlf	pforce_0,F
	bcf	STATUS,C
	rlf	pforce_0,F
	bsf	STATUS,C
	rlf	pforce_1,F
	rlf	pforce_1,F
	bsf	STATUS,RP0
	decfsz	force_id,F
	goto	chk_force_lp2

get_force_pos:			; place to bu_force
	bsf	STATUS,RP0
	movf	force_tmp1,W
	bcf	STATUS,RP0
	movwf	FSR
	movf	pforce_1,W
	andwf	INDF,F
	movf	pforce_0,W
	iorwf	INDF,F
	
	bcf	f_set_force
	goto	p_end2
	
;------------------------------------
; check_f_id:
; get the force setting
; input : put pbid to force_id
; output : result place in pforce_0
;------------------------------------
check_f_id:
	bsf	STATUS,RP0
	movlw	bu_force1
	movwf	FSR
	movf	force_id,W
	sublw	d'3'
	btfsc	STATUS,C
	goto	checked_id

check_f_id1:	
	incf	FSR,F		; pbid > 3
	movf	force_id,W
	sublw	d'7'
	btfss	STATUS,C
	goto	check_f_id2
	movlw	d'4'
	subwf	force_id,F
	goto	checked_id

check_f_id2:	
	incf	FSR,F		; pbid > 7
	movf	force_id,W
	sublw	d'11'
	btfss	STATUS,C
	goto	check_f_id3
	movlw	d'8'
	subwf	force_id,F
	goto	checked_id

check_f_id3:			; pbid > 11
	incf	FSR,F
	movlw	d'12'
	subwf	force_id,F
	
checked_id:
	movf	FSR,W
	movwf	force_tmp1
	bcf	STATUS,RP0

	movf	INDF,W
	movwf	pforce_0

	bsf	STATUS,RP0
	movf	force_id,W	; 0 ~ 3
	bcf	STATUS,RP0

	movwf	pforce_1
	btfsc	STATUS,Z
	goto	get_force_v
	
chk_force_lp1:
	rrf	pforce_0,F
	rrf	pforce_0,F
	decfsz	pforce_1,F
	goto	chk_force_lp1

get_force_v:	
	movlw	0x03
	andwf	pforce_0,F
	bcf	STATUS,RP0
	return

;--------------------------------------------
; convert_dummy:
; used to convert key if dummy is pressed
; dummy : E1, E2
; input : W
; output : W
; register used : pforce_0 (ee_io_buf) as tmp
;--------------------------------------------
convert_dummy:
	movwf	pforce_0
	xorlw	0x0c			; E1
	btfss	STATUS,Z
	goto	convert_not_0c
	movlw	0x05
	goto	end_convert_dummy
convert_not_0c:
	movlw	0x0d			; E2
	xorwf	pforce_0,W
	movlw	0x04
	btfss	STATUS,Z
	movf	pforce_0,W		; not E1 or E2
	
end_convert_dummy:
	return	
	

⌨️ 快捷键说明

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