|
//数码管永远都是0,不管按哪个遥控键都不变。能帮忙看看是哪里出问题了吗?
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit IRIN=P3^3;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar disp[8];
uchar ircode[4]; //数码管显示缓冲
sbit duan=P2^6;
sbit wei=P2^7;
void init_int0()
{
IE = 0x84; //允许总中断中断,使能 INT1 外部中断
TCON = 0x10; //触发方式为脉冲负边沿触发
IRIN=1; //I/O口初始化
}
void data_pros()
{
disp[0]=ircode[0]>>4;
disp[1]=ircode[0]&0x0f;
disp[2]=ircode[2]>>4;
disp[3]=ircode[2]&0x0f;
}
void delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
void delay(unsigned char x) //x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void display()
{
uchar i;
for(i=0;i<4;i++)
{
duan=1;
P0=table[disp[i]];
duan=0;
P0=0xff;
wei=1;
P0=table2[i];
wei=0;
delayms(5);
}
}
void IR_IN() interrupt 2 using 0
{
unsigned char j,k,N=0;
EX1 = 0;
delay(15);
if (IRIN==1)
{ EX1 =1;
return;
}
//确认IR信号出现
while (!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{delay(1);}
for (j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while (IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30)
{ EX1=1;
return;} //0.14ms计数过长自动离开。
} //高电平计数完毕
ircode[j]=ircode[j] >> 1; //数据最高位补“0”
if (N>=8) {ircode[j] = ircode[j] | 0x80;} //数据最高位补“1”
N=0;
}//end for k
}//end for j
if (ircode[2]!=~ircode[3])
{ EX1=1;
return; }
EX1 = 1;
}
void main()
{
init_int0();
duan=0;
wei=0;
while(1)
{
data_pros();
display();
}
}
|
|