📄 decode.c
字号:
void decode()
{
#pragma asm
MAIN:
JNB P3.4,IR ;遥控扫描
LJMP MAIN ;主循环
IR: ;解码开始
MOV R6,#10
IR_SB:
ACALL DELAY882;延时882微秒
JB P3.4,IR_ERROR;数据错误退出解码
DJNZ R6,IR_SB;重复10次检测
;识别连发码
JNB P3.4,$;等待高电平避开9MS低电平引导脉冲
ACALL DELAY2400
JNB P3.4,IR_RP;这里为低电平,认为是连发码
ACALL DELAY2400 ;延时4.74MS避开4.5MS的结果码
;读取32位数据码
MOV R1,#1AH;存放数据的起始地址
MOV R2,#4
IR_4BYTE:
MOV R3,#8
IR_8BIT:
JNB P3.4,$;等待地址码第一位的高电平信号
LCALL DELAY882;高电平来后开始延时882uS
MOV C,P3.4
JNC IR_8BIT_0;延时后为为低电平则跳到IR_8BIT_0
LCALL DELAY1000
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;接收完成8位数据,8位数据码和16位地址码
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 1EH,1CH;口
MOV 1AH,#00H ;接收区清0
MOV 1BH,#00H
MOV 1CH,#00H
MOV 1DH,#00H
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
#pragma endasm
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -