📄 xishou.asm
字号:
IOW IOCE
MOV A,@0xFF ;IOCB =0(enable pull down ) - P62 P61 P60 - P52 P51 p50
IOW IOCB
MOV A,@0x00 ;IOCC =1(enable open drain) P67 P66 P65 P64 - p62 P61 P60
IOW IOCC
MOV A,@0xFF ;IOCD =0 (enable pull high) P67 P66 P65 P64 - p62 P61 P60
IOW IOCD
MOV A,@0 ;关闭电磁阀输出、LED输出
MOV P5OUT,A
MOV P5,A
MOV A,@0X00
IOW IOC5
MOV A,@0x0E ;关闭红外线输出、接收电路
MOV P6OUT,A
MOV P6,A
MOV A,@0X0C
IOW IOC6
NOP
NOP
SLEP ;之后等待看门狗溢出后复位
NOP
NOP
JMP RESET ;不会被执行到,抗干扰用
;JMP WAKEUP
;************************************************************************************
;*****************************按钮检测驱动程序**************************************
;************************************************************************************
;====================================================================
;按键检测程序: 1.在本程序中启动接收电路,并利用本程序中的消抖动延时作为接收电路充电
; 的必要时间以节约时间
; 2.连续几次读入按键口值到KEY_TMP,若KEY_TMP不为0就说明有按键按下
; 3.在按键按下情况下,置KEYPRS_F为1,KEY_TMP赋给KEY_CODE,KEY_PTIMER加1
; 在无按键按下情况下,若KEYPRS_F为1就调用按键处理程序
;PS:在本程序中有条件的调用了按键处理程序
;====================================================================
CHECKKEY:
;检测按钮 (读入P6.7 P6.6的状态)
CLR KEY_TMP
COMA P6
AND A,@0XD0
JBS STAT,Z
MOV KEY_TMP,A
NOP
NOP
NOP
COMA P6
AND A,@0XD0
JBS STAT,Z
MOV KEY_TMP,A
NOP
NOP
NOP
COMA P6
AND A,@0XD0
JBS STAT,Z
MOV KEY_TMP,A
NOP
NOP
NOP
COMA P6
AND A,@0XD0
JBS STAT,Z
MOV KEY_TMP,A
NOP
NOP
NOP
;水压开关处理 ;若是从有水到无水,从无水到有水都强制关闭一次水阀
JBS FLAG,HVWATER_F
JMP NO_HVWATER
HV_NOWATER:
JBC KEY_TMP,CHKWATER
JMP KWATEROV
BC FLAG,HVWATER_F
CALL CLOSE
JMP KWATEROV
NO_HVWATER:
JBS KEY_TMP,CHKWATER
JMP KWATEROV
BS FLAG,HVWATER_F
CALL CLOSE
KWATEROV:
MOV A,@0XC0
AND KEY_TMP,A
;判断是否有按键按下
MOV A,KEY_TMP
XOR A,@0
JBS STAT,Z
JMP KEYPRESSING ;有按键按下
JBS FLAG,KEYPRS_F ;如果是按键释放,
RET
BC FLAG,KEYPRS_F ; a.清除KEYPRS_F
JMP KEYPROCESS ; b.调用按键处理程序
KEYPRESSING:
MOV A,KEY_PTIMER ;如果按键按下,a.就对按键时长加1
XOR A,@255
JBS STAT,Z
INC KEY_PTIMER
MOV A,KEY_TMP ; b.更新KEY_CODE
MOV KEY_CODE,A
BS FLAG,KEYPRS_F ; c.设置KEYPRS_F
RET
;====================================================================
;按键处理程序
;====================================================================
KEYPROCESS:
MOV A,KEY_PTIMER
XOR A,@0
JBC STAT,Z
JMP KEYPRSOV ;若KEY_PTIMER=0,认为是干扰
JBS KEY_CODE,ANDL
JMP KEYPRS2
;对延时开关处理
CALL LIGHTFLASH ;延时指示灯闪烁一次
BS FLAG,DELAY_F ;设置延时出水标志
BC FLAG,AUTO_F
BC FLAG,SW_F
CALL OPEN ;打开出水电磁阀
;若按键时长<1S,限时为5S
MOV A,KEY_PTIMER
SUB A,@4
JBS STAT,C
JMP KEYPRS1_1
;<1S
MOV A,@28 ;设置5S限时
MOV TIME180MS,A
MOV A,@0
MOV TIME30S,A
JMP KEYPRSOV
KEYPRS1_1:
;若按键时长2~3S,限时为15S
MOV A,KEY_PTIMER
SUB A,@17
JBS STAT,C
JMP KEYPRS1_2
;<3S
MOV A,@83 ;设置15S限时
MOV TIME180MS,A
MOV A,@0
MOV TIME30S,A
JMP KEYPRSOV
KEYPRS1_2:
;若按键时长4~8S,限时为2分钟
MOV A,KEY_PTIMER
SUB A,@44
JBS STAT,C
JMP KEYPRS1_3
;<8S
MOV A,@0 ;设置2分钟限时
MOV TIME180MS,A
MOV A,@4
MOV TIME30S,A
JMP KEYPRSOV
KEYPRS1_3:
;若按键时长>9SS,限时为20分钟
MOV A,KEY_PTIMER
SUB A,@44
JBC STAT,C
JMP KEYPRSOV
;>9S
MOV A,@0 ;设置20分钟限时
MOV TIME180MS,A
MOV A,@40
MOV TIME30S,A
JMP KEYPRSOV
KEYPRS2:
JBS KEY_CODE,ANSW
JMP KEYPRSOV
;对手动开关处理
CALL LIGHTFLASH ;手动指示灯闪烁一次
BC FLAG,AUTO_F
BC FLAG,DELAY_F
JBS FLAG,SW_F
JMP KEYPRS2_SWON
;手动关水
BC FLAG,SW_F ;清除手动出水标志
CALL CLOSE ;打开关水电磁阀
MOV A,@0 ;清除限时
MOV TIME180MS,A
MOV A,@0
MOV TIME30S,A
JMP KEYPRSOV
;手动出水
KEYPRS2_SWON:
BS FLAG,SW_F ;设置手动出水标志
CALL OPEN ;打开出水电磁阀
MOV A,@0 ;设置2分钟限时
MOV TIME180MS,A
MOV A,@4
MOV TIME30S,A
;若按键时长超过9秒种,限时改为20分钟
MOV A,KEY_PTIMER
SUB A,@44
JBC STAT,C
JMP KEYPRSOV
;超过9S
MOV A,@0 ;设置20分钟限时
MOV TIME180MS,A
MOV A,@40
MOV TIME30S,A
JMP KEYPRSOV
KEYPRSOV:
CLR KEY_PTIMER
CLR KEY_CODE
RET
;====================================================================
;限时处理程序
;====================================================================
TIMELIMITROCESS:
;每次调用,计时器减去1个单位
MOV A,TIME180MS
XOR A,@0
JBS STAT,Z
JMP DECTIME180MS
MOV A,TIME30S
XOR A,@0
JBS STAT,Z
JMP DECTIME30S
;当计时器减到0时,关闭出水电磁阀
JBC FLAG,DELAY_F
JMP TLPRSOV
JBC FLAG,AUTO_F
JMP TLPRSOV
JBC FLAG,SW_F
JMP TLPRSOV
RET
TLPRSOV:
JBC FLAG,AUTO_F
BS FLAG,TLIMITCLS ;对于自动感应出水,在限时到后设置TLIMITCLS,
;以方便在还有感应物的条件下强制关闭电磁阀
BC FLAG,DELAY_F
BC FLAG,AUTO_F
BC FLAG,SW_F
CALL CLOSE
RET
DECTIME180MS:
DEC TIME180MS
RET
DECTIME30S:
DEC TIME30S
MOV A,@165
MOV TIME180MS,A
RET
;************************************************************************************
;*****************************红外线反射检测驱动程序*********************************
;************************************************************************************
;====================================================================
;检测反射物程序
; 检测的思路:以2个脉冲为1组检测单位,若收到不是2个就退出;
; 否则就加发1组去检测,等连续N组一致后即设置REFLECT_F标志
; 在执行程序中用消抖动程序来保证不频繁切换电磁阀
;====================================================================
CHKINFRA:
BS P6OUT,ENRCV ;启动接收电路
MOV A,P6OUT
MOV P6,A
CALL DELAY1MS
CALL DELAY1MS
;初始化接收变量
BC FLAG,REFLECT_F ;清除检测到标志
;进行第一组探测
CALL SENDONEWAVE ;发射一组红外波
JBS FLAG, RCVWAVE_F ;本次收到反射信号时,才允许进行下一次检测
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -