;******************************* 遥控信号接收子程序集 ****************************
;占用: ACC, R0, R1, R2, R3, TIME0中断
;遥控发送以4个字节为一组, 长按按键时, 4个--4个字节连发, 每组(4字节为一组)之间只有3.5ms的间隙
;第1与2字节为用户码, 固定不变(用于区别其它的遥控器)
;第3字节为键码, 第4字节为键码的取反码(用于校验)
;注:键码不等同于需要的键值
;************* 外部变量说明 ********************************
BC_REMOTE BIT P3.3 ;***** 遥控信号读入脚 *****
EXTRN DATA(RKEY_NUM) ;现键值寄存
EXTRN BIT(B_RKEY) ;有remote key时置1, 注:主程序检测该位后清0
EXTRN DATA(RKEY_SPEED) ;连发灵敏度计数, 开机时初始化
EXTRN DATA(RKEY_KEEP) ;连发的监控计时数
;遥控完整读入的4个字节存放数组 uchar rmbyte_in[4]
EXTRN DATA(RMBYTE_IN) ;第1字节 -- 用户码1存放 ,RMBYTE_IN
;第2字节 -- 用户码2存放 ,RMBYTE_IN+01H
;第3字节 -- 键码存放 ,RMBYTE_IN+02H
;第4字节 -- 键码的反码存放 ,RMBYTE_IN+03H
;************ 公共变量定义 ****************
PUBLIC GET_REMOTE
;************** 常数定义 ******************
USER_CODE1 EQU 20H ;remote user_code low 8bit(用户码1)
USER_CODE2 EQU 0DFH ;remote user_code high 8bit(用户码2)
CANT_FIND EQU 0AEH ;remote key not find(无键标识)
N_RKEY_KEEP EQU 02H ;允许连发的停顿时间 0.2ms
;=============================== 公共子程序 (可被C调用) ===============================
;*************** 遥控信号检测, 键值读入 ***************
;******************************************************
;注!!!: 只当主程序中检测到BC_REMOTE脚有低电平时才调用该字程序, 然后再进入键功能程序.
;返回: RKEY_NUM(键值)代表的功能参考-- 表RKEY_TABLE, 值=#CANT_FIND (#0AEH)即为无按键
; B_RKEY 有remote key时置1, 注:主程序检测该位后清0
;子程序调用分辨率要在1ms之内
GET_REMOTE:
SETB BC_REMOTE
NOP
NOP
NOP
JNB BC_REMOTE, GET_REMOTE_P0
RET
GET_REMOTE_P0:
MOV TH0,#000H
MOV TL0,#000H
MOV A,TMOD
ANL A,#0F0H
SETB ACC.0
MOV TMOD,A ;timer/counter0 16bit timer/counter
MOV A, #0FFH
LBL_P25:
JNB BC_REMOTE,LBL_P256 ;get remote key
DJNZ ACC, LBL_P25
RET
LBL_P256:
SETB TR0
LBL_P28:
MOV A,TH0
CJNE A,#014H,LBL_P26 ;10ms
LBL_P26:
JNC LBL_P27 ;if >10ms,regard this is a nosie
JNB BC_REMOTE,LBL_P28 ;get remote key
CJNE A,#005H,LBL_P29 ;2.5ms
LBL_P29:
JC LBL_P27 ;if <2.5ms,regard this is a nosie
MOV TH0,#000H
MOV TL0,#000H
LBL_P31:
MOV A,TH0
CJNE A,#00AH,LBL_P30
LBL_P30:
JNC LBL_P27 ;if >5ms,regard this is a nosie
JB BC_REMOTE,LBL_P31 ;get remote key
CJNE A,#007H,LBL_P32
LBL_P32:
JC LBL_P33 ;if<3.5ms, 当是连发时
SJMP LBL_P34 ;above is the start flag, 当是起始信号时
LBL_P27:
RET
LBL_P34: ;****** 是新按下的******
CLR A ;>3.5ms and <5ms
MOV R2,#004H ;4 BYTE
MOV R0,#RMBYTE_IN ;用户码存放地址1
LBL_P41:
MOV R1,#008H ;8bit
LBL_P40:
MOV TH0,#000H
MOV TL0,#000H
LBL_P36:
MOV R3,TH0
CJNE R3,#002H,LBL_P35
LBL_P35:
JNC LBL_P27 ;>1ms
JNB BC_REMOTE,LBL_P36 ;get remote key
MOV TH0,#000H
MOV TL0,#000H
LBL_P38:
MOV R3,TH0
CJNE R3,#004H,LBL_P37
LBL_P37:
JNC LBL_P27 ;>2ms
JB BC_REMOTE,LBL_P38 ;get remote key
CJNE R3,#002H,LBL_P39 ;>1ms is bit 0,<1ms is bit 1
LBL_P39:
CPL C
RRC A ;the data is low bit first
DJNZ R1,LBL_P40
MOV @R0,A
INC R0
DJNZ R2,LBL_P41 ;32 bit
MOV A,RMBYTE_IN
CJNE A,#USER_CODE1,LBL_P42
MOV A,RMBYTE_IN+01H
CJNE A,#USER_CODE2,LBL_P42
MOV A,RMBYTE_IN+02H
ADD A,RMBYTE_IN+03H
CJNE A,#0FFH,LBL_P42 ;后两字节是互补编码,若不是即是出错
; MOV R0,#48D ;******键值表为0-38 ******
; MOV DPTR,#RKEY_TABLE
; MOV RKEY_SPEED, #00H ;remote 连发速度, 先设置为最慢
;LBL_P46:
; MOV A,R0
; MOVC A,@A+DPTR
; CJNE A,RMBYTE_IN+02H,LBL_P43 ;get the low code byte from the table
; MOV RKEY_NUM,R0 ;save the offset
MOV RKEY_NUM,RMBYTE_IN+02H
LJMP LBL_P44 ;get it
;LBL_P43:
; MOV A,R0
; JZ LBL_P45
; DEC R0
; SJMP LBL_P46
;LBL_P45:
; MOV RKEY_NUM,#CANT_FIND ;can't find the code
LBL_P42:
RET
LBL_P33: ;<3.5ms CONTINUES ****** 连发的 *******
MOV RKEY_KEEP, #N_RKEY_KEEP ;允许连发的停顿时间 0.2ms
DJNZ RKEY_SPEED, LBL_P50 ;remote 灵敏度
LBL_P51:
MOV A,RKEY_NUM
CJNE A,#CANT_FIND,LBL_P48
LBL_P50:
RET
LBL_P44:
MOV A,RKEY_NUM
CJNE A,#CANT_FIND,LBL_P48
RET ;can't find the code
LBL_P48:
LBL_P49:
MOV RKEY_KEEP, #N_RKEY_KEEP ;允许连发的停顿时间 0.2s
SETB B_RKEY ;有按键
RET
;================================= 文件内部子程序 ================================
; 键码 功能名称 键值
;RKEY_TABLE: ;本表是SRS遥控器各遥控键值
; DB 19H ;MUTE 0
; DB 15H ;INPUT 1
; DB 0bH ;CH-MODE 2
; DB 1dH ;MIC1.VOL- 3
; DB 0fH ;MIC1.VOL+ 4
; DB 1eH ;NIGHT 5
; DB 09H ;MIC2.VOL- 6
; DB 0dH ;MIC2.VOL+ 7
; DB 11H ;ECHO+ 8
; DB 12H ;MIC.TRE- 9
; DB 16H ;MIC.TRE+ 10
; DB 0aH ;ECHO- 11
; DB 08H ;MIC.BASS- 12
; DB 1fH ;MIC.BASS+ 13
; DB 1bH ;DELAY 14
; DB 17H ;CEN.VOL+ 15
; DB 13H ;SL.VOL+ 16
; DB 01H ;SR.VOL+ 17
; DB 10H ;CEN.VOL- 18
; DB 04H ;SL.VOL- 19
; DB 18H ;SR.VOL- 20
; DB 00H ;TRE- 21
; DB 0CH ;TRE+ 22
; DB 02H ;DSP 23
; DB 14H ;BASS+ 24
; DB 03H ;VOL+ 25
; DB 1AH ;BAL R 26
; DB 06H ;BASS- 27
; DB 07H ;MVOL - 28
; DB 0EH ;BAL L 29
-
-
xilinxue 发表于 2008/9/17 13:18:23
org 00h2楼 回复本楼
AJMP START
START:
JB P3.2,$ ;等待遥控信号出现
SB:
MOV R4,#8 ;8毫秒为高电平错误
SBA:
MOV R5,#250
SBB:
JB P3.2,SXB1
DJNZ R5,SBB
DJNZ R4,SBA
MOV R4,#2
JMP SBC
SXB1:
MOV R5,#5
SXB2: ;去掉20US的尖峰干扰信号
JNB P3.2,SBB
DJNZ R5,SXB2
JMP START
SBC:
MOV R5,#250
SB1:
JB P3.2,SB2 ;2MS内不为高电平错误(监测9MS的低电平引导码)
DJNZ R5,SB1
DJNZ R4,SBC
JMP START
SB2: ;去掉20US的尖峰干扰信号
MOV R5,#5
SB2_A:
JNB P3.2,SB1
DJNZ R5,SB2_A
MOV R4,#3
SB2_1:
MOV R5,#250
SB3: ;监测4.5MS高电平,如3MS内出现低电平错误
JNB P3.2,SXC
DJNZ R5,SB3
DJNZ R4,SB2_1
MOV R4,#2
JMP SB3_1
SXC: ;去掉20US的尖峰干扰信号
MOV R5,#5
SXC1:
JB P3.2,SB3
DJNZ R5,SXC1
JMP START
SB3_1: ;监测4.5MS高电平,如5MS内不为低电平错误
MOV R5,#250
SB3_2:
JNB P3.2,SB4
DJNZ R5,SB3_2
DJNZ R4,SB3_1
JMP START
SB4: ;去掉20US的尖峰干扰信号
MOV R5,#5
SB4_1:
JB P3.2,SB3_2
DJNZ R5,SB4_1
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#4
PP: MOV R3,#8
JJJJ:
MOV R5,#250
JJJJ2: ;1MS内不为低电平错误
JB P3.2,JJJJ3
DJNZ R5,JJJJ2
JMP START
JJJJ3:
LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
MOV R5,#250
JJJJ4:
JNB P3.2,UUU
NOP
DJNZ R5,JJJJ4
JMP START
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 ;接收完16位地址码和8位数据码和8位数据反码,存放在1AH/1BH/1CH/1DH的RAM中
;以下对代码是否正确和定义进行识别
MOV A,1CH ;比较数据码和数据反码是否正确?
CPL A
XRL A,1DH ;将1CH的值取反后和1DH比较 不同则无效丢弃,核对数据是否准确
JNZ EXIT ;如果不相等说明解码失败退出解码程序
EXIT: AJMP START
YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2 ;延时程序3,精确延时1000微秒
D3: MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
END
引用 xilinxue 2008/9/17 13:18:23 发表于2楼的内容