📄 prockey.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 + -