📄 wanneng_remote.c
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
随着家用电器种类的增多,
遥控器的种类也随之增多,
由于不同种类的遥控器不能相互代替,
这给人们的生活带来些不便.若能有一种万能遥控器,
它可同时控制不同类型的TV、 VCR、CBL、DVD、VCD、AMP、CD、TAPE、TUNER等,
并且价格与现在的专用遥控器价格相当,
这将方便人们的生活,
改善人们的生活素质.
1、
遥控键码发射方式分析
每种遥控发码都有自己的一套方式,以tv001为例,他的发码方式为:
7位数据码---------------延时--------------循环
遥控器先发数据码,再发延时,
若是只按键一次则发射结束,
若按着键不放,
则不断地发数据码和延时.这款遥控器只有一个数据码和延时,但有些型号有引导码、有的有用户码、有的有两个数据码、还有的两个数据码不相同等等,为了使程序结构的简单化,我们把所有这些码都看成是逻辑波,然后把他们一段段的发出去,最后根据循环位置来循环。
2、
遥控器发码的调制方式分析
五种调制方式:
一、时间调制格式,是红外发射波形中最常用的一种调制格式。
二、相位调制格式,通常以高电平在逻辑中的位置不同来表示逻辑0与逻辑1。
三、电平调制格式,分别以每一个低电平或高电平来表示逻辑0与逻辑1,而且高低电平宽度通常相同。
四、无载波调制格式,波形的组成通常由多个单个的电平脉冲组成,且电平脉冲宽度通常很小。
五、特殊调制格式,此调制格式的逻辑表示方法通常为非常规的,除了逻辑0与逻辑1外,通常另外定有为逻辑2,逻辑3……
根据这五种调制方式我们采取模块化程序处理,分别对每种调制方式编写子程序进行处理。
3、
遥控器数据存储结构分析
要能实现对8种设备1千多种型号的控制,
就必须在遥控器中保存有这些数据(保存在ROM中),
由于数据多,
为减少占用ROM空间,
就必须对其数据的存储结构进行优化.经过分析研究,
决定每一种型号采用不同的数据结构,
而每一遥控键码数据的初始地址存入一线性表中,
遥控器根据型号从线性表中读取键码数据初始地址,
初始地址的第一个字节为调制模式,
根据该调制模式调用相应的发射程序模块,
发射程序模块首先根据其数据结构读取时间参数和键的代码,
根据时间参数发射键的代码.
一般如果要做成一个万能的摇控器你的前提条件就是要了解他们的调制方式,再就是买个万能的摇控器测出他们的发码方式(这个要花大量时间,也是必须要做的)
由于时间有限,现把已测试成功的万能摇控器源代码贴出来,大家一起研究,有兴趣的加qq:454280486 用的at89s52芯片,p0为八种设备的灯,p1为键盘的行输入,p3为键盘的列输出,为8*8距陈. p2.2为红外发射脚,接三极管放大电路再加红外发射头。
;-------------------------------------- 内存单元分配 -------------------------;;
;前面的00到07作为特殊寄存器用 r0到r7
;键盘扫描用
HANNIE EQU 08H
HAN EQU 09H
NIE EQU 0AH
XNIE EQU 0BH
KEY_VALUE1 EQU 0CH
KEY_VALUE2 EQU 0DH
;暂存八种设备的型号
TV_X EQU 0EH
VCR_X EQU 0FH
CBL_X EQU 10H
DVD_X EQU 11H
TUNER_X EQU 12H
TAPE_X EQU 13H
CD_X EQU 14H
AMP_X EQU 15H
;输入型号的百,十,个位
XINHAO1 EQU 16H
XINHAO2 EQU 17H
XINHAO3 EQU 18H
;
TIME1 EQU 70H
TIME2 EQU 71H
TIME3 EQU 72H
;程序用临时变量
BIT_TEMP EQU 19H
TYPE_TEMP EQU 1AH
DATA_TEMP1 EQU 1BH
DATA_TEMP2 EQU 1CH
DATA_TEMP3 EQU 1DH
DATA_TEMP4 EQU 1EH
LED EQU 1FH
;型号数据
IR_FORMAT EQU 21H
CYCLE EQU 22H
BHT EQU 23H
BLT EQU 24H
LH EQU 25H
LL EQU 26H
LH2 EQU 27H
LL2 EQU 28H
L01 EQU 29H
L02 EQU 2AH
L11 EQU 2BH
L12 EQU 2CH
L21 EQU 2DH
L22 EQU 2EH
L31 EQU 2FH
L32 EQU 30H
D_H EQU 31H
D_L EQU 32H
D_L2 EQU 33H
;位数据
BIT1 EQU 34H
BIT2 EQU 35H
BIT3 EQU 36H
BIT4 EQU 37H
BIT5 EQU 38H
BIT6 EQU 39H
BIT7 EQU 3AH
BIT8 EQU 3BH
BIT9 EQU 3CH
BIT0 EQU 3DH
;类型数据
TYPE1 EQU 3EH
TYPE2 EQU 3FH
TYPE3 EQU 40H
TYPE4 EQU 41H
TYPE5 EQU 42H
TYPE6 EQU 43H
TYPE7 EQU 44H
TYPE8 EQU 45H
TYPE9 EQU 46H
TYPE0 EQU 47H
;值数据
VALUE11 EQU 6FH
VALUE12 EQU 48H
VALUE13 EQU 49H
VALUE14 EQU 4AH
VALUE21 EQU 4BH
VALUE22 EQU 4CH
VALUE23 EQU 4DH
VALUE24 EQU 4EH
VALUE31 EQU 4FH
VALUE32 EQU 50H
VALUE33 EQU 51H
VALUE34 EQU 52H
VALUE41 EQU 53H
VALUE42 EQU 54H
VALUE43 EQU 55H
VALUE44 EQU 56H
VALUE51 EQU 57H
VALUE52 EQU 58H
VALUE53 EQU 59H
VALUE54 EQU 5AH
VALUE61 EQU 5BH
VALUE62 EQU 5CH
VALUE63 EQU 5DH
VALUE64 EQU 5EH
VALUE71 EQU 5FH
VALUE72 EQU 60H
VALUE73 EQU 61H
VALUE74 EQU 62H
VALUE81 EQU 63H
VALUE82 EQU 64H
VALUE83 EQU 65H
VALUE84 EQU 66H
VALUE91 EQU 67H
VALUE92 EQU 68H
VALUE93 EQU 69H
VALUE94 EQU 6AH
VALUE01 EQU 6BH
VALUE02 EQU 6CH
VALUE03 EQU 6DH
VALUE04 EQU 6EH
;发波调制 为"1" TIME(时间调制) 为"2" Phasic(相位调制)
;为"3" Voltage(电平调制) 为"4" Nothing(无载波调制)
;为"5" Especial(特殊调制)
;------------------------- 初始化 ------------------------------------------------
ORG 0000H
LJMP START
START:
MOV SP,#81H
CLR P2.2
CLR p0.0 ;一上电tv灯亮自动进入tv_001
LCALL DELAY1S
mov p0,#0ffh
CLR 01H ;键有没有松开标志位
CLR 02H
CLR 03H
CLR 04H
CLR 05H
MOV TV_X,#1 ;八个设备的分别装的型号
MOV VCR_X,#1
MOV CBL_X,#1
MOV DVD_X,#1
MOV TUNER_X,#1
MOV TAPE_X,#1
MOV CD_X,#1
MOV AMP_X,#1
MOV LED,#0 ;当前设备 0 "tv" 1="vcr" 2="sat" 3="dvd" 4="tuner" 5="tape" 6="cd" 7="amp"
;---------------------------- 程序 -----------------------------------------
LOOP:
LCALL SCANKEY
MOV A,KEY_VALUE1
JZ LOOP
CJNE A,#56,SWITCH_KEY
MOV A,KEY_VALUE2
JZ LOOP
LJMP TWO_KEY_PRESS
SWITCH_KEY:
LJMP DEVICE_SELECT
;---------------------- 两个键同时按下的判断 -----------------------
; 56键为 SET 键 57键为 TV键, 58键为 vcr 键, SET+TV选择tv型号 SET+vcr选择vcr型号
TWO_KEY_PRESS:
MOV A,KEY_VALUE2
CJNE A,#57,VCR_TYPEINPUT1
MOV LED,#0
LJMP TYPEINPUT
VCR_TYPEINPUT1:
CJNE A,#58,CBL_TYPEINPUT1
MOV LED,#1
LJMP TYPEINPUT
CBL_TYPEINPUT1:
CJNE A,#59,DVD_TYPEINPUT1
MOV LED,#2
LJMP TYPEINPUT
DVD_TYPEINPUT1:
CJNE A,#60,TUNER_TYPEINPUT1
MOV LED,#3
LJMP TYPEINPUT
TUNER_TYPEINPUT1:
CJNE A,#61,TAPE_TYPEINPUT1
MOV LED,#4
LJMP TYPEINPUT
TAPE_TYPEINPUT1:
CJNE A,#62,CD_TYPEINPUT1
MOV LED,#5
LJMP TYPEINPUT
CD_TYPEINPUT1:
CJNE A,#63,AMP_TYPEINPUT1
MOV LED,#6
LJMP TYPEINPUT
AMP_TYPEINPUT1:
CJNE A,#64,TYPEINPUTOUT
MOV LED,#7
LJMP TYPEINPUT
TYPEINPUTOUT:
LJMP LOOP
;------------------------------------------------------
;----------------- 型号输入,输入三位 ---------------------------
TYPEINPUT: ;型号输入接收
mov R2,#3
MOV XINHAO1,#0
mov r0,#XINHAO1
LCALL KEY_POP ;键弹起
TYPEINPUT1:
LCALL CPL_LED
AAA: MOV TIME3,#7
BBB: MOV TIME2,#250
CCC: MOV TIME1,#250
TYPEINPUT2:
LCALL SCANKEY
MOV A,KEY_VALUE1
CJNE A,#0,KEYPRESS
djnz TIME1,TYPEINPUT2
DJNZ TIME2,CCC
DJNZ TIME3,BBB
LCALL CPL_LED
LJMP loop
KEYPRESS:
SUBB A,#11
JC KEYPRESS1
MOV A,KEY_VALUE1
SUBB A,#57
JNC XINHAO_PD
LJMP TYPEINPUT2
XINHAO_PD:
LCALL CPL_LED
LCALL KEY_POP ;键弹起
LJMP LOOP
KEYPRESS1:
LCALL CPL_LED
LCALL KEY_POP ;键弹起
MOV A,KEY_VALUE1
CJNE A,#10,KEYPRESS2
MOV A,#0
KEYPRESS2:
MOV @R0,A
INC R0
DJNZ R2,TYPEINPUT1
;计算值
MOV A,XINHAO1 ;如果三次输完毕,则计算值
MOV B,#100
MUL AB
MOV XINHAO1,A
MOV A,XINHAO2
MOV B,#10
MUL AB
ADD A,XINHAO1
ADD A,XINHAO3
MOV XINHAO1,A
;根据值判断类型
MOV A,LED
JNZ VCR_TYPE
MOV A,XINHAO1
JZ TV_SELECT_TYPE_OUT
SUBB A,#15
JNC TV_SELECT_TYPE_OUT
MOV TV_X,XINHAO1
LJMP LOOP
TV_SELECT_TYPE_OUT:
LJMP TYPE_OUT
VCR_TYPE:
CJNE A,#1,CBL_TYPE
MOV A,XINHAO1
JZ VCR_SELECT_TYPE_OUT
SUBB A,#4
JNC VCR_SELECT_TYPE_OUT
MOV VCR_X,XINHAO1
LJMP LOOP
VCR_SELECT_TYPE_OUT:
LJMP TYPE_OUT
CBL_TYPE:
CJNE A,#2,DVD_TYPE
MOV A,XINHAO1
JZ CBL_SELECT_TYPE_OUT
SUBB A,#2
JNC CBL_SELECT_TYPE_OUT
MOV CBL_X,XINHAO1
LJMP LOOP
CBL_SELECT_TYPE_OUT:
LJMP TYPE_OUT
DVD_TYPE:
CJNE A,#3,TUNER_TYPE
MOV A,XINHAO1
JZ DVD_SELECT_TYPE_OUT
SUBB A,#2
JNC DVD_SELECT_TYPE_OUT
MOV DVD_X,XINHAO1
LJMP LOOP
DVD_SELECT_TYPE_OUT:
LJMP TYPE_OUT
TUNER_TYPE:
CJNE A,#4,TAPE_TYPE
MOV A,XINHAO1
JZ TUNER_SELECT_TYPE_OUT
SUBB A,#2
JNC TUNER_SELECT_TYPE_OUT
MOV TUNER_X,XINHAO1
LJMP LOOP
TUNER_SELECT_TYPE_OUT:
LJMP TYPE_OUT
TAPE_TYPE:
CJNE A,#5,CD_TYPE
MOV A,XINHAO1
JZ TAPE_SELECT_TYPE_OUT
SUBB A,#2
JNC TAPE_SELECT_TYPE_OUT
MOV TAPE_X,XINHAO1
LJMP LOOP
TAPE_SELECT_TYPE_OUT:
LJMP TYPE_OUT
CD_TYPE:
CJNE A,#6,AMP_TYPE
MOV A,XINHAO1
JZ CD_SELECT_TYPE_OUT
SUBB A,#2
JNC CD_SELECT_TYPE_OUT
MOV CD_X,XINHAO1
LJMP LOOP
CD_SELECT_TYPE_OUT:
LJMP TYPE_OUT
AMP_TYPE:
CJNE A,#7,TYPE_OUT
MOV A,XINHAO1
JZ TYPE_OUT
SUBB A,#2
JNC TYPE_OUT
MOV AMP_X,XINHAO1
LJMP LOOP
TYPE_OUT:
LCALL CPL_LED
LCALL DELAY600MS
LCALL CPL_LED
LCALL DELAY600MS
LCALL CPL_LED
LCALL DELAY600MS
LCALL CPL_LED
LCALL DELAY600MS
LJMP TYPEINPUT
;---------------------------------------
;---------------------- 设备强制选择 -----------------
; 任何时候按 57 到 64这几个键都会转到强制转换(如果转换到的设备有选择型号则转到
;选择型号,如果没有则还是当前的型号)
DEVICE_SELECT:
MOV A,KEY_VALUE1
CJNE A,#57,SWITCH_2
MOV LED,#0
LJMP DEVICE_OUT
SWITCH_2:
CJNE A,#58,SWITCH_3
MOV LED,#1
LJMP DEVICE_OUT
SWITCH_3:
CJNE A,#59,SWITCH_4
MOV LED,#2
LJMP DEVICE_OUT
SWITCH_4:
CJNE A,#60,SWITCH_5
MOV LED,#3
LJMP DEVICE_OUT
SWITCH_5:
CJNE A,#61,SWITCH_6
MOV LED,#4
LJMP DEVICE_OUT
SWITCH_6:
CJNE A,#62,SWITCH_7
MOV LED,#5
LJMP DEVICE_OUT
SWITCH_7:
CJNE A,#63,SWITCH_8
MOV LED,#6
LJMP DEVICE_OUT
SWITCH_8:
CJNE A,#64,SWITCH_9
MOV LED,#7
LJMP DEVICE_OUT
SWITCH_9:
LJMP CURRENT_TYPE
DEVICE_OUT:
LCALL CPL_LED
LCALL DELAY600MS
LCALL CPL_LED
LCALL KEY_POP ;键弹起
LJMP LOOP
;--------------------------------------------------------------
;------------------------------- 判断类型 -------------------
CURRENT_TYPE:
;屏蔽 37 致 55键(未用的按键)
MOV A,KEY_VALUE1
SUBB A,#36
JC DEVICE_TYPE
LJMP LOOP
DEVICE_TYPE:
MOV A,LED
CJNE A,#0,VCR_PANDUAN_TYPE
TV_PANDUAN_TYPE: ; tv型号判断
MOV A,TV_X
CJNE A,#1,TV_TYPE2
LJMP TV_001
TV_TYPE2:
CJNE A,#2,TV_TYPE3
LJMP TV_002
TV_TYPE3:
CJNE A,#3,TV_TYPE4
LJMP TV_003
TV_TYPE4:
CJNE A,#4,TV_TYPE5
LJMP TV_004
TV_TYPE5:
CJNE A,#5,TV_TYPE6
LJMP TV_005
TV_TYPE6:
CJNE A,#6,TV_TYPE7
LJMP TV_006
TV_TYPE7:
CJNE A,#7,TV_TYPE8
LJMP TV_007
TV_TYPE8: ;电平调制
CJNE A,#8,TV_TYPE9
LJMP TV_008
TV_TYPE9:
CJNE A,#9,TV_TYPE10
LJMP TV_009
TV_TYPE10:
CJNE A,#10,TV_TYPE11
LJMP TV_010
TV_TYPE11:
CJNE A,#11,TV_TYPE12
LJMP TV_011
TV_TYPE12:
CJNE A,#12,TV_TYPE20
LJMP TV_012
TV_TYPE20: ;无载波调制
CJNE A,#13,TV_TYPE39
LJMP TV_020
TV_TYPE39: ;电平调制
CJNE A,#14,TV_TYPE40
LJMP TV_039
TV_TYPE40:
LJMP LOOP
VCR_PANDUAN_TYPE:
CJNE A,#1,CBL_PANDUAN_TYPE
MOV A,VCR_X
CJNE A,#1,VCR_TYPE2
LJMP VCR_001
VCR_TYPE2:
CJNE A,#2,VCR_TYPE3
LJMP VCR_002
VCR_TYPE3:
CJNE A,#3,VCR_TYPE4
LJMP VCR_003
VCR_TYPE4:
LJMP LOOP
;--------------------
CBL_PANDUAN_TYPE:
CJNE A,#2,DVD_PANDUAN_TYPE
MOV A,CBL_X
CJNE A,#1,CBL_TYPE2
LJMP CBL_001
CBL_TYPE2:
LJMP LOOP
;----------------------
DVD_PANDUAN_TYPE:
CJNE A,#3,TUNER_PANDUAN_TYPE
MOV A,DVD_X
CJNE A,#1,DVD_TYPE2
LJMP DVD_001
DVD_TYPE2:
LJMP LOOP
;-------------------------------------
TUNER_PANDUAN_TYPE:
CJNE A,#4,TAPE_PANDUAN_TYPE
MOV A,TUNER_X
CJNE A,#1,TUNER_TYPE2
LJMP TUNER_001
TUNER_TYPE2:
LJMP LOOP
;------------------------------
TAPE_PANDUAN_TYPE:
CJNE A,#5,CD_PANDUAN_TYPE
MOV A,TAPE_X
CJNE A,#1,TAPE_TYPE2
LJMP TAPE_001
TAPE_TYPE2:
LJMP LOOP
;-----------------------------
CD_PANDUAN_TYPE:
CJNE A,#6,AMP_PANDUAN_TYPE
MOV A,CD_X
CJNE A,#1,CD_TYPE2
LJMP CD_001
CD_TYPE2:
LJMP LOOP
;------------------------------------
AMP_PANDUAN_TYPE:
CJNE A,#7,AMP_TYPE2
MOV A,AMP_X
CJNE A,#1,AMP_TYPE2
LJMP AMP_001
AMP_TYPE2:
LJMP LOOP
;--------------------- 各种类型 -------------------------------------------------------
TV_001:
; PAUSE(20) MENU(21) OK(26) EXIT(27) 四个键不发码
MOV A,KEY_VALUE1
CJNE A,#20,TV_001_MASKMENU
LJMP LOOP
TV_001_MASKMENU:
CJNE A,#21,TV_001_MASKOK
LJMP LOOP
TV_001_MASKOK:
CJNE A,#26,TV_001_MASKEXIT
LJMP LOOP
TV_001_MASKEXIT:
CJNE A,#27,FAMA_TV_001
LJMP LOOP
FAMA_TV_001:
MOV DPTR,#TV_001_LIST_LIB
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -