📄 m_master.asm
字号:
CALL DELAY124
TX_NEXT:
SZ [TX_DATA1].7;0
JMP TXX ;CALL TX1
CALL TX0
TXX1:
RLC [TX_DATA3]
RLC [TX_DATA2]
RLC [TX_DATA1]
SDZ CNT_Bits ;TX_CNT
JMP TX_NEXT
;----------------------------
MOV A,SAVE_DATA1
MOV [TX_DATA1],A
MOV A,SAVE_DATA2
MOV [TX_DATA2],A ;恢复回传码
MOV A,SAVE_DATA3
MOV [TX_DATA3],A
;----------------------------
RET
TXX:
CALL TX1
JMP TXX1
;--------------------
TX0:
SET PB.5;PA.7 ;0
CALL DELAY4
CLR PB.5;PA.7
CALL DELAY12
RET
TX1:
SET PB.5;PA.7 ;1
CALL DELAY12
CLR PB.5;PA.7
CALL DELAY4
RET
;----------------------
;======================================================
;中断子程序
;======================================================
SEVER:
;/CLR WDT
MOV BUF,A
MOV A,STATUS
MOV BUF_STATUS,A
CLR WDT
CLR [INTC].TF
CLR [TMR]
SET [TMRC].TON
;--------------------------------- ;自动设防中断体
SNZ INT_Auto
JMP NO_Auto
INC CNT_Auto4s;COUNT_4s ;4s
SZ CNT_Auto4s;COUNT_4s
JMP EXIT_INT
INC CNT_Auto;COUNT_30s ;Auto
MOV A,CNT_Auto;COUNT_30s ;Auto
XOR A,CNT_Auto10s;CNT10s_30s ;3D ;12s
SZ ACC
JMP EXIT_INT
CLR F_Auto
CLR INT_Auto ;退出自动设防中断体
SnZ F_guard ;在设防下,熄火或Lockoff时,不再进入自动设防
SET F_KEY_Auto ;4 ;进入自动声光设防
CLR [TMRC].TON
SNZ F_START
JMP EXIT_INT
SET [TMRC].TON ;已启动后解除时,进入自动设防后再进入3分熄火等待
;----------------------------------
NO_Auto:
SZ Un_Light
JMP INT1_1
SET F_run ;n.串联
;SZ Relay_Stop ;Relay stop 释放,延时,防止自身振动连续响应
;JMP Free_run
;---------------------------------;第2次振动,and the lock on
CLR F_START
INC COUNT_240ms
MOV A,COUNT_240ms
XOR A,20D ;240ms
SNZ Z;ACC
JMP INT1_1
CLR COUNT_240ms
SZ Open_Light ; SZ Light
JMP INT1_2
;SnZ Un_Light
SET Light
SET Open_Light ;开灯标记
JMP INT1_1
INT1_2:
;SNZ Un_Light
CLR Light
CLR Open_Light
;-------------------------------------
INT1_1:
SZ F_Rob ;防抢报警不计时,不停止的报警
JMP EXIT_INT
SZ Relay_Stop ;Relay stop 释放,延时,防止自身振动连续响应
JMP Free_run
;---------------------------
INC COUNT_4s ;16.384ms*256=4 s
SZ COUNT_4s
JMP EXIT_INT
;SZ F_START
;JMP Time_STA
;CLR F_START
;CLR Vdd_sta ;恢复引擎
;CLR Flameout
;Time_STA:
INC COUNT_30s
;-------------------------------------
mov a,count_30s
xor a,2d
sz z
jmp alr
mov a,count_30s ;隔 8s 发一次,3 次发完
xor a,4d
sz z
jmp alr
mov a,count_30s
xor a,6d
sz z
jmp alr
ch_over:
;--------------------------------------
MOV A,COUNT_30s
XOR A,CNT10s_30s;COUNT_First ;7D ;30s 十秒或者三十秒
SZ ACC
JMP EXIT_INT
SET F_run;CLR F_run ;关闭继电器的那一刻,不扫描振动
CLR Bugle ;关
CLR Light
CLR F_first ;CLOSE Vib
;CLR F_ROB
;;CLR F_START
;/CLR Vdd_sta ;恢复引擎
;;;;;;;;;;;;;SnZ LockOn ;3秒内未插入钥匙,则熄火
;/CLR Flameout
SET Relay_Stop ;Relay stop 释放,延时,防止自身振动连续响应
SET Un_Light ;关闭后再等待完全停止,此时不在进入闪灯,只进下面的延时
SNZ F_guard
JMP Free_run
CLR Vdd_sta ;恢复引擎
;;;;;;;;;;;;;SnZ LockOn ;3秒内未插入钥匙,则熄火
CLR Flameout
;------------ 等待继电器完全停止,再扫描LockOn ,vib ---
Free_run:
INC COUNT_30s
MOV A,114d;30D;50D;15D ;240MS
ADD A,CNT10s_30s
XOR A,COUNT_30s
SZ ACC
JMP EXIT_INT
CLR F_run
;/CLR F_START
CLR Relay_Stop ;Relay stop 释放,延时,防止自身振动连续响应
CLR Un_Light
;--------------------------------------------------
;--------------------------
;清除所有再次发射
clr come_lockon
clr come_vib
;--------------------------
;-----设防时上面已关过,这重复关或解除下是只在这里关,让安全的退出再进入自动设防-------
CLR Vdd_sta ;恢复引擎
;;;;;;;;;;;;;SnZ LockOn ;3秒内未插入钥匙,则熄火
CLR Flameout
;-----------------------------------------------------------
;/SnZ Lockon
;SET TurnOn_Lock
CLR F_START
CLR [TMRC].TON
EXIT_INT:
MOV A,BUF_STATUS
MOV STATUS,A
MOV A,BUF
RETI
alr:
sz come_lockon ;再次发射
set Tx_ComeLock
sz come_vib
set Tx_ComeVib
jmp ch_over
;=======================================================
;搜寻键
;=======================================================
KEY_BY_KEY:
CLR WDT
MOV A,[Data3]
AND A,0F0H
MOV [KEY_Cancel],A
XOR A,[CHKData3]
SNZ Z;[STATUS].Z
JMP NEXT
MOV A,[Data2]
XOR A,[CHKData2]
SNZ Z;[STATUS].Z
JMP NEXT
MOV A,[Data1]
XOR A,[CHKData1]
SNZ Z;[STATUS].Z
JMP NEXT
JMP KEY_COMP
NEXT:
MOV A,[KEY_Cancel]
XOR A,[CHKData6]
SNZ Z;[STATUS].Z
JMP EXIT_KEY;JMP GU;JMP START
MOV A,[Data2]
XOR A,[CHKData5]
SNZ Z;[STATUS].Z
JMP EXIT_KEY;JMP GU;JMP START
MOV A,[Data1]
XOR A,[CHKData4]
SNZ Z;[STATUS].Z
JMP EXIT_KEY;JMP GU;JMP START ;Error_Romote
KEY_COMP:
;---------------------------------
MOV A,[DATA3]
MOV [TX_Data3],A
MOV A,[DATA2] ;回传 Remote code
MOV [TX_Data2],A
MOV A,[DATA1]
MOV [TX_Data1],A
call WriteRemote ;保护 Remote code 以免复位清0过后不能正确回传正在使用的遥控器码
;---------------------------------
MOV A,[Data3] ;判断按键
AND A,0FH
MOV [KEY_Only],A
XOR A,01H;02H
SZ Z;[STATUS].Z
SET F_KEY1;JMP KEY1
MOV A,[KEY_Only]
XOR A,02H;01H
SZ Z;[STATUS].Z
SET F_KEY2;JMP KEY2
MOV A,[KEY_Only]
XOR A,04H
SZ Z;[STATUS].Z
SET F_KEY3;JMP KEY3
MOV A,[KEY_Only]
XOR A,08H
SZ Z;[STATUS].Z
SET F_KEY4;JMP KEY4
MOV A,[KEY_Only]
XOR A,03H
SZ Z;[STATUS].Z
SET F_KEY5;JMP KEY5
MOV A,[KEY_Only]
XOR A,05H
SZ Z;[STATUS].Z
SET F_KEY6;JMP KEY6
;MOV A,[KEY_Only]
;XOR A,06H
;SZ Z;[STATUS].Z
;SET F_KEY7;JMP KEY7
;MOV A,[KEY_Only]
;XOR A,07H
;SZ Z;[STATUS].Z
;SET F_KEY8;JMP KEY8
EXIT_KEY:
NOP
RET
;=======================================================
;进入学习
;=======================================================
Learn:
MOV A,8D ;2s
MOV COUNT4,A
LOOP2:
MOV A,200D
MOV COUNT3,A
LOOP1:
MOV A,250D ; 2mS计时
MOV COUNT2,A
LOOP0:
CLR WDT
SZ learn_key ; 输入高?
JMP EXIT_Learn ;JMP MAIN ; 否,退出循环
SDZ COUNT2 ; 是, 2mS倒计时
JMP LOOP0
SDZ COUNT3
JMP LOOP1
SDZ COUNT4
JMP LOOP2
SET Bugle ;提示,允许学习,
SET Light
CALL DELAY240ms;CALL Dly250mS
CLR Bugle
CLR Light
MOV A,220D; ;5s内学习有效
MOV COUNT2,A
RE1: MOV A,200D
MOV COUNT3,A
RE: CLR WDT
CALL RECEIVE
snz c;SZ [F_Receive].Right
JMP WRIGHT ;加时间限制,5S内有效
SDZ COUNT3
JMP RE
SDZ COUNT2
JMP RE1
SET Bugle ;5秒后若学习不成功# 闪,叫一声
SET Light
CALL DELAY240ms;CALL Dly250ms
CLR Bugle
CLR Light
JMP EXIT_Learn ;JMP MAIN
WRIGHT:
CLR WDT
mov A,[Data3]
mov [temp0],A
mov A,0fh
andm A,[temp0]
mov a,[temp0]
xor a,02h
SZ Z;sz [Status].z
JMP Startlearn ;jmp Time08s
mov A,[temp0]
xor a,04h;03h;01h
SZ Z;sz [Status].z
JMP Startlearn ;jmp Time4s
JMP EXIT_Learn ;JMP MAIN ;jmp nokey
StartLearn:
sz F_SaveKeyArea ;[Flag5].SaveKeyArea
jmp Area2Save
mov A,[Data1]
mov [CHKData1],A
mov A,[Data2]
mov [CHKData2],A
mov A,0f0h
and A,[Data3]
mov [CHKData3],A
set F_SaveKeyArea ;[Flag5].SaveKeyArea
jmp SaveOver
Area2Save:
mov A,[Data1]
mov [CHKData4],A
mov A,[Data2]
mov [CHKData5],A
mov A,0f0h
and A,[Data3]
mov [CHKData6],A
clr F_SaveKeyArea ;[Flag5].SaveKeyArea
SaveOver:
CLR WDT
CALL WRITEBYTE
SET Bugle ;学习成功,闪,叫两下
SET Light
CALL DELAY240ms;CALL Dly250ms
CLR Bugle
CLR Light
;CALL DELAY240ms;CALL Dly250ms
CALL DELAY240ms
SET Bugle
SET Light
CALL DELAY240ms;CALL Dly250ms
CLR Bugle
CLR Light
EXIT_Learn:
RET
;-----------------------
DELAY_Auto:
MOV A,80d;120d;20D
MOV COUNT2,A
Dau1:
MOV A,236d;237D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;原来是237D
MOV COUNT3,A
Dau2:
JMP $+1
JMP $+1
CLR WDT
SDZ COUNT3
JMP Dau2
SDZ COUNT2
JMP Dau1
RET
DELAY240ms:
MOV A,120d;20D
MOV COUNT2,A
DLY24b:
MOV A,236d;237D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;原来是237D
MOV COUNT3,A
DLY24a:
JMP $+1
JMP $+1
CLR WDT
SDZ COUNT3
JMP DLY24a
SDZ COUNT2
JMP DLY24b
RET
;DELAY240ms:
; MOV A,20d
; MOV COUNT4,A
;DLY240:
; CALL DELAY124
; SDZ COUNT4
; JMP DLY240
; RET
DELAY4:
MOV A,50D
MOV COUNT2,A
DLY4a:
JMP $+1
JMP $+1
CLR WDT
SDZ COUNT2
JMP DLY4a
RET
DELAY124:
MOV A,6D
MOV COUNT2,A
DLY124b:
MOV A,237D;250D
MOV COUNT3,A
DLY124a:
JMP $+1
JMP $+1
CLR WDT
SDZ COUNT3
JMP DLY124a
SDZ COUNT2
JMP DLY124b
RET
DELAY12:
MOV A,140D;150D
MOV COUNT2,A
DLY12a:
JMP $+1
JMP $+1
CLR WDT
SDZ COUNT2
JMP DLY12a
RET
;====================================================================
; 数据接收
;====================================================================
RECEIVE:
SNZ RF ;BTFSS RFIN ; 输入低电平?
JMP RMT_0 ;GOTO RMT_0 ; 是,接收错误
MOV A,10D ;MOVLW .10 ; 10mS计时
MOV [CNT1],A ;MOVWF CNT1
RCV0:
MOV A,200D ;MOVLW .200
MOV [CNT0],A ;MOVWF CNT0
RCV1:
SNZ RF ;BTFSS RFIN ; 输入高?
JMP RCV2 ;GOTO RCV2 ; 否,退出循环
;-----------------------------
SDZ [CNT0] ;DECFSZ CNT0,F ; 是, 10mS倒计时
JMP RCV1 ;GOTO RCV1
;------------------------------
SDZ [CNT1] ;DECFSZ CNT1,F
JMP RCV0 ;GOTO RCV0
RCV2:
CLR [CNT0] ;CLRF CNT0 ; 清计时器
CLR [CNT1] ;CLRF CNT1
; *************************************************************************
; 开始对同步头计时
; *************************************************************************
RCV3:
SZ RF ;BTFSC RFIN ; 输入高电平?
JMP RCV6 ;GOTO RCV6 ; [0][0] YES--END CALIBRATION
INC [CNT0] ;INCF CNT0,1 ; 16位计数器加1
SZ Z;[status].z;Z ; ;SKPNZ ; 无进位,跳过
INC [CNT1] ;INCF CNT1,1 ; 高位加1
CLR WDT ;CLRWDT ; 清看门狗
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -