📄 idt.asm
字号:
;******************************* 遥控信号接收子程序集 ****************************
;占用: ACC, R0, R1, R2, R3, TIME0中断
;遥控发送以4个字节为一组, 长按按键时, 4个--4个字节连发, 每组(4字节为一组)之间只有3.5ms的间隙
;第1与2字节为用户码, 固定不变(用于区别其它的遥控器)
;第3字节为键码, 第4字节为键码的取反码(用于校验)
;注:键码不等同于需要的键值
;************* 外部变量说明 ********************************
BC_REMOTE BIT P3.3 ;***** 遥控信号读入脚 *****
IBC_VOLA BIT P3.5 ;*** VOL+ 输入脚
IBC_VOLS BIT P2.0 ;*** VOL- 输入脚
EXTRN BIT(ICW2_FLG) ;正转到位标志位(*作为函数返回值), 开机时清0 !!!
EXTRN BIT(ICCW2_FLG) ;反转到位标志位(*作为函数返回值), 开机时清0 !!!
EXTRN BIT(ICW1_FLG) ;正转起始标志位, 开机时清0 !!!
EXTRN BIT(ICCW1_FLG) ;反转起始标志位, 开机时清0 !!!
EXTRN DATA(IROTE_DIRECT) ;=1 为正向,=2为反向, 方向暂存
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 IBC_VOLA
NOP
NOP
NOP
JNB IBC_VOLA, 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -