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