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

📄 prockey.asm

📁 VCP201_CODE is a FPGA source code.
💻 ASM
字号:
;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO LOCATE THE POINTER TO THE BUTTON DATA STARTING
;          ADDRESS.  THE INPUT IS BUTTON NUMBER (0-14).
;FILENAME: C:\PROJECTS\SV363\PROCKEY.ASM
;ROUTINE NAME: A_NDX
;INPUT: W REGISTER CONTAINING PBID NUMBER
;OUTPUT: W REGISTER CONTAINING BUTTON DATA STARTING ADDRESS POINTER
;        CARRY SET IF ERROR DETECTED
;RAM AFFECTED: FSR,64
;SUBROUTINE CALL: NIL
;****************************************************************************
;
;#define in_pbid         pgm_buf1        ;MEMORY LOCATION 64H
;
a_ndx:
;	addlw   0x01             ;ADJUST THE PBID POINTER FOR LOOPING
	movwf    in_pbid         ;STORE INPUT PBID TO in_pbid
        incf	in_pbid,F

	movlw   CNTL_POINTER    ;USE INDEX ADDRESS TO ADD DATA LENGTH UP
	movwf    FSR
	movlw   0x00             ;RESET ADDRESS LENGTH
a_ndx1:
	decf    in_pbid,F       ;DECREMENT PBID #
	btfsc	STATUS,Z	;		skpnz
	goto    a_ndx_end       ;EXIT WHEN ALL BUTTON # IS SUMMED UP
	addwf   INDF,W          ;SUM DATA LENGTH AND STORE TO W REGISTER
	incf    FSR,F
	goto    a_ndx1
a_ndx_end:
	addlw   DATA_POINTER    ;W NOW CONTAINS THE ABSOLUTE ADDRESS
	btfsc	STATUS,C	;skpnc
	bsf     f_mapbad        ;SET F_MAPBAD IF POINTER OUT OF RANGE
	return                  ;CARRY SET IF POINTER OUT OF RANGE
;
;
;
;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO LOCATE WHICH BIT HAS BEEN ASSERTED. THE PB_RAW
;          BUFFER IS SCANNED TO SEE WHICH BIT HAS BEEN ASSERTED.  INPUT IS
;          STARTING LOCATION TO BEGIN SEARCHING.  OUTPUT IS FIRST ENCOUNTERED
;          ASSERTED BIT POSITION AND IS STORED IN W REGISTER.
;FILENAME: C:\PROJECTS\SV363\PROCKEY.ASM
;ROUTINE NAME: NEXTKEY
;INPUT: W = STARTING LOCATION, 0F -> START WITH 0 BIT
;OUTPUT: W = BIT # (0-13) WHERE BIT ASSERTED
;        CARRY SET => NO BIT ASSERTED FOUND
;        START BIT NOT SCANNED
;RAM AFFECTED: FSR,5F,5C,6D
;SUBROUTINE CALL: NIL
;****************************************************************************
;
;#define in_bit_loc      temp_buf3       ;RAM LOCATION 5FH
;#define bit_count       mov_count       ;RAM LOCATION 6DH
;#define nk_buf          ee_addr         ;RAM LOCATION 5CH
;
nextkey:
	movwf    in_bit_loc     ;STORE THE STARTING LOCATION TO in_bit_loc
	bcf	STATUS,DC	;clrdc
	movlw   0x01
	addwf   in_bit_loc,F    ;SCAN FROM NEXT HIGHER BIT
	btfsc	STATUS,DC	;skpndc                  ;SEE IF INPUT IS 0FH
	clrf    in_bit_loc      ;RESET TO SCAN FROM 0 BIT IF INPUT IS 0FH
				;in_bit_loc IS NOW THE STARTING SCAN LOCATION
	movlw   PTR_PBRAW0      ;USE INDIRECT TO POINT AT PB_RAW LOCATION
	movwf    FSR
	movlw   0xff            ;SET NK_BUF TO FF AND CARRY IS 0
	movwf    nk_buf
	clrf    bit_count       ;RESET BIT COUNTER
	bcf	STATUS,C	;clrc
nk_loop1:                       ;LOOP TO SET COUNT TO NEXT INPUT BIT LOCATION
	rlf     nk_buf,F        ;MOVE THE 0 BIT TO NEXT BIT LOCATION
	btfsc	STATUS,C
	goto	nk_1
	rlf     nk_buf,F
	decf    FSR,F           ;POINTER NOW POINTS AT PB_RAW1
nk_1:        
	bcf	STATUS,C
	movlw   0x01
	subwf   in_bit_loc,F
	btfss	STATUS,C	;skpc
	goto    nk_2
	incf    bit_count,F     ;UPDATA BIT COUNTER
	bsf	STATUS,C         ;SET CARRY SO THAT THE ROTATE BIT 0=1
	goto    nk_loop1
nk_2:        
	incf    bit_count,F
nk_loop2:
	movf   nk_buf,W          ;OR THE PB_RAW TO SEE IF THAT BIT ASSERTED
	iorwf   INDF,W
	sublw   0xff            ;SEE IF W =FF -> THAT BIT IS NOT ASSERTED
	btfss	STATUS,Z	;skpz                    ;EXIT IF THAT BIT ASSERTED
	goto    nk_end
	bcf	STATUS,DC	;clrdc
	movlw   0x01
	addwf   bit_count,F     ;IF THAT BIT NOT ASSERTED UPDATA BIT COUNTER
	btfsc	STATUS,DC	;RETURN WITH CARRY SET, IF BIT COUNTER > 15
	goto    no_found
	bsf	STATUS,C
	rlf     nk_buf,F        ;MOVE THE TEST BIT TO NEXT BIT LOCATION
	btfsc	STATUS,C
	goto	nk_3		;	bc      nk_3             
	rlf     nk_buf,F        ;DUMMY MOVE TO ROTATE THE 0 TO BIT 0
	decf    FSR,F           ;POINTER NOW POINTS AT PB_RAW1
nk_3:        
	goto    nk_loop2
nk_end:
	decf    bit_count,F     ;ADJUST THE BIT COUNTER
	bcf	STATUS,C
	movlw   d'14'           ;CHECK TO SEE IF BIT COUNTER > 13
	subwf   bit_count,W     ;
	btfsc	STATUS,C	;	skpnc
	goto    no_found        ;IF BIT COUNTER > 13 RETURN CARRY SET
	bcf	STATUS,C	;CLEAR CARRY TO INDICATE VALID VALUE
	movf   bit_count,W
	return
no_found:
	bsf	STATUS,C
	return

;
;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO WAIT FOR BUTTON STATUS CHANGE.  WHEN INPUT IS
;          0, IT WILL WAIT UNTIL ALL PRESSED BUTTON RELEASED.  WHEN INPUT IS
;          1, IT WILL WAIT UNTIL ONLY ONE BUTTON PRESSED.  WHEN INPUT IS 2,
;          IT WILL WAIT UNTIL FOR ANY BUTTON PRESSED.
;FILENAME: C:\PROJECTS\SV363\PROCKEY.ASM
;ROUTINE NAME: WAITKEY
;INPUT: W=0 WAIT FOR ALL KEY RELEASED EXCEPT WHEN PROGRAM KEY PRESSED
;       W=1 WAIT FOR ONLY ONE KEY PRESSED
;       W=2 WAIT FOR ANY # OF KEY PRESSED
;OUTPUT: NIL
;RAM AFFECTED: 63, 64
;SUBROUTINE CALL: P_TIMER, COUNTKEY
;****************************************************************************
;
;#define input_byte      pgm_buf1        ;RAM LOCATION 63
;#define total_key       pgm_buf2        ;RAM LOCATION 64
;
waitkey:
	movwf    input_byte      ;STORE INPUT DATA RELEASING W REGISTER
	bcf     f_keystb        ;RESET F_KEYSTB FLAG
wkeyloop:
	clrf	pwmduty	

	call	readport

        bcf	PCLATH,3
        call	read_sen
        call	scalesen
        bsf	PCLATH,3

	call    p_timer         ;UPDATA TIMERS AND SCAN KEYS

	btfss   f_keystb        ;WAIT UNTIL INPUT KEYS STABLE
	goto    wkeyloop

	btfss   pgm_bit         ;EXIT IF PROGRAM PRESSED
	goto    wkeyend

	btfsc	mode_bit	; modified by Tim
	goto	wkey_mode_bit

	movf	input_byte,W	; modified by Tim
	btfsc	STATUS,Z   	;
	goto	wkeyloop
	
wkey_mode_bit:
	btfss	f_wait_mode
	goto	wait_havekey
	btfss	mode_bit
	goto	wkeyend
        
wait_havekey:
	bcf	STATUS,RP0
	call    countkey        ;COUNT # OF KEY PRESSED
	movwf   total_key       ;STORE # OF KEY PRESSED TO BUFFER
	movlw   0x02             ;CHECK IF ANY KEY INPUT
	subwf   input_byte,W
	btfss	STATUS,Z	;	skpz
	goto    wkey01

	tstf    total_key       ;SEE IF NO KEY PRESSED (EXCEPT START BUTTON)
;	movf	total_key,W

	btfss	STATUS,Z
	goto    wkeyend         ;EXIT IF KEY PRESSED DETECTED
	btfsc   o_st_bit        ;SEE IF START PRESSED
	goto    wkeyloop        ;LOOP BACK IF START NOT PRESSED
	goto    wkeyend         ;EXIT IF START PRESSED DETECTED

wkey01:
	movf    input_byte,W      ;COMPARE INPUT WITH SCANNED # OF KEY PRESSED
	subwf   total_key,W
        btfss	STATUS,Z	;skpz;IF WAITKEY=0 AND NO KEY DETECTED, EXITS
	goto    wkeyloop        ;IF WAITKEY=1 AND 1 KEY DETECTED, EXITS
	btfss   o_st_bit
	goto    wkeyloop
wkeyend:
	return

;
;
;****************************************************************************
;FUNCTION: THIS ROUTINE IS TO COUNT NUMBER OF ZERO BIT IN PB_RAW OR PB_OLD
;          BUFFERS.  WHEN F_DBCPB IS SET, THE PB_OLD BUFFER WILL BE SCANNED
;          OTHERWISE, THE PB_RAW WILL BE SCANNED. THE START BIT IS NOT 
;          COUNTED. OUTPUT NUMBER OF BITS FOUND IS STORED TO W REGISTER
;FILENAME: PROCKEY.ASM
;ROUTINE NAME: COUNTKEY
;INPUT: NIL
;OUTPUT: W REGISTER CONTAINS NUMBER OF BIT ASSERTED IN PB_RAW BUFFERS
;RAM AFFECTED: 61,6D,6C
;SUBROUTINE CALL: NIL
;****************************************************************************
;
;#define       bit_count         mov_count       ;RAM LOCATION 6D
;#define      zero_count         mov_buffer      ;RAM LOCATION 6C
;#define       shift_buf         temp_buf1;      ;RAM LOCATION 61
;
countkey:
	movlw   0x08             ;SET TO COUNT 8 TIMES FOR LOWER ORDER BYTE
	movwf    bit_count
	movf   pb_old0,W
	btfss   f_dbcpb         ;USE PB_RAW IF F_DBCPB CLEAR
	movf   pb_raw0,W
	movwf    shift_buf       ;STORE THE BYTE TO BE COUNTED TO BUFFER
	clrf    zero_count      ;RESET ZERO BIT COUNTER
ckey_loop1:
	rrf     shift_buf,F     ;SHIFT BIT TO CARRY AND TEST IF ZERO        
	btfss	STATUS,C
	incf    zero_count,F    ;INCREMENT ZERO BIT COUNTER IF 0 DETECTED
	decfsz  bit_count,F     ;SHIFT 8 TIMES ONLY
	goto    ckey_loop1
	movlw   0x06             ;SET TO COUNT 6 TIMES ONLY FOR THE NEXT BYTE
	movwf    bit_count
	movf   pb_old1,W
	btfss   f_dbcpb         ;USE PB_RAW IF F_DBCPB CLEAR
	movf   pb_raw1,W
	movwf    shift_buf       ;STORE THE BYTE TO BE SHIFTED
ckey_loop2:
	rrf     shift_buf,F     ;SHIFT BIT TO CARRY AND TEST IF ZERO        
	btfss	STATUS,C	;skpc
	incf    zero_count,F    ;INCREMENT ZERO BIT COUNTER IF 0 DETECTED
	decfsz  bit_count,F     ;SHIFT 6 TIMES ONLY
	goto    ckey_loop2
	clrf	pwmduty		;update PWM data
	movf   zero_count,W
	return

⌨️ 快捷键说明

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