📄 fan84.asm
字号:
LIST P=PIC16F84A,R=HEX
;------------------------------------------------
;------- BATHROOM VEN & FAN TIMER -----
;
; V1.3 : ADD TIMER1 ,FOR REBOUND
;
; WHEN LIGHT ON, FAN1 ON, FAN2 OFF
; WHEN LIGHT OFF,STATUS0 TURN ALL OFF 1MIN LATER
; IN CASE STATUS1-4 TURN ALL ON FOR
; 30-60 -120-180 MINUTES
;
;
;------- 2001/9/16 PHILIP SUN COPYRIGHT -----
;------------------------------------------------
__CONFIG H'3FF7'
;
; DEFINE RAM
;
RTCC EQU 01 ;EXT OSC COUNTER , CONNECT TO 60 Hz AC
PA EQU 05 ;PORT A FOR INPUT
PB EQU 06 ;PORT B FOR OUT
SECD EQU 0C ;
MINS EQU 0D ;
PBB EQU 0E ;PB BACKUP
TIMER1 EQU 0F
; DEFINE VAR
Hz EQU D'60' ;60 Hz AC POWER
;
;
; DEFINE BIT
;
LIGHT EQU 0 ;RA,0 LIGHT INPUT 0=LIGHT, 1=DARK
S0 EQU 0 ;RB,0 OUTPUT GREEN LED
S1 EQU 1 ;RB,1 OUTPUT YELLOW LED
S2 EQU 2 ;RB,2 OUTPUT ORANGE LED
S3 EQU 3 ;RB,3 OUTPUT RED LED
FAN1 EQU 4 ;RB,4 OUTPUT FOR RELAY
FAN2 EQU 5 ;RB,5 OUTPUT FOR RELAY
S4 EQU 6 ;RB,6 FALG
;
;
;--------------------------------------------------------------------------
;---------------------------------------------------------------------------
ORG 000
GOTO START
CDOWN: CLRWDT ;RESET WATCHDOG TIMER
BTFSS PBB,FAN2
GOTO CDOWN1
MOVLW D'30'
SUBWF RTCC,0
SKPZ
GOTO CDOWN1
MOVLW B'00110000'
MOVWF PB
RETLW 0
CDOWN1: MOVLW Hz
SUBWF RTCC,0 ;IS RTCC=60 ? (AC 60 Hz)
SKPZ
RETLW 0 ;NO
CLRF RTCC ;YES
BTFSS PBB,FAN2
GOTO CDOWN2
MOVF PBB,0
MOVWF PB
CDOWN2: DECFSZ SECD,1 ;IS SECD=0 ?
RETLW 0 ;NO
MOVLW D'60' ;YES, SET SECD=60
MOVWF SECD
BTFSS PBB,FAN2 ;IF FAN2 ON COUNTDOWN
RETLW 0
DECF MINS,1 ;YES, MINS=MINS-1
SKPNZ
GOTO TIMEOUT
MOVLW D'30'
SUBWF MINS,0
SKPNZ
GOTO M30
MOVLW D'60'
SUBWF MINS,0
SKPNZ
GOTO M60
MOVLW D'120'
SUBWF MINS,0
SKPNZ
GOTO M120
RETLW 0
M30: BCF PBB,S1
BSF PBB,S0
RETLW 0
M60: BCF PBB,S2
BSF PBB,S1
RETLW 0
M120: BCF PBB,S3
BSF PBB,S2
RETLW 0
TIMEOUT:BTFSS PBB,FAN2 ;IS TIMER SET FOR FANS TO TURN OFF ?
RETLW 0 ;NO, NOBODY SET THE TIMER, SO, FORGET IT
MOVLW B'01000000' ;YES, LET'S TURN IT OFF
MOVWF PB
MOVWF PBB
RETLW 0
;---------------------------------------------------
NOP
;==================================================
START BSF 3,5 ;F84
MOVLW B'00010001' ;PA,4 AS INPUT FOR SAFE
MOVWF PA ;ONLY PA,0 AS LIGHT INPUT
BCF 3,5 ;F84
MOVLW 0
MOVWF PA
BSF 3,5 ;F84
MOVLW B'00000000'
MOVWF PB ;ALL PB ARE OUTPUT
BCF 3,5 ;F84
MOVLW B'01000000' ;SET S0=1 , OTHERS=0
MOVWF PB
BSF 3,5 ;F84
MOVLW B'00111111'
MOVWF 1 ;RTCC EXT, WATCH DOG, FOSC 1:128
BCF 3,5 ;F84
CLRF RTCC
MOVLW B'01000000'
MOVWF PBB
START1 CALL CDOWN
BTFSC PA,LIGHT ;IF LIGHT IS ON GOTO L_ON
GOTO START1 ;STILL IN DARK
L_ON DECF TIMER1,1 ;A LITTER TIME DELAY TO
SKPZ ;GET RIDE OF BOUNDS
GOTO L_ON
BSF PBB,FAN1 ;OK, LIGHT IS ON
BCF PBB,FAN2 ;TURN FAN1 ON , FAN2 OFF
MOVF PBB,0
MOVWF PB
ON1 CALL CDOWN
BTFSS PA,LIGHT ;IS LIGHT OFF
GOTO ON1 ;LIGHT STILL ON
ON2 DECF TIMER1,1
SKPZ
GOTO ON2 ;
BTFSS PA,LIGHT ;STILL OFF ?
GOTO ON1
ON_OFF MOVLW 3 ;SET SECOND=3 ,COUNTDOWN
MOVWF SECD
CLRF RTCC ;RESET RTCC
ON_OFF1 CALL CDOWN
MOVLW D'60'
SUBWF SECD,0
SKPZ ;IF SECD=60, THEN IT'S LIGHT OFF
GOTO ON_OFF2 ; IF NO
L_OFF BSF PB,FAN1 ;LIGHT OFF , SET TIMER
BSF PB,FAN2
MOVF PB,0
MOVWF PBB
MOVLW D'60' ;YES, SET SECD=60
MOVWF SECD
BTFSS PB,S4 ;IF S4=1 TURN SET 1 MIN
GOTO NOFF4 ;IF S4=0 CHECK IF S0=1
MOVLW D'1' ;S4=0, SO, SET 1 MINS
MOVWF MINS
GOTO START1
NOFF4 BTFSS PB,S0
GOTO NOFF1
MOVLW D'30' ;IF S0=1 SET 30 MINS
MOVWF MINS
GOTO START1
NOFF1 BTFSS PB,S1
GOTO NOFF2
MOVLW D'60' ;IF S1=1 SET 60 MINS
MOVWF MINS
GOTO START1
NOFF2 BTFSS PB,S2
GOTO NOFF3
MOVLW D'120'
MOVWF MINS
GOTO START1
NOFF3 MOVLW D'180'
MOVWF MINS
GOTO START1
ON_OFF2 BTFSC PA,LIGHT ;IS IT ON AGAIN WITHIN 3 SECOND
GOTO ON_OFF1 ;NO, BE PATIENT
CLRF RTCC ;MAKE SURE PBB IS UPDATE
BTFSS PB,S4 ;YES, STEP THE STATUS TO NEXT
GOTO NS4
BCF PB,S4
BSF PB,S0
GOTO ON1
NS4 BTFSS PB,S0
GOTO NS0
BCF PB,S0
BSF PB,S1
GOTO ON1
NS0 BTFSS PB,S1
GOTO NS1
BCF PB,S1
BSF PB,S2
GOTO ON1
NS1 BTFSS PB,S2
GOTO NS2
BCF PB,S2
BSF PB,S3
GOTO ON1
NS2 BCF PB,S3
BSF PB,S4
GOTO ON1
END
;===========================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -