📄 rem.asm
字号:
REMTOE: CLR EX0
PUSH ACC
PUSH PSW
SETB RS0
CLR RS1
MOV C,P3.2
NOP
NOP
JNC CONREM
JNC CONREM
NOP
NOP
BUFF: AJMP EXT_1
;-----------------------------------------------------------------------------------------------
;对遥控信号的9000微秒的初始低电平信号的识别。
CONREM: MOV R4,#10
SB: NOP
NOP
ACALL D882 ;定时882微秒,即数65536-64654=882
REM2: MOV C,P3.2
NOP
NOP
JC BUFF ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
NOP
NOP
DJNZ R4,SB ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;-----------------------------------------------------------------------------------------------
;对遥控信号的4500微秒的高电平信号的识别
NOP
NOP
MOV R4,#20
JNB P3.2,$ ;等待4.5毫秒高电平引导脉冲
RT6: MOV R7,#100 ;延时201微秒
DJNZ R7,$
NOP
NOP
REM3: MOV C,P3.2
JNC EXT_1
DJNZ R4,RT6
NOP
NOP
JB P3.2,$
NOP
NOP
;-----------------------------------------------------------------------------------------------
;以下是解码部分,解32位码
REM4: MOV R0,#1AH ;设定1AH为起始RAM区
MOV R4,#4
PP: MOV R7,#8
JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号
NOP
NOP
ACALL D882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
REM6: MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
NOP
NOP
JNC UUU ;如果为0就跳转到UUU
NOP
NOP
JB P3.2,$ ;如果为1就等待高电平信号结束
UUU: NOP
NOP
MOV A,@R0 ;将R0中地址的给A
RRC A ;将C中的值0或1移入A中的最低位
NOP
NOP
MOV @R0,A ;将A中的数暂时存放在R0中
NOP
NOP
DJNZ R7,JJJJ ;接收地址码的高8位
INC R0 ;对R0中的值加1,换成下一个RAM
NOP
NOP
DJNZ R4,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
;-----------------------------------------------------------------------------------------------
;代码识别
MOV A,1AH
XRL A,#20H ;20H为地址低8位的值于不同的遥控器有不同的地址值
NOP
NOP
JNZ EXT_1
MOV A,1BH
XRL A,#0DFH ;0DF为地址高8位的值
NOP
NOP
JNZ EXT_1
MOV A,1CH
CPL A
XRL A,1DH ;如果地址码不对或接收到的数据码两单元不反向均当错码本程序当无键按下处理
NOP
NOP
JNZ EXT_1
;-----------------------------------------------------------------------------------------------
;将遥控代码转换成标准键值 0,1,2,3....
MOV R4,#7 ;7为遥控器面板按键数
MOV DPTR,#REM_TAB
LOOKUP_1: MOV A,R4
NOP
NOP
MOVC A,@A+DPTR
NOP
NOP
XRL A,1CH
NOP
NOP
JZ REM_BAK0
DJNZ R4,LOOKUP_1
MOV TAB_KEY,#0FFH
SJMP EXT_1
REM_BAK0: DEC R4
MOV TAB_KEY,R4 ;R4中的值即为标准的键值
EXT_1: SETB P3.2
CLR RS0
SETB EX0
POP PSW
POP ACC
RETI
;-----------------------------------------------------------------------------------------------
;遥控器按键代码
REM_TAB: DB 00H, 17H, 55H, 11H, 02H, 01H, 12H, 04H
; 高音 低音 响度 音量+ 音量- 输入选择 静音
;====================================================================================
;定时882微秒子程序
D882: MOV R6,#20 ;延时子程序1,精确延时882微秒
DD1: MOV R5,#20
DJNZ R5,$
DJNZ R6,DD1
RET
;-----------------------------------------------------------------------------------------------
;定时4740微秒子程序
D4740: MOV R6,#10 ;延时子程序2,精确延时4740微秒
DD2: MOV R5,#235
DJNZ R5,$
DJNZ R6,DD2
RET
;-----------------------------------------------------------------------------------------------
;判断在118毫秒内是否有连发码
AA: MOV R0,#25
XX: ACALL D4740 ;精确定时4740微秒
REM8: JNB P3.2,HH ;跳转到判断连发代码是否正确的程序段
DJNZ R0,XX
EXT_3: CLR BIT_REM ;无连发码BIT_REM为0
EXT_2: NOP
NOP
RET
;-----------------------------------------------------------------------------------------------
;连发码判断程序
HH: MOV R7,#4
S: NOP
NOP
ACALL D882 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
REM10: NOP
NOP
JB P3.2,EXT_3 ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R7,S ;重复4次,目的是确认连发码的低电平信号波形
JNB P3.2,$ ;等待高电平
SETB BIT_REM ;有连发码BIT_REM为1
NOP
NOP
SJMP EXT_2
;====================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -