;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
;======================================================= |