;LIST P=SM311, CLOCK=4MHZ, WDT=DISBALE,INT=ENABLE
;-----------------------------------------------------------
; LOUDOUT RA0 1 14 RA1 WHITE_BULB
; SIGNAL_IN RB7 2 13 RA2 BLUE_BULB
; READ RB6 3 12 RA3 BROWN_BULB
; VDD 4 11 VSS
; K1 RB5 5 10 RB0 YELLOW_BULB
; K2 RB4 6 9 RB1 BUZ
; RESET RB3 7 8 RB2 POWER_CUT
;-----------------------------------------------------------
INDF EQU 00H
TMR0 EQU 01H
PCL EQU 02H
STATUS EQU 03H
FSR EQU 04H
RA EQU 05H
;-----------------------------------------------------------
LOUDOUT EQU 0
WHITE_BULB EQU 1
BLUE_BULB EQU 2
BROWN_BULB EQU 3
;-----------------------------------------------------------
RB EQU 06H
;-----------------------------------------------------------
YELLOW_BULB EQU 0
BUZ EQU 1
POWER_CUT EQU 2
K2 EQU 4
K1 EQU 5
READ EQU 6
SIGNAL_IN EQU 7
;-----------------------------------------------------------
IRQM EQU 09H
;-----------------------------------------------------------
TM0M EQU 0
PBM EQU 1
INTM EQU 7
;-----------------------------------------------------------
IRQF EQU 0AH
;-----------------------------------------------------------
TM0F EQU 0
PBF EQU 1
;-----------------------------------------------------------
PA_PDM EQU 0BH
PB_PUP EQU 0CH
PB_PDM EQU 0DH
PB_POD EQU 0EH
WAKEUP EQU 0FH
;-----------------------------------------------------------
A EQU 0
M EQU 1
;---STATUS REG----------------------------------------------
C EQU 0
DC EQU 1
Z EQU 2
PD EQU 3
TO EQU 4
GP0 EQU 5
GP1 EQU 6
GP2 EQU 7
;---OPTION REG----------------------------------------------
PS0 EQU 0
PS1 EQU 1
PS2 EQU 2
PSA EQU 3
T0SE EQU 4
T0CS EQU 5
INTEDG EQU 6
;---PA_PDM REG----------------------------------------------
DB0 EQU 0
DB1 EQU 1
DB2 EQU 2
EXTEN EQU 6
RTCEN EQU 7
;---PB_POD REG----------------------------------------------
OB0 EQU 0
OB1 EQU 1
OB2 EQU 2
OB4 EQU 4
OB5 EQU 5
OB6 EQU 6
OB7 EQU 7
;---WAKEUP REG----------------------------------------------
EN0 EQU 0
EN1 EQU 1
EN2 EQU 2
EN4 EQU 4
EN5 EQU 5
EN6 EQU 6
EN7 EQU 7
;-----------------------------------------------------------
;CONSUMER REGISTER
;-----------------------------------------------------------
MAXDATA EQU .250 ; 高低電平寬度最大值
;-----------------------------------------------------------
CODE_TOTAL EQU 20H
LCODE EQU 21H ; 記錄一幀碼的低8位數據
MCODE EQU 22H ; 記錄一幀碼的中8位數據
HCODE EQU 23H ; 記錄一幀碼的高8位數據
;-----------------------------------------------------------
LBIT EQU 25H ; 記錄'0'和'1'碼的低電平寬度
HBIT EQU 26H ; 記錄'0'和'1'碼的高電平寬度
LCODE_EE EQU 27H ; 記錄EEPROM低8位數據
MCODE_EE EQU 28H ; 記錄EEPROM中8位數據
HCODE_EE EQU 29H ; 記錄EEPROM高4位數據
MODEREG EQU 2AH ; 按鍵定時器
SHIFT EQU 2BH
KEYREG EQU 2CH
CNT_LW EQU 2DH ; 定時寄存器
CNT_HI EQU 2EH
;-----------------------------------------------------------
FRAME EQU 2FH ;
;-----------------------------------------------------------
CNT EQU 30H
CNT2 EQU 31H
DEL1 EQU 32H
CNT_32MS EQU 33H
CNT_4S EQU 34H
CNT_1M EQU 35H
W_REG EQU 36H
S_REG EQU 37H
R_BUZ EQU 38H
;-----------------------------------------------------------
LREG EQU 3DH ; 手動開關瞬間按燈閃爍順序
; LREG值為"1":白燈亮
; LREG值為"2":白燈+藍燈亮
; LREG值為"3":白燈+藍燈+棕燈亮
; LREG值為"4":白燈+藍燈+棕燈+黃燈亮
;-----------------------------------------------------------
FREG_1 EQU 3EH
UP_FLAG EQU 7 ; FREG_1.7 上電標志位。
DELAY_FLAG EQU 6 ; FREG_1.6 按鍵延時1分鐘標志
DELAY200MS_FLAG EQU 5 ; FREG_1.5 延時10秒標志位。
REMOTE_FLAG EQU 4 ; FREG_1.4 遙控按鍵成功標志位。
OUT4_FLAG EQU 3 ; FREG_1.3 4路輸出狀態標志位。
OUT3_FLAG EQU 2 ; FREG_1.2 3路輸出狀態標志位。
OUT2_FLAG EQU 1 ; FREG_1.1 2路輸出狀態標志位。
OUT1_FLAG EQU 0 ; FREG_1.0 1路輸出狀態標志位。
;-----------------------------------------------------------
FREG_2 EQU 3FH
R_K1 EQU 0 ;'0'->延時1路輸出不閃動,'1'->延時1路輸出閃動
R_K2 EQU 1 ;'0'->四路遙控輸出,'1'->三路輸出
R_LOADOUT EQU 2 ;'0'->無負載輸出,'1'->有負載輸出
R_80M EQU 3 ;80分鐘定時器,'0'->
R_AGAINST EQU 4 ;'0'->防盜功能未開啟,'1'->防盜功能已開啟
R_AGAINST_L1 EQU 5 ;'0'->L1燈閃兩次,'1'->L1燈閃一次
OUT_ONOFF EQU 6 ;ON/OFF松鍵標志
OUT_DLEY EQU 7 ;DLEAY松鍵標志
;=======================================================
;=======================================================
ORG 3FFH
LGOTO 0X00
ORG 0X00
LGOTO BOOT
ORG 3FEH
LGOTO INTERRUPT_TMR0
;=======================================================
;2262,8位地址碼
;=======================================================
ORG 001H
LOW_ADDRESS:
RETLA 0X30
HIGH_ADDRESS:
RETLA 0XEF
;========================================================
;中斷子程序
;========================================================
ORG 004H
INTERRUPT_TMR0:
MOVAM W_REG
SWAP STATUS,A
MOVAM S_REG
INT_TMR0_START:
BTSC IRQF,TM0F
LGOTO INT_TMR0_DEAL
INT_TMR0_END:
BC IRQF,TM0F
SWAP S_REG,A
MOVAM STATUS
SWAP W_REG,M
RETI
INT_TMR0_DEAL:
MOVLA .250
MOVAM TMR0
INC CNT_32MS,M
BTSC FREG_1,REMOTE_FLAG
INC MODEREG,M ;按鍵松鍵時間寄存器
; BTSC FREG_1,DELAY200MS_FLAG
; INC R_BUZ,M
MOVLA .125
SUB CNT_32MS,A
BTSS STATUS,Z
LGOTO INT_TMR0_END
CLR CNT_32MS
INC CNT_4S,M
; MOVLA .1
MOVLA .15
SUB CNT_4S,A
BTSS STATUS,Z
LGOTO INT_TMR0_END
CLR CNT_4S
INC CNT_1M,M
MOVLA .100 ;80分鐘定時器
SUB CNT_1M,A
BTSS STATUS,Z
LGOTO INT_TMR0_END
CLR CNT_32MS
CLR CNT_4S
CLR CNT_1M
LGOTO INT_TMR0_END
;=======================================================
;延時子程序
;=======================================================
DELAY:
MOVLA 0XFF
MOVAM DEL1
LOOP_DELAY:
CLRWDT
LGOTO $+1
LGOTO $+1
LGOTO $+1
LGOTO $+1
LGOTO $+1
DECSZ DEL1,M
LGOTO LOOP_DELAY
RETLA 0X00
;----------------------------------
DELAY1:
LGOTO $+1 ;2
LGOTO $+1 ;2
DELAY2: NOP ;1
DELAY3: NOP ;1
DELAY4: NOP ;1
DELAY5: NOP ;1
DELAY6: NOP ;1
DEALY7: LGOTO $+1 ;2
DELAY8: NOP ;1
DELAY9: NOP ;1
DEALYA: NOP ;1
DELAYB: NOP ;1
RETLA 0X00
;=======================================================
;重新計時子程序
;=======================================================
RESTART_TIME:
MOVLA .250
MOVAM TMR0
CLR CNT_32MS
CLR CNT_4S
CLR CNT_1M
RETLA 0X00
;=======================================================
;L1燈即:WHITE_BULB,閃爍一次子程序
;=======================================================
WHITE_BULB_FLISH:
MOVLA 0X02 ;按鍵取反讓其閃爍
XOR RA,M
MOVLA .168
MOVAM SHIFT
MOVLA .255
MOVAM CNT
NOP
NOP
NOP
NOP
DECSZ CNT,M
LGOTO $-3
DECSZ SHIFT,M
LGOTO $-7
RETLA 0X00
;=======================================================
;按鍵延時1與延時80分鐘定時關閉子程序
;=======================================================
TST_KEYDELAY:
MOVLA .3 ;去遙控器按鍵抖動
SUB MODEREG,A ;松開鍵
BTSS STATUS,C
LGOTO TST_KEYDELAY_END
MOVLA 0X07
BTSS FREG_2,R_K2 ;判斷是三路或者是四路遙控
MOVLA 0X0F
AND FREG_1,A
BTSC STATUS,Z
LGOTO OPEN_LOAD
BC RA,LOUDOUT
LGOTO LOAD_JUDGE_END
OPEN_LOAD:
BS RA,LOUDOUT ;如果沒有燈亮,打開負載
LOAD_JUDGE_END:
; BTSS FREG_1,DELAY200MS_FLAG
; LGOTO BUZ100MS_END
; MOVLA .7
; SUB R_BUZ,A
; BTSS STATUS,C
; LGOTO OPEN_BUZPRO
; LGOTO OFF_BUZPRO
;OPEN_BUZPRO:
; BS RB,BUZ
; LGOTO BUZ100MS_END
;OFF_BUZPRO:
; BC RB,BUZ
; CLR R_BUZ
; BC FREG_1,DELAY200MS_FLAG
;BUZ100MS_END:
BTSS FREG_1,REMOTE_FLAG ;遙控成功標志檢測,
LGOTO DLEAY_START
; BTSS FREG_1,DELAY_FLAG
; LGOTO STATE_BEGIN
;
; BTSS FREG_2,R_K1 ;檢測延時L1燈,是否閃爍
; LGOTO STATE_BEGIN ;FREG_2.R_K1=0不閃爍
;
; BTSC FREG_2,R_AGAINST
; LGOTO STATE_BEGIN ;當防盜功能開啟后燈不用再閃爍
;
; BTSC FREG_1,DELAY200MS_FLAG
; LGOTO STATE_BEGIN
;
; LCALL WHITE_BULB_FLISH
; MOVLA 0X02 ;按鍵取反讓其閃爍停止
; XOR RA,M
STATE_BEGIN:
LCALL RESTART_TIME
BC FREG_1,REMOTE_FLAG ;設置按鍵松開標志
DLEAY_START:
BTSC FREG_1,DELAY_FLAG ;延時按鍵標志=0
LGOTO DELAY_1M_PRO
BTSS FREG_2,R_AGAINST ;檢測防盜是否開啟
LGOTO TST_KEYDELAY_END ;防盜沒有開啟,直接返回
LGOTO AGAINST_80M_PRO ;進入防盜功能子程序
DELAY_1M_PRO:
MOV CNT_1M,A
BTSC STATUS,Z
LGOTO TST_KEYDELAY_END ;CNT_1M=0,未到1分鐘返回
MOVLA 0X1
MOVAM RA
CLR RB
MOVLA 0XB0
AND FREG_1,M ;清除四盞燈的點亮標志,和延時按鍵標志
LCALL RESTART_TIME
LGOTO TST_KEYDELAY_END
AGAINST_80M_PRO:
BTSC FREG_2,R_80M ;0->應進入關閉的80分鐘,1->應輸出全部負載4分鐘
LGOTO AGAINST_L1_SHINE4M
MOVLA .80 ;80分鐘定時
; MOVLA .4
SUB CNT_1M,A
BTSS STATUS,Z
LGOTO TST_KEYDELAY_END
BS FREG_2,R_80M ;80分鐘,將R_80標志置1,
MOVLA 0X0E
MOVAM RA ;點亮L1/L2/L3
MOVLA 0X0F
IOR FREG_1,A
MOVAM FREG_1
LGOTO AGAINST_L1_SHINE_CHANGE
AGAINST_L1_SHINE4M:
MOVLA .4
; MOVLA .1
SUB CNT_1M,A ;4分鐘定時
BTSS STATUS,Z
LGOTO TST_KEYDELAY_END
BC FREG_2,R_80M
MOVLA 0X00
MOVAM RA
MOVLA 0XF8
AND FREG_1,A ;清除燈的標志
MOVAM FREG_1
AGAINST_L1_SHINE_CHANGE:
BC FREG_1,REMOTE_FLAG
LCALL RESTART_TIME
LGOTO TST_KEYDELAY_END
;=======================================================
;掉電子程序
;=======================================================
POWER_CUT_PRO:
MOVLA 00H ;關閉中斷
MOVAM IRQM
MOVLA 0X00
MOVAM RA ;熄滅白/藍/棕三盞燈
MOVAM RB ;熄滅黃燈
MOVLA .8
MOVAM CNT
LCALL DELAY
LCALL DELAY
DECSZ CNT,M
LGOTO $-3
BTSC RB,POWER_CUT
LGOTO HAND_SWITCH_PRO_END
POWER_CUT_PRO_LOOP:
BTSS RB,POWER_CUT
LGOTO POWER_CUT_PRO_LOOP
BTSS FREG_1,UP_FLAG ;檢測掉電標志,
LGOTO POWER_CUT_PRO_END ;"0"表示未掉電,"1"表示掉電
INC LREG,M ;手動開關的4個狀態
MOVLA .5 ;四路遙控
BTSC FREG_2,R_K2 ;判斷是三路和四路遙控
MOVLA .4 ;三路遙控
SUB LREG,A
BTSS STATUS,C
LGOTO HAND_SWITCH_PRO
MOVLA .1
MOVAM LREG
LGOTO HAND_SWITCH_PRO
POWER_CUT_PRO_END
BS FREG_1,UP_FLAG ;將掉電標志設為"1"
; MOVLA 0X00
; MOVAM RA ;熄滅白/藍/棕三盞燈
; MOVAM RB ;熄滅黃燈
LGOTO POWER_CUT_PRO_LOOP
;=======================================================
;掉電上電后燈狀態
;=======================================================
HAND_SWITCH_PRO:
BC FREG_1,UP_FLAG ;將掉電標志值為"0"
BC FREG_1,DELAY_FLAG ;清除按鍵延時標志
BC FREG_2,R_AGAINST
MOVLA .1
MOVAM CNT
LCALL DELAY
LCALL DELAY
DECSZ CNT,M
LGOTO $-3
MOVLA .1
SUB LREG,A
BTSC STATUS,Z
LGOTO SWITCH_1_PRO
MOVLA .2
SUB LREG,A
BTSC STATUS,Z
LGOTO SWITCH_2_PRO
MOVLA .3
SUB LREG,A
BTSC STATUS,Z
LGOTO SWITCH_3_PRO
; MOVLA 0X0E ;點亮白/藍/棕三盞燈
; MOVAM RA
; MOVLA 0X01 ;點亮黃燈
; MOVAM RB
BS RA,WHITE_BULB
BS RA,BLUE_BULB
BS RA,BROWN_BULB
BS RB,YELLOW_BULB
MOVLA 0X0F
IOR FREG_1,A
MOVAM FREG_1
LGOTO HAND_SWITCH_PRO_END
SWITCH_1_PRO:
; MOVLA 0X00
; MOVAM RB
; MOVLA 0X02
; MOVAM RA ;點亮白燈
BS RA,WHITE_BULB ;點亮白燈
MOVLA 0XF1
AND FREG_1,A
MOVAM FREG_1
BS FREG_1,OUT1_FLAG
LGOTO HAND_SWITCH_PRO_END
SWITCH_2_PRO:
; MOVLA 0X00
; MOVAM RB
; MOVLA 0X06 ;點亮白/藍兩盞燈
; MOVAM RA
BS RA,WHITE_BULB ;點亮白/藍兩盞燈
BS RA,BLUE_BULB
MOVLA 0XF3
AND FREG_1,A
MOVAM FREG_1
MOVLA 0X03
IOR FREG_1,A
MOVAM FREG_1
LGOTO HAND_SWITCH_PRO_END
SWITCH_3_PRO:
; MOVLA 0X00
; MOVAM RB
; MOVLA 0X0E ;點亮白/藍/棕三盞燈
; MOVAM RA
BS RA,WHITE_BULB
BS RA,BLUE_BULB
BS RA,BROWN_BULB
BC FREG_1,OUT4_FLAG
MOVLA 0X07
IOR FREG_1,A
MOVAM FREG_1
LGOTO HAND_SWITCH_PRO_END
HAND_SWITCH_PRO_END:
BTSC FREG_1,OUT1_FLAG
BS RA,WHITE_BULB
BTSC FREG_1,OUT2_FLAG
BS RA,BLUE_BULB
BTSC FREG_1,OUT3_FLAG
BS RA,BROWN_BULB
BTSC FREG_1,OUT4_FLAG
BS RB,YELLOW_BULB
LCALL RESTART_TIME
MOVLA 81H
MOVAM IRQM
LGOTO MAIN
;=======================================================
;接收讀碼器發送的碼型
;=======================================================
RX:
CLR LBIT
REC_LOW_LEVEL: ;接收電平信號,并記錄其寬度
BTSC RB,READ
LGOTO RX_TOTAL
DECSZ LBIT,M ;所接收到的為,2262,A0低電平寬度
LGOTO REC_LOW_LEVEL
RX_ERROR: ; STATUS.C=1,返回錯誤信息。
BS STATUS,C
RETLA 0X00
;----------------------------------
RX_TOTAL:
MOVLA 0X08
MOVAM CNT
RX_LOOP:
CLR HBIT
RX_HIGH_LEVEL:
BTSS RB,READ
LGOTO RX_JUDGE
DECSZ HBIT,M ;記錄高電平的寬度
LGOTO RX_HIGH_LEVEL
LGOTO RX_ERROR
RX_JUDGE:
MOV LBIT,A
SUB HBIT,A ;HBIT>LBIT,則:A=1
RR MCODE,M
RR LCODE,M
CLR HBIT
RX_LOW_LEVEL: ;低電平持續時間檢測
BTSC RB,READ
LGOTO RX_JUDGE_1 ;高電平,跳轉RX_JUDGE_1
DECSZ HBIT,M
LGOTO RX_LOW_LEVEL
LGOTO RX_ERROR ;低電平時間過長,錯誤返回。
RX_JUDGE_1:
MOV LBIT,A
SUB HBIT,A
RR MCODE,M
RR LCODE,M
DECSZ CNT,M
LGOTO RX_LOOP
RX_OK:
BC STATUS,C
RETLA 0X00
;=======================================================
;發送碼型給外在讀碼器
;=======================================================
TX:
BS RB,READ
MOVLA 0X84
IODIR RB
MOVLA 0X07
MOVAM CNT
BC RB,READ
LCALL DELAY9
DECSZ CNT,M
LGOTO $-2
BS RB,READ
MOVLA 0X10
MOVAM CNT
BIT_OUT:
MOVLA 0X03
BTSC LCODE,0
MOVLA 0X09
MOVAM CNT2
RR MCODE,M
RR LCODE,M
LCALL DELAY9
DECSZ CNT2,M
LGOTO $-2
CLRWDT
MOVLA 0X40
XOR RB,M
DECSZ CNT,M
LGOTO BIT_OUT
LCALL DELAY1
RETLA 0X00
;=======================================================
;程序開始
;=======================================================
BOOT:
MOVLA 0X80
MOVAM FREG_1 ;上電時,將上電標志置"1"
CLR CNT_32MS
CLR CNT_4S
CLR CNT_1M
CLR LREG
CLR RA
MOVLA 0X00 ;RA0上電檢測/RA1白燈/RA2藍燈/RA3棕燈
IODIR RA
CLR RB
MOVLA 0XF4 ;RB6讀碼輸入/R7信號輸入/R2電源檢測
IODIR RB
; MOVLA 0X04 B2 掉電檢測下拉
; MOVAM PB_PDM
; MOVLA 0X70 ;RB6 讀碼上拉
; MOVAM PB_PUP
MOVLA 0X74 ;RB6 讀碼上拉
MOVAM PB_PUP
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
BTSS RB,READ
LGOTO SEND_CODE_PRO
BOOT_CONTR:
CLR RB
MOVLA 0XF4 ;RB6讀碼輸入/R7信號輸入/R2電源檢測
IODIR RB
CLR FREG_2
MOVLA 0X02 ;三路
BTSS RB,K2 ;三路遙控或四路遙控選擇
MOVLA 0X00 ;四路
MOVAM FREG_2
MOVLA 0X01 ;L1閃爍
BTSS RB,K1 ;延時,L1燈是否閃爍
MOVLA 0X00 ;L1不閃爍
IOR FREG_2,A
MOVAM FREG_2
MOVLA .250
MOVAM TMR0
MOVLA 0XC6 ;1:128分頻
SELECT
MOVLA 81H
MOVAM IRQM
BS RA,WHITE_BULB
INC LREG,M ;手動開關的4個狀態
BS FREG_1,OUT1_FLAG
;=======================================================
MAIN:
LGOTO TST_KEYDELAY
TST_KEYDELAY_END:
LCALL RECEIVE_2262
BTSS STATUS,C
LGOTO M_COMPARE
BTSS RB,POWER_CUT ;如上電狀態斷電狀態則,
LGOTO POWER_CUT_PRO ;進入斷電狀態子程序
LGOTO MAIN
;=======================================================
;HS2262, 接收,用兩個位標識2262中的一個位,因有"F"碼存在
;=======================================================
RECEIVE_2262:
BTSS RB,SIGNAL_IN
LGOTO RECEIVE_2262_ERROR_END
CLR CODE_TOTAL
CLR HBIT
RECEIVE_2262_HIGH:
INC HBIT,M
MOVLA MAXDATA
SUB HBIT,A
BTSC STATUS,C
LGOTO RECEIVE_2262_ERROR_END
BTSC RB,SIGNAL_IN
LGOTO RECEIVE_2262_HIGH
CLR LBIT
RECEIVE_2262_JUDGE:
INC CODE_TOTAL,M
MOVLA .25
SUB CODE_TOTAL,A
BTSC STATUS,Z
LGOTO RECEIVE_2262_END
RECEIVE_2262_LOW:
INC LBIT,M
MOVLA MAXDATA
SUB LBIT,A
BTSC STATUS,C
LGOTO RECEIVE_2262_ERROR_END
BTSS RB,SIGNAL_IN
LGOTO RECEIVE_2262_LOW
MOV LBIT,A
SUB HBIT,A
RR HCODE,M
RR MCODE,M
RR LCODE,M
CLR HBIT
LGOTO RECEIVE_2262_HIGH
RECEIVE_2262_ERROR_END:
BS STATUS,C ;通過STATUS.C位置,來判斷是否有遙控,或解碼是否真確
RETLA 0X00 ;"1",表示不正確
RECEIVE_2262_END:
BC STATUS,C ;STATUS.C=0,解碼成功
RETLA 0X00
;=======================================================
;接收到的2262碼型進行比較
;=======================================================
M_COMPARE:
MOV HCODE,A
MOVAM KEYREG
LCALL LOW_ADDRESS
XOR LCODE,A
BTSS STATUS,Z
LGOTO MAIN
LCALL HIGH_ADDRESS
XOR MCODE,A
BTSS STATUS,Z
LGOTO MAIN
REMOTE_KEY_JUDGE:
CLR MODEREG
; CLR R_BUZ
BTSC FREG_1,REMOTE_FLAG
LGOTO MAIN
BS FREG_1,REMOTE_FLAG
; BS FREG_1,DELAY200MS_FLAG
MOVLA 0XC0 ;按鍵"A",鍵值"1",兩位標識即="0XC0"
XOR KEYREG,A
BTSC STATUS,Z
LGOTO KEY1_PRO
MOVLA 0X03 ;按鍵"B",鍵值"8",兩位標識即="0X03"
XOR KEYREG,A
BTSC STATUS,Z
LGOTO KEY2_PRO
MOVLA 0X0C ;按鍵"C",鍵值"4",兩位標識即="0X0C"
XOR KEYREG,A
BTSC STATUS,Z
LGOTO KEY3_PRO
MOVLA 0XCC ;按鍵"D",鍵值"5",兩位標識即="0XCC"
XOR KEYREG,A
BTSC STATUS,Z
LGOTO KEY4_PRO
MOVLA 0X30 ;按鍵"ON/OFF",鍵值"2",兩位標識即="0X30"
XOR KEYREG,A
BTSC STATUS,Z
LGOTO KEY5_ON0FF_PRO
MOVLA 0X0F ;按鍵"延時"或者"按鍵(B+C)",鍵值"5",兩位標識即="0X0F"
XOR KEYREG,A
BTSC STATUS,Z
LGOTO KEY6_DELAY_PRO
LGOTO MAIN
;=======================================================
;遙控按鍵, 遙控功能處理
;=======================================================
KEY1_PRO:
; LCALL BUZZ_200MS
; BS FREG_1,DELAY200MS_FLAG
BC FREG_1,DELAY_FLAG ;清除按鍵延時標志
BC FREG_2,R_AGAINST
BTSS FREG_1,OUT1_FLAG
LGOTO WHITE_BULB_ON
BC RA,WHITE_BULB
BC FREG_1,OUT1_FLAG
LGOTO MAIN
WHITE_BULB_ON:
BS RA,WHITE_BULB
BS FREG_1,OUT1_FLAG
LGOTO MAIN
;----------------------------------
KEY2_PRO:
; LCALL BUZZ_200MS
; BS FREG_1,DELAY200MS_FLAG
BC FREG_1,DELAY_FLAG ;清除按鍵延時標志
BC FREG_2,R_AGAINST
BTSS FREG_1,OUT2_FLAG
LGOTO BLUE_BULB_ON
BC RA,BLUE_BULB
BC FREG_1,OUT2_FLAG
LGOTO MAIN
BLUE_BULB_ON:
BS RA,BLUE_BULB
BS FREG_1,OUT2_FLAG
LGOTO MAIN
;----------------------------------
KEY3_PRO:
; LCALL BUZZ_200MS
; BS FREG_1,DELAY200MS_FLAG
BC FREG_1,DELAY_FLAG ;清除按鍵延時標志
BC FREG_2,R_AGAINST
BTSS FREG_1,OUT3_FLAG
LGOTO BROWN_BULB_ON
BC RA,BROWN_BULB
BC FREG_1,OUT3_FLAG
LGOTO MAIN
BROWN_BULB_ON:
BS RA,BROWN_BULB
BS FREG_1,OUT3_FLAG
LGOTO MAIN
;----------------------------------
KEY4_PRO:
; LCALL BUZZ_200MS
BC FREG_1,DELAY_FLAG ;清除按鍵延時標志
BTSC FREG_2,R_K2 ;"三路"或"四路"電路判斷
LGOTO AGAINST_THEFT_PR0 ;進入"三路電路"防盜鍵程序
BC FREG_2,R_AGAINST
BTSS FREG_1,OUT4_FLAG
LGOTO YELLOW_BULB_ON
BC RB,YELLOW_BULB
BC FREG_1,OUT4_FLAG
; BS FREG_1,DELAY200MS_FLAG
LGOTO MAIN
YELLOW_BULB_ON:
BS RB,YELLOW_BULB
BS FREG_1,OUT4_FLAG
; BS FREG_1,DELAY200MS_FLAG
LGOTO MAIN
AGAINST_THEFT_PR0:
BTSC FREG_2,R_AGAINST
LGOTO AGAINST_THEFT_OFF
LCALL WHITE_BULB_FLISH
LCALL WHITE_BULB_FLISH
LCALL WHITE_BULB_FLISH
MOVLA 0X02 ;按鍵取反讓其閃爍停止
XOR RA,M
MOVLA 0X07 ;FREG_1,OUT1_FLAG/2/3/4
AND FREG_1,A ;判斷是否有負載輸出
BTSS STATUS,Z
BS FREG_1,DELAY_FLAG ;表有負載輸出,延時1分鐘后關閉
BS FREG_2,R_AGAINST
LGOTO AGAINST_THEFT_PR0_END
AGAINST_THEFT_OFF:
LCALL WHITE_BULB_FLISH
MOVLA 0X02 ;按鍵取反讓其閃爍停止
XOR RA,M
BC FREG_2,R_AGAINST
LGOTO AGAINST_THEFT_PR0_END
AGAINST_THEFT_PR0_END:
; LCALL RESTART_TIME
CLR MODEREG
; CLR R_BUZ
; BS FREG_1,DELAY200MS_FLAG
LGOTO MAIN
;----------------------------------
KEY5_ON0FF_PRO:
; LCALL BUZZ_200MS
; BS FREG_1,DELAY200MS_FLAG
BC FREG_1,DELAY_FLAG ;清除按鍵延時標志
BC FREG_2,R_AGAINST
MOVLA 0X0F ;FREG_1,OUT1_FLAG/2/3/4
AND FREG_1,A
BTSS STATUS,Z
LGOTO WHOLE_BULB_OFF ;只要有一盞燈亮,則跳,全熄滅
MOVLA 0X0E ;點亮白/藍/棕三盞燈,關閉負載
MOVAM RA
MOVLA 0X00
BTSS FREG_2,R_K2
MOVLA 0X01 ;點亮黃燈
MOVAM RB
MOVLA 0X0F
IOR FREG_1,M ;打開四盞燈的點亮標志
LGOTO MAIN
WHOLE_BULB_OFF:
MOVLA 0X01
MOVAM RA ;熄滅白/藍/棕三盞燈
CLR RB ;熄滅黃燈
MOVLA 0XF0
AND FREG_1,M ;清除四盞燈的點亮標志
LGOTO MAIN
;----------------------------------
KEY6_DELAY_PRO:
; LCALL BUZZ_200MS
BC FREG_2,R_AGAINST
; BS FREG_1,DELAY200MS_FLAG
BS FREG_1,DELAY_FLAG ;按鍵延時標志
BTSS FREG_2,R_K1 ;檢測延時L1燈,是否閃爍
LGOTO STATE_BEGIN ;FREG_2.R_K1=0不閃爍
LCALL WHITE_BULB_FLISH
MOVLA 0X02 ;按鍵取反讓其閃爍停止
XOR RA,M
CLR MODEREG
LGOTO MAIN
;=======================================================
;讀碼子程序
;=======================================================
SEND_CODE_PRO:
MOVLA 0XC4 ;0010,0011,READ腳設置輸入
IODIR RB
LGOTO $+1
BTSC RB,READ ;檢測低電平,高電平跳出
LGOTO $-1
BTSS RB,READ ;檢測高電平,低電平跳出
LGOTO $-1
MOVLA 0X84 ;0010,0001,READ腳設置輸輸出
IODIR RB
BC RB,READ ;輸出電平信號,給讀碼器件
MOVLA 0X21 ;低電平延時33(21H)*3指令周期
MOVAM CNT
DECSZ CNT,M
LGOTO $-1
MOVLA 0XC4 ;1000,1100,READ腳設置輸入
IODIR RB
MOVLA 0X14 ;20(14H)*5個指令周期是否接收
MOVAM CNT ;到讀碼器發送出的高電平
BTSS RB,READ
LGOTO READ_CODE_SEND
DECSZ CNT,M
LGOTO $-3
LGOTO SEND_CODE_PRO ;20*5指令周期未能收到高電平,返回重讀
READ_CODE_SEND:
BTSS RB,READ ;檢測低電平,高電平逃過
LGOTO $-1 ;其高電平為2262,A0
BTSC RB,READ ;檢測高電平,低電平跳過
LGOTO $-1 ;其低電平為2262,A0
LCALL RX
BTSC STATUS,C
LGOTO SEND_CODE_PRO
BTSS RB,READ ;檢測高電平,低電平跳出
LGOTO $-1
MOVLA 0X00
MOVAM RB
MOVLA 0X84
IODIR RB
MOVLA 0XA3
XOR LCODE,C
BTSS STATUS,Z
LGOTO SEND_CODE_PRO
LCALL DELAY1
LCALL LOW_ADDRESS
MOVAM LCODE
LCALL HIGH_ADDRESS
MOVAM MCODE
LCALL TX
LGOTO BOOT_CONTR
;=======================================================
END
;======================================================= |