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

📄 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   0x1             ;ADJUST THE PBID POINTER FOR LOOPING
	movw    in_pbid         ;STORE INPUT PBID TO in_pbid
	movlw   CNTL_POINTER    ;USE INDEX ADDRESS TO ADD DATA LENGTH UP
	movw    FSR
	movlw   0x0             ;RESET ADDRESS LENGTH
a_ndx1:
	decf    in_pbid,F       ;DECREMENT PBID #
	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
	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:
	movw    in_bit_loc      ;STORE THE STARTING LOCATION TO in_bit_loc
	clrdc
	movlw   0x1
	addwf   in_bit_loc,F    ;SCAN FROM NEXT HIGHER BIT
	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
	movw    FSR
	movlw   0xff            ;SET NK_BUF TO FF AND CARRY IS 0
	movw    nk_buf
	clrf    bit_count       ;RESET BIT COUNTER
	clrc
nk_loop1:                       ;LOOP TO SET COUNT TO NEXT INPUT BIT LOCATION
	rlf     nk_buf,F        ;MOVE THE 0 BIT TO NEXT BIT LOCATION
	bc      nk_1
	rlf     nk_buf,F
	decf    FSR,F           ;POINTER NOW POINTS AT PB_RAW1
nk_1:        
	clrc
	movlw   0x1
	subwf   in_bit_loc,F
	skpc
	goto    nk_2
	incf    bit_count,F     ;UPDATA BIT COUNTER
	setc                    ;SET CARRY SO THAT THE ROTATE BIT 0=1
	goto    nk_loop1
nk_2:        
	incf    bit_count,F
nk_loop2:
	movfw   nk_buf          ;OR THE PB_RAW TO SEE IF THAT BIT ASSERTED
	iorwf   INDF,W
	sublw   0xff            ;SEE IF W =FF -> THAT BIT IS NOT ASSERTED
	skpz                    ;EXIT IF THAT BIT ASSERTED
	goto    nk_end
	clrdc
	movlw   0x1
	addwf   bit_count,F     ;IF THAT BIT NOT ASSERTED UPDATA BIT COUNTER
	skpndc                  ;RETURN WITH CARRY SET, IF BIT COUNTER > 15
	goto    no_found
	setc
	rlf     nk_buf,F        ;MOVE THE TEST BIT TO NEXT BIT LOCATION
	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
	clrc
	movlw   d'14'           ;CHECK TO SEE IF BIT COUNTER > 13
	subwf   bit_count,W     ;
	skpnc
	goto    no_found        ;IF BIT COUNTER > 13 RETURN CARRY SET
	clrc                    ;CLEAR CARRY TO INDICATE VALID VALUE
	movfw   bit_count
	return
no_found:
	setc
	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:
	movw    input_byte      ;STORE INPUT DATA RELEASING W REGISTER
	bcf     f_keystb        ;RESET F_KEYSTB FLAG
wkeyloop:
;$$$$$$$$$$$$$$$
	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:
	call    countkey        ;COUNT # OF KEY PRESSED
	movw    total_key       ;STORE # OF KEY PRESSED TO BUFFER
	movlw   0x2             ;CHECK IF ANY KEY INPUT
	subwf   input_byte,W
	skpz
	goto    wkey01
	tstf    total_key       ;SEE IF NO KEY PRESSED (EXCEPT START BUTTON)
	skpz
	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:
	movfw   input_byte      ;COMPARE INPUT WITH SCANNED # OF KEY PRESSED
	subwf   total_key,W
	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   0x8             ;SET TO COUNT 8 TIMES FOR LOWER ORDER BYTE
	movw    bit_count
	movfw   pb_old0
	btfss   f_dbcpb         ;USE PB_RAW IF F_DBCPB CLEAR
	movfw   pb_raw0
	movw    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        
	skpc
	incf    zero_count,F    ;INCREMENT ZERO BIT COUNTER IF 0 DETECTED
	decfsz  bit_count,F     ;SHIFT 8 TIMES ONLY
	goto    ckey_loop1
;        
	movlw   0x6             ;SET TO COUNT 6 TIMES ONLY FOR THE NEXT BYTE
	movw    bit_count
	movfw   pb_old1
	btfss   f_dbcpb         ;USE PB_RAW IF F_DBCPB CLEAR
	movfw   pb_raw1
	movw    shift_buf       ;STORE THE BYTE TO BE SHIFTED
ckey_loop2:
	rrf     shift_buf,F     ;SHIFT BIT TO CARRY AND TEST IF ZERO        
	skpc
	incf    zero_count,F    ;INCREMENT ZERO BIT COUNTER IF 0 DETECTED
	decfsz  bit_count,F     ;SHIFT 6 TIMES ONLY
	goto    ckey_loop2
;
	movfw   zero_count
	return

⌨️ 快捷键说明

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