;引导码正确时执行以下代码
; CLR YKBZ ;遥控标志清0
JM21:
MOV R2,#16 ;每次循环读8位码
MOV R6,#0 ;存放16位码中的低8位
MOV R7,#0 ;存放16位码中的高8位
JM3:
JNB P3.6,$ ;等待低电平结束,不管其宽度,因为是通过高电平的宽度来区分0(约为0.5ms)和1(约为1.6ms)
MOV TH1,#0
MOV TL1,#0
SETB TR1 ;启动T1,统计高电平的宽度
JB P3.6,$
CLR TR1
MOV A,TH1
CJNE A,#2,JM4 ;若高电平宽度值大于2,则说明此高电平为宽脉冲(1),否则为窄脉冲(0)
JM4: CPL C ;当TH1的值大于2时,C=0,小于2时,C=1
MOV A,R7
RRC A
MOV R7,A
MOV A,R6
RRC A
MOV R6,A
DJNZ R2,JM3 ;连读16位,先读的为低位,后读的为高位,高8位(数据码)存于R7中,低8位(地址码)存于R6中
MOV A,R6
CJNE A,#47H,JMCW ;判断地址码是否为47H,不是转出错返回
MOV A,R7 ;若地址码正确,则R7中便为数据码
mov r1,#jzh
mov @r1,A
LJMP JMFH
JMCW: MOV A,B
JMFH: CLR TF1 ;T1的溢出标志清0
MOV TH1,#0 ;为T1设定初值并启动它
MOV TL1,#0 ;以此来避免对同一按键读两次(避开遥控器的重发代码)
SETB TR2
POP B
POP 07H
POP 06H
POP 02H
POP PSW
RET ;此时,若引导码、地址码、键值码和键值反码中有一个有问题,A中便为错误代码,否则,A中便为所按键之键值码
文章写完了。希望能对大家有少许的帮助。