;*********************************************************** ;Aihe 于2007年五一假期中断续写成 ;4MHz晶振,1微秒每个指令周期 ;内部定时器256×16=4.096mS查询 ;主要功能定时控制电动阀开关 ;起始延时由四个拨动开关设定,全关为5分钟 ;多任务同时执行 ;*********************************************************** list p=16c54 #INCLUDE P16C5X.INC ;字节定义 #DEFINE MS500 08H ;分秒 #DEFINE S1 09H ;秒 #DEFINE S30 0AH ;30秒 #DEFINE M 0BH ;分 #DEFINE H 0CH ; #DEFINE START_YS 0DH #DEFINE FLAG1 0EH ; ;A口输出位 #DEFINE CLOSE_OUT 00H ;开阀 #DEFINE OPEN_OUT 01H ;关阀 #DEFINE CLOSE_LED 02H ;开 #DEFINE OPEN_LED 03H ;关 ;B口输入定义 #DEFINE S1_1 00H ;启动 #DEFINE S1_2 01H ;延时 #DEFINE S1_3 02H ;选择 #DEFINE S1_4 03H ;开关 #DEFINE OPEN 04H ;开按钮 #DEFINE CLOSE 05H ;关按钮 #DEFINE OPEN_CILCK 06H ;开到位 #DEFINE CLOSE_CILCK 07H ;关到位 ;标帜FLAG1位定义 #DEFINE ST_YS_FG 00H #DEFINE OPEN_FG 01H ; #DEFINE VT_FG 02H ;阀门延时标帜 #DEFINE BB 03H ;关标帜 #DEFINE O_FG 04H ;开按钮标帜 #DEFINE C_FG 05H ;关按钮标帜 #DEFINE OC_FG 06H ;开到位标帜 #DEFINE CC_FG 07H ;关到位标帜 ; ORG 00H BTFSS STATUS,NOT_PD GOTO WAIT BTFSS STATUS,NOT_TO GOTO DOG
START MOVLW 08H ;w=08h MOVWF FSR ;FSR=08H XH1 CLRF INDF ;08单元处被清零 INCF FSR,F ;FSR=FSR+1,指向下一单元 MOVLW 1FH ;准备检查FSR是否为1FH XORWF FSR,W ;FSR和W异或,FSR保持不变 BTFSS STATUS,Z ;检测Z标志是否为1,是则循环结束 GOTO XH1 ;继续循环
DOG MOVLW 00H ;PA为输出 TRIS PORTA ; CLRF PORTA ;PA为低电平 MOVLW 0FFH ;PB为输入 TRIS PORTB
SET_ST BSF FLAG1,ST_YS_FG ;置开机延时标志 MOVF PORTB,0 ;读开机延时状态 MOVWF START_YS ; MOVLW B'00001111' ANDWF START_YS,1 ; INCF START_YS,1 ;开机延时加1 MOVF START_YS,0 ;延时分钟数n×5 ADDWF START_YS,1 ADDWF START_YS,1 ADDWF START_YS,1 ADDWF START_YS,1 SET_RTCC CLRF TMR0 ; MOVLW B'00001011' ;定义1/16,RTCC为内部计数方式 OPTION ; MOVLW 10H ;0.5秒 MOVWF MS500 MOVLW 02H ;1秒 MOVWF S1 MOVLW 1EH ;30秒 MOVWF S30 MOVLW 02H ;1分钟 MOVWF M MOVLW 3CH ;1小时 MOVWF H WAIT MOVLW 03H ;31.25mS处理一次外部事务 SUBWF TMR0,0 SKPNC GOTO WAIT CLRWDT ;清看门狗 B1 BTFSS PORTB,OPEN ;开按键检测 GOTO B2 ; BTFSC FLAG1,O_FG ;延时确认 GOTO B3 ; BSF FLAG1,O_FG ; B2 BTFSS PORTB,CLOSE ;关按键检测 GOTO A1 ; BTFSC FLAG1,C_FG ;延时确认 GOTO B4 ;关 BSF FLAG1,C_FG ; GOTO A1 ;
B3 BTFSS FLAG1,C_FG ;同时按下停止 GOTO B5 ; BCF PORTA,OPEN_OUT ; BCF PORTA,CLOSE_OUT ; GOTO A1 ; B4 BCF FLAG1,OPEN_FG ;关 BCF PORTA,OPEN_OUT ; GOTO A3 B5 BSF FLAG1,OPEN_FG ;开 BCF PORTA,CLOSE_OUT ; GOTO A2 A1 BTFSS FLAG1,ST_YS_FG ;是否开机延时开通 GOTO A2 BSF PORTA,CLOSE_OUT DECFSZ MS500,1 GOTO WAIT MOVLW 10H ;0.5秒 MOVWF MS500 BTFSC FLAG1,VT_FG ; GOTO C3 ; BTFSS PORTB,CLOSE_CILCK ; GOTO C1 ; BTFSC FLAG1,CC_FG ;延时确认 GOTO C2 ; C1 BTFSS PORTA,CLOSE_LED ;关闭灯闪烁 GOTO C2 BCF PORTA,CLOSE_LED GOTO C3 C2 BSF PORTA,CLOSE_LED C3 DECFSZ S1,1 GOTO WAIT MOVLW 02H ;1秒 MOVWF S1 DECFSZ S30,1 GOTO WAIT MOVLW 1EH ;30秒 MOVWF S30 BTFSC FLAG1,VT_FG ; GOTO $+3 BSF PORTA,CLOSE_LED BSF FLAG1,VT_FG ; DECFSZ M,1 GOTO WAIT MOVLW 02H ;1分钟 MOVWF M DECFSZ START_YS,1 ;5分钟×n GOTO WAIT BCF PORTA,CLOSE_OUT BCF PORTA,CLOSE_LED BSF FLAG1,OPEN_FG BCF FLAG1,ST_YS_FG BCF FLAG1,VT_FG ; GOTO WAIT A2 BTFSS FLAG1,OPEN_FG GOTO A3 BSF PORTA,OPEN_OUT DECFSZ MS500,1 GOTO WAIT MOVLW 10H ;0.5秒 MOVWF MS500 BTFSC FLAG1,VT_FG ; GOTO D3 ; BTFSS PORTB,OPEN_CILCK ; GOTO D1 ; BTFSC FLAG1,OC_FG ;延时确认 GOTO D2 ; D1 BTFSS PORTA,OPEN_LED ;关闭灯闪烁 GOTO D2 BCF PORTA,OPEN_LED GOTO D3 D2 BSF PORTA,OPEN_LED
D3 DECFSZ S1,1 GOTO WAIT MOVLW 02H ;1秒 MOVWF S1 DECFSZ S30,1 GOTO WAIT MOVLW 1EH ;30秒 MOVWF S30
BTFSC FLAG1,VT_FG ; GOTO $+3 BSF PORTA,OPEN_LED BSF FLAG1,VT_FG ;
DECFSZ M,1 GOTO WAIT MOVLW 02H ;1分钟 MOVWF M BCF PORTA,OPEN_LED BCF PORTA,OPEN_OUT BCF FLAG1,OPEN_FG BCF FLAG1,VT_FG ; GOTO WAIT A3 BTFSC FLAG1,OPEN_FG GOTO A2 BSF PORTA,CLOSE_OUT DECFSZ MS500,1 GOTO WAIT MOVLW 10H ;0.5秒 MOVWF MS500 BTFSC FLAG1,VT_FG ; GOTO E3 ; BTFSS PORTB,CLOSE_CILCK ; GOTO E1 ; BTFSC FLAG1,CC_FG ;延时确认 GOTO E2 ; E1 BTFSS PORTA,CLOSE_LED ;关闭灯闪烁 GOTO E2 BCF PORTA,CLOSE_LED GOTO E3 E2 BSF PORTA,CLOSE_LED
E3 DECFSZ S1,1 GOTO WAIT MOVLW 02H ;1秒 MOVWF S1 DECFSZ S30,1 GOTO WAIT MOVLW 1EH ;30秒 MOVWF S30
BTFSC FLAG1,VT_FG ; GOTO $+3 BSF PORTA,CLOSE_LED BSF FLAG1,VT_FG ;
DECFSZ M,1 GOTO WAIT MOVLW 02H ;1分钟 MOVWF M DECFSZ H,1 GOTO WAIT MOVLW 3CH ;1小时 MOVWF H BCF PORTA,CLOSE_OUT BCF PORTA,CLOSE_LED BSF FLAG1,OPEN_FG BCF FLAG1,VT_FG ; GOTO WAIT END
|
|