专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

合泰单片机接收红外遥控器程序(NEC码)

作者:huqin   来源:本站原创   点击数:  更新时间:2014年02月12日   【字体:

;;内容:按下PA3接的按键进中断LED数码管加1
;数码管段码接法A-PD0,B-PD1....G-PD6,H-PD7
;数码管位码接法OM0-PC0...COM4-PC3
;红外头接-PA.3
;完整源代码下载:http://www.51hei.com/f/hthw.rar
include HT66F50.inc
ORG 0000H
JMP A1
ORG 04H ;外部中断0入口地址
JMP ZD01 ; 
ORG 0014H ;多功能中断入口地址
JMP ZD1
ORG 30H ;
Q1:
DC 03FH ; 0
DC 006H ; 1
DC 05BH ; 2
DC 04FH ; 3
DC 066H ; 4
DC 06DH ; 5
DC 07DH ; 6
DC 007H ; 7
DC 07FH ; 8
DC 06FH ; 9
DC 077H ; A
DC 07CH ; B
DC 039H ; C
DC 05EH ; D
DC 079H ; E
DC 071H ; F 
A1: 

MOV A,3FH ;显示内容
MOV [8AH],A ;第一位数码管段码显示内容寄存器
MOV A,3FH ;显示内容
MOV [8BH],A ;第二位数码管段码显示内容寄存器
MOV A,3FH ;显示内容
MOV [8CH],A ;第三位数码管段码显示内容寄存器
MOV A,3FH ;显示内容
MOV [8DH],A ;第四位数码管显示内容寄存器 
MOV A,08H ;跟CP1C寄存器设置要求选择数据
MOV CP1C,A ;设置PC口为I/0口而不是中断口
CLR PCC ;设置pc 口为输出口
CLR PDC ;设置PD 口为输出口
MOV A,1 ;设置初始显示位码显示第一位
MOV [80H],A ;位码寄存器
MOV A,8AH ;设置对应第一位段码寄存器
MOV MP0,A ;间接寄存器指针
MOV A,00000000B ;
MOV PRM1,A ;设置外部中断0的管脚为PA.3
MOV A,00000010B ;
MOV INTEG,A ;设置外部中断0为下降沿触发
CLR ACERL ;设置PA口不为AD输入口
SET PAPU.3 ;设置PA.3上拉
SET PAC.3 ;设置PA.3为输入口
MOV A,08H ; 
MOV CP0C,A ;设置PA3不为比较器输入口
CLR PDC ;设置PD口为输出口
MOV A,01H ;设置PD口初始状态
MOV PD,A ;PD口显示初始状态
MOV A,00000000B ;设置TM2 计数时钟位为fSYS/4
MOV TM2C0,A
MOV A,11000001B ;设置TM2中断为定时/计数模式选择比较器A匹配
MOV TM2C1,A
MOV A,LOW  5000 ;设置中断时间为5000个时钟周期
MOV TM2AL,A ;低8位
MOV A,HIGH 5000 ;设置中断时间为5000个时钟周期
MOV TM2AH,A ;高8位
CLR MF0F ;清多功能中断0标志
CLR T2AF ;清定时器2较器A中断标志
SET MF0E ;使能多功能0中断
SET T2AE ;使能定时器2较器A中断
CLR INT0F ;清中断0标志
SET INT0E ;使能外部0中断
SET EMI ;使能总中断
SET T2ON ;开始计数
JMP $
;*************************************************
; 外部中断0服务子程序
;************************************************* 

ZD01: ;进入中断自动关闭总中断
SET EMI ;打开总中断允许嵌套
CLR INT0E ;关闭外部中断0避免为完成操作2次中断
MOV [0F2H],A ;压栈ACC到0F2H
MOV A,STATUS ;
MOV [0F3H],A ;压栈status标志寄存器到0F3H
MOV A,18 ;设置起始码时间(0.5*18=9MS)
MOV [0A0H],A
A2: CALL M001 ;调用0.5MS延时
SZ PA.3 ;9MS时间内判断PA3是否为高电平
JMP ZD02 ;是高电平不是起始码则跳出中断
SDZ [0A0H] ;判断是否到9MS
JMP A2 ;不到则返回继续等待
MOV A,9 ;设置结果码时间4.5MS(0.5*9=4.5MS)
MOV [0A0H],A ;
SNZ PA.3 ;判断是否为高电平(起始码是否结束, 
JMP $-1 ;起始码必须结束,结果码才能开始)
A3: CALL M001 ;调用0.5MS延时
SNZ PA.3 ;4.5MS时间内判断PA3是否为低电平
JMP ZD02 ;是低电平则不是结果码跳出中断
SDZ [0A0H] ;判断是否到4.5ms
JMP A3 ;不到这继续等待
SZ PA.3 ;到了则是结果码则等待判断结果码是否结束
JMP $-1 ;结果码必须结束后才能继续下一步判断
MOV A,8 ;设置接收的数为8bit
MOV [0A1H],A ;
MOV A,4 ;设置接收个数
MOV [0A2H],A ;
MOV A,3 ;设置分辨0或1的时间1.5MS以上为1
MOV [0A0H],A ;
MOV A,0A4H ;设置收到的数存到0A4H(地址码)0A5H(地址反码)
MOV MP1,A ;0A6H(数据码)0A7H(数据反码)
A4:
SNZ PA.3 ;判断0.565MS低电平是否结束
JMP A4 ;必须在0.565MS低电平结束后才能判断所收的数是1还是0
A5:
CALL M001 ;延时0.5MS
SNZ PA.3 ;1.5MS内判断PA3是否为0
JMP A6 ;是0则说明时间小于1.5MS为0
SDZ [0A0H] ;判断是否到1.5MS
JMP A5 ;1 ;否则继续等待
SET C ;置位标志C
RLC IAR1 ;通过带进位左移指令把当前数保存起来
JMP A7 ;
A6: 
CLR C ;清标志C
RLC IAR1 ;通过带进位左移指令把当前数保存起来
A7:

MOV A,3 ;到了1.5MS还是高电平说明为1
MOV [0A0H],A ;重新设置分辨0或1的时间1.5MS以上为1
SZ PA.3 ;判断是否结束回到0.565MS低电平状态
JMP $-1 ;必须要回到0.565MS才能接收下一个数
SDZ [0A1H] ;判断是否收够了8位数
JMP A4 ;否则继续
MOV A,8 ;重新设置位数
MOV [0A1H],A ;
INC MP1 ;间接寄存器加1
SDZ [0A2H] ;判断是否收够4个NEC码
JMP A4 ;
MOV A,[0A4H] ;地址码
MOV [8AH],A ;第一位数码管段码显示内容寄存器
MOV A,[0A5H] ;地址反码
MOV [8BH],A ;第二位数码管段码显示内容寄存器
MOV A,[0A6H] ;数据码
MOV [8CH],A ;第三位数码管段码显示内容寄存器
MOV A,[0A7H] ;数据反码
MOV [8DH],A ;第四位数码管显示内容寄存器 
ZD02: 
MOV A,[0F3H] ;弹栈后进先出先进后出 
MOV STATUS,A ;弹栈0F1H的数到标志寄存器
MOV A,[0F2H] ;弹栈0F0H的数到acc
CLR INT0F ;清中断标志
SET INT0E ;使能外部中断
RETI ;中断返回
;*******************************************************
; 中断服务子程序
;******************************************************* 
ZD1: 
MOV [0F0H],A ;压栈ACC到0F0H
MOV A,STATUS ;
MOV [0F1H],A ;压栈status标志寄存器到0F1H
CLR PC ;清PC(清屏幕)
MOV A,Q1 ;数据表地址
CLR TBHP ;清数据表地址高位否则出错
ADD A,IAR0 ;利用间接寄存器找到要显示段码所在数据表的地址 
MOV TBLP,A ;表格指针寄存器TBLP
; TABRD PD ;查表并将数据存到PD口寄存器
MOV A,IAR0 ;
MOV PD,A ;显示收到的数到LED上
MOV A,[80H] ;位码寄存器
MOV PC,A ;将位码寄存器的数存到PC口寄存器
;段码和位码的数都有了所以数码管被点亮
INC MP0 ;间接寄存器指针加1指向下一个段码寄存器
RL [80H] ;左移位码寄存器控制下一个数码管
SNZ [80H].5 ;判断是否控制完4个数码管
JMP ZD2 ;退出中断继续
MOV A,1 ;是则从新初始化寄存器数据
MOV [80H],A ; 
MOV A,8AH ;千位数码管对应寄存器
MOV MP0,A ;存到间接寄存器0
ZD2: 
MOV A,[0F1H] ;弹栈后进先出先进后出 
MOV STATUS,A ;弹栈0F1H的数到标志寄存器
MOV A,[0F0H] ;弹栈0F0H的数到acc
CLR MF0F ;清多功能标志
CLR T2AF ;清定时器2比较器A标志
RETI ;中断返回 
;**************************************
; 延时子程序
;************************************** 
M001: 
MOV A,1
MOV [85H],A
M002: 
MOV A,3
MOV [86H],A
M003: 
MOV A,105 
MOV [87H],A
M004: 
SDZ [87H]
JMP M004
SDZ [86H]
JMP M003
SDZ [85H]
JMP M002 
    RET 
END
 

关闭窗口

相关文章