;=================================================
IR_IN:
CLR EA ;暂时关闭CPU的所有中断请求
PUSH ACC
PUSH PSW
SETB PSW.3 ;选择工作寄存器组1
CLR PSW.4
MOV R0,#IRCOM
MOV R1,#04H
I1: JNB IRIN,I2 ;等待 IR 信号出现
LCALL CONV
DJNZ R1,I1
JMP IR_OUT
I2: MOV R4,#20
I20: CALL DEL
DJNZ R4,I20
JB IRIN,I1 ;确认IR信号出现
I21: JB IRIN,I3 ;等 IR 变为高电平
CALL DEL
JMP I21
I3: MOV R3,#0 ;8位数清为0
LL: JNB IRIN,I4 ;等 IR 变为低电平
CALL DEL
JMP LL
I4: JB IRIN,I5 ;等 IR 变为高电平
CALL DEL
JMP I4
I5: MOV R2,#0 ;0.14ms 计数
L1: CALL DEL
JB IRIN, N1 ;等 IR 变为高电平
;IR=0,检查R2中的计数值
MOV A,#8
CLR C
SUBB A,R2 ;判断高低位
;IF C=0 BIT=0
MOV A,@R0
RRC A
MOV @R0,A ;处理完一位
INC R3
CJNE R3,#8,LL ;需处理完8位
MOV R3,#0
INC R0
CJNE R0,#24H,LL ;收集到4字节了
JMP IR_SHOW
N1: INC R2
CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开
IR_OUT: POP PSW
POP ACC
SETB EA
RETI
;------------------------------------------------------------------
IR_SHOW:
MOV A,22H
CPL A ;将22H取反后和23H比较
CJNE A,23H,IR_SHOW1 ;如果不等表示接收数据发生错误,放弃。
CALL CONV
CALL BEEP_BL ;蜂鸣器鸣响表示解码成功
IR_SHOW1:
JMP IR_OUT
;===============================================
;编码转换为 ASCII 码并显示
;===============================================
CONV:
MOV X,#5 ;设置显示起始位置
MOV A,22H
ANL A,#0F0H ;取出高四位二进制数
SWAP A ;高四位与低四位互换
PUSH ACC ;压入堆栈
CLR C ;C=0
SUBB A,#0AH ;减10
POP ACC ;弹出堆栈
JC ASCII0 ;该数小于10,转ASCII0
ADD A,#07H ;大于10的数加上37H
ASCII0: ADD A,#30H ;小于10的数加上30H
MOV B,X
CALL LCDP3
上一页 [1] [2] [3] [4] [5] 下一页
本文关键字:解码器 51单片机,单片机-工控设备 - 51单片机