?? 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 + -