学习型红外遥控器的设计.docx
《学习型红外遥控器的设计.docx》由会员分享,可在线阅读,更多相关《学习型红外遥控器的设计.docx(14页珍藏版)》请在冰豆网上搜索。
学习型红外遥控器的设计
相应的汇编代码:
使用的单片机是:
STC11F08XE
LastKey_8bitEQU40H
NowKey_8bitEQU41H
Elec_Level_8bitEQU42H
LevelDown_8bitEQU43H;-;
FLAG_T0BIT00H
KEY_F_VALUE1EQU21H;存放标志位的空间,用于查询标志位时处理只用
KEY_F_VALUE2EQU22H;存放标志位的空间,用于查询标志位时处理只用
KEY_L_Fbit01H;进入学习后,作为判断是否跳出学习的标志位
key_machineBIT02H
FLAG_LEARNING_Ybit03H
MACHINE_NOEQU3CH
JB_F_NOEQU44H;用于第一个8个数据是否检测完毕;初值设为8
JB_F_TOTALEQU45H;用于记录标志位查询的个数
ADDRH_FIRSTEQU46H;EEPROM的首地址高位
ADDRL_FIRSTEQU47H;EEPROM的首地址低位
F_L_1BIT04H
RESULT_FEQU48H;用于存放标志位处理后的结果
KEY_NUMBEREQU49H;进入学习后,学习的键号
F_LEARNINGBIT07H
F_KEY2BIT08H
F_KEY3BIT09H
F_KEY4BIT0AH
F_KEY5BIT0BH
F_KEY6BIT0CH
F_KEY7BIT0DH
F_KEY8BIT0EH
F_KEY9BIT0FH
F_KEYABIT10H
F_KEYBBIT11H
F_KEYCBIT12H
F_KEYDBIT13H
F_KEYEBIT14H
F_KEYFBIT15H
org0000H
AJMPMAIN
ORG000BH
AJMPTT0
ORG0030H
MAIN:
MOVTMOD,#01H
MOVTH0,#0D8H
MOVTL0,#0F0H
MOV20H,#0
MOV21H,#0
MOV22H,#0
MOVKEY_NUMBER,#0
MOVADDRH_FIRST,#0
MOVADDRL_FIRST,#0
MOVMACHINE_NO,#1
MOVLastKey_8bit,#0FFH
MOVElec_Level_8bit,#0FFH
MOVSP,#30H
SETBET0
SETBEA
SETBTR0
LCALLKEY_INTI
REGULATION:
LCALLGETNOWKEY
LCALLUPDATE_KEY_EST
LCALLKEY_DONE
;LCALLKEY_FUNCTION
LCALLDISP
WAIT_10MS:
JNBFLAG_T0,WAIT_10MS
CLRFLAG_T0
AJMPREGULATION
;================================================
TT0:
SETBFLAG_T0
MOVTH0,#0D8H
MOVTL0,#0F0H
RETI
;=========================当按键生效时讲对应按键的标志位置1
KEY_DONE:
MOVA,LevelDown_8bit
CJNEA,#00H,KEY_0
LJMPLOOP_OUT
KEY_0:
CJNEA,#11H,KEY_1
SETBKEY_MACHINE
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_1:
CJNEA,#21H,KEY_2
SETBF_L_1
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_2:
CJNEA,#41H,KEY_3
SETBF_KEY2
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_3:
CJNEA,#81H,KEY_4
SETBF_KEY3
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_4:
CJNEA,#12H,KEY_5
SETBF_KEY4
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_5:
CJNEA,#22H,KEY_6
SETBF_KEY5
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_6:
CJNEA,#42H,KEY_7
SETBF_KEY6
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_7:
CJNEA,#82H,KEY_8
SETBF_KEY7
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_8:
CJNEA,#14H,KEY_9
SETBF_KEY8
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_9:
CJNEA,#24H,KEY_A
SETBF_KEY9
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_A:
CJNEA,#44H,KEY_B
SETBF_KEYA
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_B:
CJNEA,#84H,KEY_C
SETBF_KEYB
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_C:
CJNEA,#18H,KEY_D
SETBF_KEYC
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_D:
CJNEA,#28H,KEY_E
SETBF_KEYD
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_E:
CJNEA,#48H,KEY_F
SETBF_KEYE
MOVLevelDown_8bit,#00H
LJMPLOOP_OUT
KEY_F:
CJNEA,#88H,LOOP_OUT
SETBF_KEYF
MOVLevelDown_8bit,#00H
LOOP_OUT:
RET
;----------------------根据具体硬件获取程序不同
;获取现在电平到NowKey_8bit
GETNOWKEY:
PUSHACC
MOVA,#0F0H
MOVP1,A
MOVA,P1
ANLA,#0F0H
MOVB,A
MOVA,#0FH
MOVP1,A
MOVA,P1
ANLA,#0FH
ORLA,B
MOVNowKey_8bit,A
POPACC
RET
;-----------------------------
KEY_INTI:
MOVLastKey_8bit,#00H
MOVNowKey_8bit,#00H
MOVLevelDown_8bit,#00H
RET
;-----------------------------
UPDATE_KEY_EST:
MOVA,NowKey_8bit;LastKey_8bit,NowKey_8bit同与
XRLA,LastKey_8bit
CPLA
MOVB,A;相同位存于B;就是同或
MOVA,NowKey_8bit;更新旧键值
MOVLastKey_8bit,A
MOVNowKey_8bit,A
MOVA,LastKey_8bit
XRLA,Elec_Level_8bit
ANLA,B;得到按键有效变化的按键位
MOVB,A;存储变化键位
ANLA,Elec_Level_8bit;取得变化键原值
CPLA
ANLA,B;取得变化键变化后值
;
;---------------下沿
MOVA,B;-;
ANLA,Elec_Level_8bit;-;
ORLA,LevelDown_8bit;-;
MOVLevelDown_8bit,A;-;
;-------------------------
MOVA,Elec_Level_8bit;变化键位与Elec_Level_8bit异或得到按键变化后所有按键当前有效状态
ANLA,B
MOVNowKey_8bit,A;NowKey_8bit作临时存储用
MOVA,Elec_Level_8bit
ORLA,B
CPLA
ORLA,NowKey_8bit;NowKey_8bit作临时存储用
CPLA
MOVElec_Level_8bit,A
RETURN_KEY_EST:
RET
;==========================对按键的功能进行分配
KEY_FUNCTION:
PUSHACC
PUSHPSW
MOVPSW,#10H
JNBKEY_MACHINE,TO_LEARNING
CLRKEY_MACHINE
MOVA,MACHINE_NO
CJNEA,#04H,LOOP_01
MOVMACHINE_NO,#01H
LJMPOUT_KEY_FUNCTION
LOOP_01:
INCMACHINE_NO
LJMPOUT_KEY_FUNCTION
TO_LEARNING:
JNBF_L_1,GOTO_EMOT_INF
CLRF_L_1
CPLKEY_L_F;这里作为检测此次按键是进入学习还是退出学习;=1是进入学习
jnbKEY_L_F,GOTO_EMOT_INF
LCALLLEARNING
LJMPOUT_KEY_FUNCTION
GOTO_EMOT_INF:
CLREX1;此时进入发射状态,关闭外中断1,由于外中断0必须在中断1产生后才能产生,
;而外中断0还用于唤醒单片机之用
LCALLEMOTE_INF
OUT_KEY_FUNCTION:
POPPSW
POPACC
RET
;==========================学习子程序
LEARNING:
MOV20H,#0
MOV21H,#0
MOV22H,#0
MOVLastKey_8bit,#0FFH
MOVElec_Level_8bit,#0FFH
LCALLKEY_INTI
LCALLGETNOWKEY
LCALLUPDATE_KEY_EST
LCALLKEY_DONE
LCALLDISP
JBkey_machine,KEY_MACHINE_NOUSE
JNBF_L_1,KEEP_LEARNING
CLRF_L_1
CPLKEY_L_F;这里作为检测此次按键是进入学习还是退出学习;=1是进入学习
JNBKEY_L_F,OUT_LEARNING
CPLKEY_L_F
JNBKEY_L_F,OUT_LEARNING
LJMPKEEP_LEARNING
KEY_MACHINE_NOUSE:
CLRkey_machine
WAIT_10MS_L:
JNBFLAG_T0,WAIT_10MS_L
CLRFLAG_T0
AJMPLEARNING
KEEP_LEARNING:
LCALLKEY_VALUE_DONE;对标志位的值进行处理,使其用于检查学习具体那一个按键
;类似于按键扫描
jnbFLAG_LEARNING_Y,WAIT_10MS_L;判断是否有学习按键按下,有的继续学习,
;没有则退出后继续判断那个需要学习的按键
clrFLAG_LEARNING_Y;在每次判断之后,需立即清除相应的标志位
LCALLADDR_GET
LCALLLEARN_BEGIN
LCALLRECIEVEING
LJMPWAIT_10MS_L
OUT_LEARNING:
CLRkey_machine
RET
;===========================单个数码管静态显示
DISP:
MOVA,MACHINE_NO
MOVDPTR,#T_AB
MOVCA,@A+DPTR
MOVP0,A
RET
T_AB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH
;========================红外发射子程序
EMOTE_INF:
RET
;=============学习初始化
LEARN_BEGIN:
RET
;=============接收解码
RECIEVEING:
AJMP$
RET
;=============地址获取
ADDR_GET:
MOVA,MACHINE_NO
DECA
MOVB,#2
MULAB
MOVDPTR,#T_GET_ADDR
MOVCA,@A+DPTR
MOVADDRH_FIRST,A
MOVADDRL_FIRST,#00H
MOVA,KEY_NUMBER
MOVKEY_NUMBER,#0
MOVB,#2
MULAB
ADDA,ADDRH_FIRST
MOVADDRH_FIRST,A
RET
T_GET_ADDR:
DB00H,00H,1CH,00H,38H,00H,54H,00H
;==============对标志位的值进行处理
KEY_VALUE_DONE:
MOVJB_F_NO,#9
MOVJB_F_TOTAL,#0
KEY_VALUE_DONE1:
DJNZJB_F_NO,NEXT_JB
MOVJB_F_NO,#1
LJMPNEXT_6BIT
NEXT_JB:
MOVA,JB_F_TOTAL
MOVDPTR,#TAB_DOING
MOVCA,@A+DPTR
ANLA,KEY_F_VALUE1
MOVRESULT_F,A
movA,RESULT_F
JZinc_total
SETBFLAG_LEARNING_Y
MOVRESULT_F,#0
MOVkey_number,JB_F_TOTAL
LJMPOUT_KEY_VALUE_DONE
inc_total:
INCJB_F_TOTAL
LJMPKEY_VALUE_DONE1
NEXT_6BIT:
MOVA,JB_F_TOTAL
CJNEA,#0EH,GOING_ON
;SETBFLAG_LEARNING_Y
LJMPOUT_KEY_VALUE_DONE
GOING_ON:
MOVA,JB_F_TOTAL
MOVDPTR,#TAB_DOING
MOVCA,@A+DPTR
ANLA,KEY_F_VALUE2
MOVRESULT_F,A
JZINC_TOTAL2
SETBFLAG_LEARNING_Y
MOVKEY_F_VALUE2,#0
MOVRESULT_F,#0
MOVKEY_NUMBER,JB_F_TOTAL
LJMPOUT_KEY_VALUE_DONE
INC_TOTAL2:
INCJB_F_TOTAL
LJMPKEY_VALUE_DONE1
OUT_KEY_VALUE_DONE:
RET
TAB_DOING:
DB01H,02H,04H,08H,10H,20H,40H,80H,01H,02H,04H,08H,10H,20H,40H,80H