📄 auto.asm
字号:
;****************************************************************************
;FUNCTION: THIS SUBROUTINE IS TO DETECT AND UPDATE AUTO FIRE FUNCTION FOR
; EACH BUTTON. WHEN AUTO FIRE FOR ANY ONE OF THE BUTTON IS SET, THE
; AUTO LED FLAG, F_AUTLED1, WILL BE SET. WHEN AUTO BUTTON IS PRESSED
; THE LED WILL BE OFF TO ALLOW AUTO FIRE STATUS FOR EACH BUTTON TO
; SEEN. PRESSING A FIRE BUTTON WILL TOGGLE AUTO FIRE FUNCTION OF
; THAT BUTTON AND THE STATUS WILL BE DISPLAYED AS LONG AS THE BUTTON
; IS PRESSED. THE STATUS WILL BE AS BELOW:-
; AUTO FIRE ON - AUTO LED FLASHING
; AUTO FIRE OFF - AUTO LED EXTINGUISHED
; THE CORRESPONDING AUTO FIRE FLAG OF THAT BUTTON WILL BE UPDATED.
; ON EXIT, THE AUTO LED WILL BE DISPLAYED AS ON OR OFF. IF IT IS ON
; THERE IS AT LEAST ONE BUTTON SET TO AUTO FIRE. IF IT IS OFF, THERE
; IS NO AUTO FIRE SET. AT POWER ON, ALL AUTO FIRE WILL BE DISABLE.
;FILENAME: C:\PROJECTS\SV363\AUTO.ASM
;OUTPUT: AUTO FIRE FLAGS UPDATED AS:-
; F_AUTLED1 = 0 --> NO AUTO FIRE FOR ANY FIRE BUTTON
; F_AUTLED1 = 1 --> AT LEAST ONE BUTTON HAS BEEN SET TO AUTO
; F_AUTLED2 = 0 --> AUTO LED TO BE PERMANENTLY ON
; F_AUTLED2 = 1 --> AUTO LED TO BE FLASHING
; PB_AUTO0, PB_AUTO1 EACH BIT REPRESENTS AUTO FIRE STATUS OF
; EACH BUTTON, 1 = AUTO FIRE SET, 0 = AUTO FIRE NO SET
;RAM AFFECTED: NIL
;SUBROUTINE CALL: P_TIMER, COUNTKEY
;****************************************************************************
;
procauto:
clrf pwmduty ;clear PWM DUTY
bcf s_motor ;Stop Small MOTOR
bcf f_autled1 ;TURN AUTO LED OFF DURING SETTING
bsf f_dbcpb ;INCLUDE FIRE BUTTON DEBOUNCE
auto_lp1:
bsf PCLATH,3
call readport
bcf PCLATH,3
call read_sen
nop
call scalesen
bsf PCLATH,3
call p_timer
bcf PCLATH,3
btfss f_keystb ;WAIT UNTIL KEY STABLE
goto auto_lp1
btfsc auto_bit ;EXIT IF AUTO BUTTON RELEASED
goto auto_end1
bsf PCLATH,3
call countkey
bcf PCLATH,3
btfsc STATUS,Z ;skpnz;LOOP BACK IF NO FIRE KEY DETECTED
goto auto_lp1
sublw 0x01 ;LOOP BACK IF MORE THAN ONE KEY PRESSED
btfss STATUS,Z ;skpz
goto auto_lp1
;
movf pb_old0,W ;PB_AUTO = !(PB_OLD XOR PB_AUTO)
xorwf pb_auto0,F ;
comf pb_auto0,F
movf pb_old1,W
xorwf pb_auto1,F
comf pb_auto1,F
bcf pb_auto1,6 ;CLEAR BITS 6 & 7 OF PB_AUTO1 AS THEY ARE
bcf pb_auto1,7 ;DUMMY BITS
; ;LOCATE WHICH BIT CLEAR
auto_bit_1st_bit:
movlw b'00000001'
movwf temp_buf1
auto_bit_test_lp1:
movf temp_buf1,W
andwf pb_old0,W
btfss STATUS,Z
goto auto_bit_shift1
movf temp_buf1,W
andwf pb_auto0,W
btfss STATUS,Z
goto led_blink
goto led_off
auto_bit_shift1:
bcf STATUS,C
rlf temp_buf1,F
btfss STATUS,C ; 8 bit finish
goto auto_bit_test_lp1
auto_bit_2nd_test:
movlw b'00000001'
movwf temp_buf1
movlw d'6' ; LT to E2
movwf temp_buf2
auto_bit_test_lp2:
movf temp_buf1,W
andwf pb_old1,W
btfss STATUS,Z
goto auto_bit_shift2
movf temp_buf1,W
andwf pb_auto1,W
btfss STATUS,Z
goto led_blink
goto led_off
auto_bit_shift2:
bcf STATUS,C
rlf temp_buf1,F
decfsz temp_buf2,F
goto auto_bit_test_lp2
goto pa_wait_lp
;
led_blink:
bsf f_autled2 ;F_AUTLED2 = 1 & F_AUTLED1 = 1 => BLINK
bsf f_autled1
goto pa_wait_lp
led_off:
bcf f_autled1 ;F_AUTLED1 = 0 => LED OFF
;
pa_wait_lp: ;WAIT UNTIL FIRE BUTTON OFF
bsf PCLATH,3
call readport
bcf PCLATH,3
call read_sen
nop
call scalesen
bsf PCLATH,3
call p_timer
bcf PCLATH,3
btfss f_keystb ;WAIT UNTIL KEY STABLE
goto pa_wait_lp
btfsc auto_bit ;EXIT IF AUTO BUTTON RELEASED
goto auto_end1
bsf PCLATH,3
call countkey
bcf PCLATH,3
btfss STATUS,Z ;skpz ;LOOP BACK IF NO FIRE KEY DETECTED
goto pa_wait_lp
bcf f_autled1 ;TURN LED OFF WHEN FIRE BUTTON RELEASED
goto auto_lp1
;
auto_end1:
bcf f_autled2 ;STOP LED BLINKING AND SET TO PERMANENTLY ON
tstf pb_auto0
btfss STATUS,Z ;skpz
goto auto_end2
tstf pb_auto1
btfss STATUS,Z ;skpz
goto auto_end2
bcf f_autled1 ;DISABLE LED AND SHOW THAT NO AUTO SET
goto auto_end3
auto_end2:
bsf f_autled1 ;ENABLE LED TO INDICATE AUTO FIRE SET
auto_end3:
bsf pwmctrl,7 ;enable PWM
return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -