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