;******************單鍵控制8個LED左閃程序******************
;1、按鍵有暫停功能(定住其中1個LED常亮)
;2、按鍵有開啟功能(在暫停的狀態下,開啟后LED繼續閃爍)
;3、按鍵有開機功能(在關機狀態下,開機,程序從頭開始)
;4、按鍵有關機功能(程序在運行狀態還是在暫停狀態,都可關機)
;************************************************
list p=16f877a
include "p16f877a.inc"
;***************定義變量*************************
flag_A equ 20h
flag_B equ 21h
x equ 22h
y equ 23h
z equ 24h
;***************主程序***************************
main
org 000h
nop
bsf STATUS,RP0
movlw 00h
movwf TRISC
movlw 0ffh
movwf TRISB
bcf STATUS,RP0
movlw 01h
movwf PORTC
call delay1
bcf flag_A,0
bcf flag_B,0
bcf STATUS,0
main_loop btfss PORTB,0
call check
rlf PORTC,w
movwf PORTC
call delay1
btfss STATUS,0
goto main_loop
goto main
;****************按鍵處理*************************
check
call delay2
check_loop1 btfsc PORTB,0
goto check_loop1
check_loop2 btfss PORTB,0
goto check_loop5
call delay2 ;延時12ms
;**********暫停**********
btfss PORTB,0 ;\
goto check_loop5 ;轉向關機 ; \
check_loop3 btfsc flag_A,0 ; \
goto check_loop7 ;轉向開機 ; \
btfsc flag_B,0 ; \
goto check_loop8 ;轉向開啟 ; /暫停
comf flag_B,f ; /
check_loop4 btfsc PORTB,0 ; /
goto check_loop4 ; /
goto check ;/
;**********關機**********
check_loop5
call delay3 ;延時589ms ;\
btfsc PORTB,0 ; \
goto check_loop3 ; \
call delay4 ; \
bsf flag_A,0 ; \
movlw 0 ; \
movwf PORTC ; \
check_loop11 btfss PORTB,0 ; /關機程序
goto check_loop11 ; /
check_loop6 btfsc PORTB,0 ; /
goto check_loop6 ; /
movlw 01h ; /
movwf PORTC ; /
goto check ;/
;**********開機**********
check_loop7
bcf flag_A,0 ;\
movf PORTC,w ; \
movwf PORTC ; 開機程序
call delay1 ; /
goto check_loop9 ;/
;**********開啟**********
check_loop8
comf flag_B,f ;\
movf PORTC,w ; \
movwf PORTC ; /開啟程序
call delay1 ;/
;**********返回**********
check_loop9 return
;****************閃燈延時196ms處理程序**********************
delay1
movlw 0FFh
movwf x
delay1_loop0 movlw 0FFh
movwf y
delay1_loop1 decfsz y,1
goto delay1_loop1
decfsz x,1
goto delay1_loop0
return
;****************按鍵延時12ms處理程序**********************
delay2
movlw 10h
movwf x
clrf y
delay2_loop0 decfsz y,1
goto delay2_loop0
decfsz x,1
goto delay2_loop0
return
;****************按鍵延時589ms處理程序**********************
delay3
movlw 0FFh
movwf x
movlw 03h
movwf z
delay3_loop0 movlw 0FFh
movwf y
delay3_loop1 decfsz y,1
goto delay3_loop1
decfsz x,1
goto delay3_loop0
decfsz z,1
goto delay3_loop0
return
;****************按鍵延時1500ms處理程序**********************
delay4
movlw 0FFh
movwf x
movlw 08h
movwf z
delay4_loop0 movlw 0FFh
movwf y
delay4_loop1 decfsz y,1
goto delay4_loop1
decfsz x,1
goto delay4_loop0
decfsz z,1
goto delay4_loop0
return
end