📄 xlirled.asm
字号:
;/********************************************************************************
;* 标题: xl系列单片机实验仪演示程序 遥控键值解码-LED显示 *
;* 文件: xlirled.asm *
;* 日期: 2006-1-5 *
;* 版本: 3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验 *
;* 邮箱: sxj1974@163.com *
;* 网站: http://www.51c51.com www.8951.com *
;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 ,p2为数码管的控制位 遥控器接p3.2 *
;* 喇叭接p3.7 继电器接p1.0 每次按键喇叭提示 *
;* 17(40h)键按下,继电器吸合。19(04h)键按下,继电器关闭。 *
;* *
;********************************************************************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! *
;* 【技术支持】请访问http://www.51c51.com/bbs/index.asp 官方论坛 *
;********************************************************************************/
;-----------------------------------------------
IRCOM EQU 20H ;20H-23H IR使用
IRIN EQU P3.2
BEEP EQU P3.7
RELAY EQU P1.0
;------------------------------------------------
ORG 0000H
JMP MAIN
ORG 0003H ;外部中断INT0入口地址
JMP IR_IN
;------------------------------------------------
MAIN:
MOV SP,#60H
MOV A,#00H
MOV R0,#20H
LOOP0: MOV @R0,A ;20H-27H清零
INC R0
CJNE R0,#28H,LOOP0
MOV IE,#81H ;允许总中断中断,使能 INT0 外部中断
MOV TCON,#01H ;触发方式为脉冲负边沿触发
SETB IRIN
SETB BEEP
SETB RELAY
CALL IR_SHOW
LOOP1:
CALL IR_SHOW
MOV A,22H
CJNE A,#40H,LOOP2 ;K17键按下
CLR RELAY ;继电器吸合
LOOP2: CJNE A,#04H,LOOP3 ;K19键按下
SETB RELAY ;继电器关闭
LOOP3: JMP LOOP1
;---------------------------------------------------
; IR 译码子程序
;---------------------------------------------------
IR_IN:
CLR EA ;暂时关闭CPU的所有中断请求
PUSH ACC
PUSH PSW
SETB PSW.3 ;选择工作寄存器组1
CLR PSW.4
MOV R2,#04H
MOV R0,#IRCOM
I1: JNB IRIN,I2 ;等待 IR 信号出现
DJNZ R2,I1
JMP IR_OUT ;IR信号没出现,退出。
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_COMP
N1: INC R2
CJNE R2,#30,L1 ;0.14ms 计数过长则时间到自动离开
IR_OUT: POP PSW
POP ACC
SETB EA
RETI
;---------------------------------------------------------------
;键值比较与键值数据处理
;22H存入用户编码,23H存入用户编码的反码
;---------------------------------------------------------------
IR_COMP:
MOV A,22H
CPL A ;将22H取反后和23H比较
CJNE A,23H,IR_OUT ;如果不等表示接收数据发生错误,放弃
IR_CHULI:
MOV A,22H
ANL A,#0FH
MOV 25H,A ;送个位显示单元
MOV A,22H
ANL A,#0F0H
SWAP A
MOV 26H,A ;送十位显示单元
CALL IR_SHOW ;显示键值
CALL BEEP_BL ;蜂鸣器鸣响表示解码成功
JMP IR_OUT
;=======================================================
;键值显示
;=======================================================
IR_SHOW:
MOV A,25H ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
CLR P2.7
SETB P2.6
LCALL DELAY1
MOV A,26H ;取显示数据到A
MOV DPTR,#TAB ;取段码表地址
MOVC A,@A+DPTR ;查显示数据对应段码
MOV P0,A ;段码放入P0口
CLR P2.6
SETB P2.7
LCALL DELAY1
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:
MOV R6,#100
BL1: CALL DEX1
CPL BEEP
DJNZ R6,BL1
MOV R5,#20
CALL DELAY
RET
DEX1: MOV R7,#180
DEX2: NOP
DJNZ R7,DEX2
RET
DELAY: ;延时R5×10MS
MOV R6,#25
D1: MOV R7,#100
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,DELAY
RET
;------------------------------------------------
; DELAY R5*0.14MS
DEL:
MOV R5,#1 ;IR解码使用
DEL0: MOV R6,#2
DEL1: MOV R7,#32
DEL2: DJNZ R7,DEL2
DJNZ R6,DEL1
DJNZ R5,DEL0
RET
;-------------------------------------------------
DELAY1: ;数码管延时4MS
MOV R6,#20
DL2: MOV R7,#100
DJNZ R7,$
DJNZ R6,DL2
RET
;-------------------------------------------------
END ;结束
;================================
;DT9122D 遥控器(学林电子)
;****** 红外遥控器键值表 ******
; 10 03 01 06
; 09 1D 1F 0D
; 19 1B 11 15
; 17 12 16 4C
; 40 48 04 00
; 02 05 54 4D
; 0A 1E 0E 1A
; 1C 14 0F 0C
;================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -