MOV R7,#26;忽略前 26 位系统识别码
JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用 882 微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将 P3.2 引脚此时的电平状态 0 或 1 存入 C 中
JNC UUUA;如果为 0 就跳转到 UUUA
LCALL YS3;检测到高电平 1 的话延时 1 毫秒等待脉冲高电平结束
UUUA: DJNZ R7,JJJJA
MOV R1,#1AH ;设定 1AH 为起始 RAM 区
MOV R2,#2;接收从 1AH 到 1BH 的 2 个内存,用于存放操作码和操作反码
PP: MOV R3,#8;每组数据为 8 位
JJJJ: JNB P3.2,$;等待地址码第一位的高电平信号
LCALL YS1;高电平开始后用 882 微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2;将 P3.2 引脚此时的电平状态 0 或 1 存入 C 中
JNC UUU;如果为 0 就跳转到 UUU
LCALL YS3;检测到高电平 1 的话延时 1 毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将 R1 中地址的给 A
RRC A;将 C 中的值 0 或 1 移入 A 中的最低位
MOV @R1,A;将 A 中的数暂时存放在 R1 数值的内存中
DJNZ R3,JJJJ;接收满 8 位换一个内存
INC R1;对 R1 中的值加 1,换下一个 RAM
DJNZ R2,PP ;接收完 8 位数据码和 8 位数据反码,存放在 1AH/1BH 中
MOV A,1AH
CPL A;对 1AH 取反后和 1BH 比较
CJNE A,1BH,EXIT;如果不等表示接收数据发生错误,放弃
MOV P1,1AH;将按键的键值通过 P1 口的 8 个 LED 显示出来!
CLR P2.5;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL YS2
LCALL YS2
LCALL YS2
SETB P2.5;蜂鸣器停止
EXIT: SETB EA ;允许中断
RETI ;退出解码子程序
YS1: MOV R4,#20 ;延时子程序 1,精确延时 882 微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1