📄 hongwai.asm
字号:
;接收代码格式:
;1.位代码:0 低电平0.56ms 高电平0.56ms 周期为1.12ms
;1 低电平1.56ms 高电平1.68ms 周期为2.24ms
;2.单发代码格式:起始码(低电平 9ms) 结果码(高电平 4.5ms) 接下来是低8位地址码,高8位地址码
;8位数据码,8位数据反码
;3.连发代码格式:在发完32位地址数据码以后发送起始码(低电平 9ms) 结束码(高电平 2.5ms) 接下 ;来重复起始码,结果码
;引起连发代码的原因是一直按键不放
ORG 0000H
MAIN:
JNB P3.2,IR ;遥控扫描
LJMP MAIN ;主循环
IR: ;解码开始
MOV R6,#10
IR_SB:
;检验10次共8.8ms,即这8.8ms里P3.2都是低电平
ACALL DELAY882;延时882微秒
JB P3.2,IR_ERROR;数据错误退出解码
DJNZ R6,IR_SB;重复10次检测
;识别连发码
JNB P3.2,$;等待高电平,证明之前有9ms的低电平起始码
ACALL DELAY2400
JNB P3.2,IR_RP;这时为低电平,表明这是连发码(一直按着按键发送),即9ms低电平,2.5ms高电平,否则为结果码
ACALL DELAY2400 ;延时4.74MS避开4.5MS的结果码
;读取32位数据码
MOV R1,#1AH;存放数据的起始地址
MOV R2,#4
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P3.2,$;等待第一位的高电平信号
LCALL DELAY882;高电平来后开始延时0.88ms,大于0.56ms小于1.12ms
MOV C,P3.2;这时读P3.2电平值并送C
JNC IR_8BIT_0;这一位为低电平则直接存这一位数据并读下一位数据,否则延时1ms再存数据并读下一位数据
LCALL DELAY1000
;接收4个字节,32位数据并分别放入RAM中1AH,1BH,1CH,1DH中
IR_8BIT_0:
MOV A,@R1;将R1中的值给累加器A
RRC A;将C移入A的最低位
MOV @R1,A;保存A中的值到RAM中
DJNZ R3,IR_8BIT;跳转去接收下一位数据,直到接收完8位数据则接收下一字节
INC R1;下一地址
DJNZ R2,IR_4BYTE;接收下一字节数据,直到接收完4个字节数据
JMP IR_GOTO ;解码结束
IR_RP:
JMP IR_GOTO
IR_ERROR:
LJMP MAIN
IR_GOTO: ;执行部分
;接收的第一,二,三,四字节分别为地址的低八位,地址的高八位,一字节数据,一字节数据反码
MOV A,1CH ;将接收到的第三字节,即一字节数据
CPL A
CJNE A,1DH,IR_ERROR;将接收的一字节数据取反并与第四字节数据比较,不相等则说明接收出错
MOV P1,1CH ;接收到的数据显示到P1口,将对应遥控器按键的健码用流水灯显示出来
MOV 1AH,#00H ;接收区清0
MOV 1BH,#00H
MOV 1CH,#00H
MOV 1DH,#00H
LJMP MAIN;回到主循环
DELAY882: ;延时函数
MOV R7,#202
DELAY882_A:;882us延时
NOP
NOP
DJNZ R7,DELAY882_A
RET
DELAY1000:
MOV R7,#229
DELAY1000_A:
NOP
NOP
DJNZ R7,DELAY1000_A
RET
DELAY2400:
MOV R7,#245
DELAY2400_A:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R7,DELAY2400_A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -