REM_SIGN EQU 5AH ;
REM_FIX EQU 5BH ;
REM_KEY EQU 5DH ;
REM_KEY1 EQU 5EH ;
REM_TIME EQU 5FH ;
TIME1 EQU 71H ;主循环执行时间
TIME2 EQU 72H ;显示缓冲区数据处理间隔时间
ORG 00H
JMP MAIN
ORG 0003H
JMP INT0
ORG 000BH
JMP TIME
MAIN:
MOV SP,#10H ;10H-24H共20个单元作为堆栈
MOV PSW,#10H
MOV TMOD,#01H
SETB IT0 ;外部中断0为边沿触发方式
SETB EA
SETB ET0
SETB EX0
MAIN1: AJMP MAIN1
TIME : PUSH ACC
PUSH PSW
MOV PSW, #00H
MOV A, REM_SIGN
CJNE A,#03H,EXIT1 ;不是连发的定时溢出标记清0
INC R1 ;执行一次遥控按键处理后,T0延事超过60ms,R1+1
INC R2 ;T0中断次数存储单元,当T0中断3次(每次60ms),本次遥控结束
MOV A,R2
SUBB A,#3 ;判断在250ms内有无连发码出现
JNC EXIT0 ;无则清0
MOV TH0,#15H ;定时值60MS
MOV TL0,#0A0H
SETB TR0
JMP EXIT2
EXIT0: CLR TR0
MOV R2,#00H
EXIT1: MOV REM_SIGN,#00H
EXIT2: POP PSW
POP ACC
RETI
NOP
NOP
INT0:
PUSH ACC
PUSH PSW
MOV PSW, #08H ;使用另一组寄存器
MOV R2,#00H
CLR TR0
CLR EX0
MOV R5,REM_SIGN
CJNE R5,#00H,INT_2 ;初始化原始数据
MOV R0,#REM_FIX ;遥控数据接收的首址
MOV R1,#0 ;
MOV R2,#0 ;R2是连发溢出标记,当T0延时60ms*3后仍未检测到有遥控中断,本次遥控结束
MOV R3,#8 ;每个字节的位数
MOV R6,#0 ;数据对比单元
MOV R7,#4 ;要接收的字节数
MOV REM_SIGN,#01H ;建立标记01
JMP INT_OFF
INT_2: CJNE R5,#01H,INT_3 ;起始码和结果码的判断
MOV A,#30H ;
MOV R6,TH0
SUBB A,R6
JNC ERR_OUT ;启动码+结果码<12.55ms退出(忽略TL0的值)
MOV A,#039H
SUBB A,R6
JC ERR_OUT ;启动码+结果码〉14.6ms推出(忽略TL0的值)
MOV REM_SIGN,#02H ;建立标记02
JMP INT_OFF
INT_3: CJNE R5,#02H,INT_4 ;(old key_out)
MOV A,#03H
MOV R6,TH0
SUBB A,R6 ;R6内存TH0的值
JNC ERR_OUT ;周期<1ms退出
MOV A,#0BH
SUBB A,R6
JC ERR_OUT ;周期>2.69ms退出
MOV A,#6H ;输入检测周期1.6ms用来判断1或0
SUBB A,R6 ;
MOV A,@R0 ;
RRC A ;存入一位数值
MOV @R0,A
DJNZ R3,INT_OFF
INT_3_1 :INC R0
MOV R3,#08H
DJNZ R7,INT_OFF
MOV A,REM_KEY1
CPL A
CJNE A,REM_KEY,ERR_OUT ;正反码比较,错则退
MOV REM_TIME,#8 ;
;----------------------------------------------------------
INT_4: ;
;----------------------------------------------------------
KY_OUT: MOV A,REM_SIGN
CJNE A,#3,ODD ;判断遥控是出于第一次按键触发还是处于连发阶段,连发阶段的标记是REM_SIG=3
MOV A,R1 ;连发最小时间判断,过滤掉<60ms的脉冲,因<60ms的脉冲不会令T0溢出
JZ NORUN
ODD : INC REM_TIME ;每连发一次连发记忆单元+1
NORUN: MOV A,REM_TIME ;因为跳过上一步IREM_TIME+1,所以不会执行BIJIAO(不够减)
SUBB A,#5 ;连发5次调用一次按键处理程序
JNC GO_0
JMP GO_1
GO_0: MOV REM_TIME,#00H ;每调用一次按键处理子程序连发记忆单元清0
JMP BIJIAO2
BI_RET: MOV R1,#00
MOV REM_SIGN,#03H ;执行一次按键处理后建立遥控标记#03
GO_1: SETB TR0
JMP INT_OFF1
ERR_OUT: MOV REM_SIGN,#00H ;报错标记清0
LJMP INT_OFF1 ;报错返回不启动定时器
INT_OFF: SETB TR0
INT_OFF1:MOV TH0,#00H
MOV TL0,#00H
SETB EX0
; MOV DPL,MTD5
; MOV DPH,MTD4
; MOV PSW,MTD3
; MOV A,MTD2
POP PSW
POP ACC
MOV R4,#0
MOV R5,#0 ;确定遥控结束后的参数复位时间
RETI
NOP
NOP
BIJIAO2: NOP
AJMP MAIN
END