|
//數碼管永遠都是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();
}
}
|
|