//使用12M晶振 适用于HS9148芯片
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit led=P1^1;
sbit in=P3^2;//红外接口标志
uchar const tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71,0x3f,0x40,0x80}; //1~f 0 - .
uint send_data=0; //接收数据的全局变量
/*************************************************************************/
//延时程序
void delay1(void)
{
TMOD |= 0x01; //定时器0,工作在模式1
TF0 = 0; //清溢出标志位,软清零
TH0 = 0xfc; //延时844us
TL0 = 0xb4;
TR0 = 1; //启动定时器0
while(TF0==0){;} //定时器无溢出,循环等待
TR0 = 0; //关闭定时器0
}
void delay2(void)
{
TMOD |= 0x10; //定时器1,工作在模式1
TF1 = 0; //清溢出标志位,软清零
TH1 = 0xfe; //延时500us
TL1 = 0x0c;
TR1 = 1; //启动定时器1
while(TF1==0){;} //定时器无溢出,循环等待
TR1 = 0; //关闭定时器1
}
/*************************************************************/
void jieshou() interrupt 0 using 0//外部中断0服务函数
{
uchar a;
uint num=0;
EX0 = 0; //处理数据是禁止中断
for(a=12;a>0;a--)
{
while(!in);
delay1(); //0.844ms
num=num<<1;
if(!in)
{
num=num|0x01;
delay2(); //0.5ms+0.844ms刚好跳过最长的高电平
}
}
send_data=num;
EX0 =1; //处理数据完成后开中断
}
/******************************************************************/
void work(void)//红外键值散转程序
{
switch(send_data)
{
case 0x0f20:P0=tab[1];break;//1 显示相应的按键值
case 0x0f10:P0=tab[2];break;//2
case 0x0f08:P0=tab[3];break;//3
case 0x0f04:P0=tab[4];break;//4
case 0x0f02:P0=tab[5];break;//5
case 0x0f01:P0=tab[6];break;//6
case 0x0ea0:P0=tab[7];break;//7
case 0x0e90:P0=tab[8];break;//8
case 0x0e88:P0=tab[9];break;//9
case 0x0e84:P0=tab[10];break;//a
case 0x0e82:P0=tab[11];break;//b
case 0x0e81:P0=tab[12];break;//c
case 0x0e60:P0=tab[13];break;//d
case 0x0e50:P0=tab[14];break;//e
case 0x0e48:P0=tab[15];break;//f
case 0x0e44:P0=tab[16];break;//0
case 0x0e42:P0=tab[17];break;//-
case 0x0e41:P0=tab[18];break;//.
default:led=0;break;
}
}
/***************************************************************/
void main(void)
{
IT0 = 1;
EX0 = 1;
EA = 1;
P2=0x00;//1位数码管全部显示
while(1)//主循环
{
work();
}
}