;
********************************************************************************
;
*描述:*
;
*遥控键值读取器 (HT6221)*
;
*数码管显示, P0口为数码管的数据口 ,p2为数码管的控制位 遥控器接p3.2*
;
*喇叭接p3.7继电器接p1.0每次按键喇叭提示*
;
*17(40h)键按下,继电器吸合。19(04h)键按下,继电器关闭。*
;
**
;
********************************************************************************
;
-----------------------------------------------
IRCOMEQU20H;
20H-23H IR使用
IRINEQUP3.2
BEEPEQUP3.7
RELAYEQUP1.0
;
------------------------------------------------
ORG 0000H
JMPMAIN
ORG 0003H;
外部中断INT0入口地址
JMPIR_IN
;
------------------------------------------------
MAIN:
MOVSP,#60H
MOVA,#00H
MOVR0,#20H
LOOP0:MOV@R0,A;
20H-27H清零
INCR0
CJNER0,#28H,LOOP0
MOVIE,#81H;
允许总中断中断,使能 INT0 外部中断
MOVTCON,#01H;
触发方式为脉冲负边沿触发
【遥控键值读取器】SETBIRIN
SETBBEEP
SETBRELAY
CALLIR_SHOW
LOOP1:
CALLIR_SHOW
MOVA,22H
CJNEA,#40H,LOOP2;
K17键按下
CLRRELAY;
继电器吸合
LOOP2:CJNEA,#04H,LOOP3;
K19键按下
SETBRELAY;
继电器关闭
LOOP3:JMPLOOP1
;
---------------------------------------------------
;
IR 译码子程序
;
---------------------------------------------------
IR_IN:
CLR EA;
暂时关闭CPU的所有中断请求
PUSHACC
PUSHPSW
SETBPSW.3;
选择工作寄存器组1
CLRPSW.4;
根据PSW.3为1,PSW.4为0,选择是工作寄存器1;
MOVR2,#04H
MOVR0,#IRCOM
I1:JNBIRIN,I2;
等待 IR 信号出现也就是9ms的低电平的起始码;
DJNZR2,I1;
检测4*0.14=0.56ms低电平;
JMPIR_OUT;
IR信号没出现,退出。
I2:MOVR4,#20;
检测20*0.14=2.8ms低电平;
I20:CALLDEL
DJNZR4,I20;
等待9ms的低电平的起始码,
JBIRIN,I1;
确认IR信号出现此处应该还是低电平在2.8ms+0.56ms阶段;
这个市再次确认,如果是高电平,就重新检测!
I21:JBIRIN,I3;
等 IR 变为高电平也就是4.5ms的高电平的结果码;
CALLDEL
JMPI21
I3:MOVR3,#0;
8位数清为0,等待一个低电平到高电平才开始计数,为防止数据采样不准确!
LL:JNBIRIN,I4;
等 IR 变为低电平
CALLDEL
JMPLL
I4:JBIRIN,I5;
等 IR 变为高电平,高电平开始通过R2检测计数
CALLDEL
JMPI4
I5:MOVR2,#0;
0.14ms 计数
L1:CALLDEL
JBIRIN, N1;
等 IR 变为高电平
;
IR=0,检查R2中的计数值
MOVA,#8
CLRC
SUBBA,R2;
判断高低位,0.14*8=1.12ms刚好是低电平的周期;
如果R2=8,那么C=0;
不需要进位;
如果等于16*0.14=2.24ms,则需要进位,C=1;
为高电平!高电平周期为2.24ms;
;
IF C=0BIT=0
MOVA,@R0
RRCA
MOV@R0,A;
处理完一位
INCR3
CJNER3,#8,LL;
需处理完8位
MOVR3,#0
INCR0
CJNER0,#24H,LL;
收集到4字节了
JMPIR_COMP
N1:INCR2
CJNER2,#30,L1;
高低电平共(8+16)*0.14ms 计数过长则时间到自动离开
IR_OUT:POPPSW
POPACC
SETBEA;
开中断!
RETI
;
---------------------------------------------------------------
;
键值比较与键值数据处理
;
22H存入用户编码,23H存入用户编码的反码
;
---------------------------------------------------------------
IR_COMP:
MOV A,22H
CPL A;
将22H取反后和23H比较
CJNE A,23H,IR_OUT;
如果不等表示接收数据发生错误,放弃
IR_CHULI:
MOVA,22H
ANLA,#0FH
MOV25H,A;
送个位显示单元
MOVA,22H
ANLA,#0F0H
SWAPA
MOV26H,A;
送十位显示单元
CALLIR_SHOW;
显示键值
CALLBEEP_BL;
蜂鸣器鸣响表示解码成功
JMPIR_OUT
;
=======================================================
;
键值显示
;
=======================================================
IR_SHOW:
MOVA,25H;
取显示数据到A
MOVDPTR,#TAB;
取段码表地址
MOVCA,@A+DPTR;
查显示数据对应段码
MOVP0,A;
段码放入P0口
CLRP2.7
SETBP2.6
LCALLDELAY1
MOVA,26H;
取显示数据到A
MOVDPTR,#TAB;
取段码表地址
MOVCA,@A+DPTR;
查显示数据对应段码
MOVP0,A;
段码放入P0口
CLRP2.6
SETBP2.7
LCALLDELAY1
RET
;
-----------------------------------------------------
TAB:
db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h,30h,25h,0a9h,26h,0a1h,0b1h;
数码管1-9,0,a,b,c,d,e,f代码表
;
-----------------------------------------------------
;
--------------------------------------------------------
;
蜂鸣器响一声子程序
;
--------------------------------------------------------
BEEP_BL:
MOVR6,#100
BL1:CALLDEX1
CPLBEEP
DJNZR6,BL1
MOVR5,#20
CALLDELAY
RET
DEX1:MOVR7,#180
DEX2:NOP
DJNZR7,DEX2
RET
DELAY:;
延时R5×10MS
MOVR6,#25
D1:MOVR7,#100
DJNZR7,$
DJNZR6,D1
DJNZR5,DELAY
RET
;
------------------------------------------------
;
DELAYR5*0.14MS
DEL:
MOVR5,#1;
IR解码使用
DEL0:MOVR6,#2
DEL1:MOVR7,#32
DEL2:DJNZR7,DEL2
DJNZR6,DEL1
DJNZR5,DEL0
RET
;
-------------------------------------------------
DELAY1:;
数码管延时4MS
MOVR6,#20
DL2:MOVR7,#100
DJNZR7,$
DJNZR6,DL2
RET
;
-------------------------------------------------
END;
结束