unsigned char code DUAN_TABLE[]={0X3F, 0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
unsigned char disp_buff[4]={1,2,3,4};
unsigned int tem[34]={0};
sbit IO_HW=P3^4; //红外检测IO口
sbit d0=P2^3;
bit flag=0;
//返回:0,表示没有键按下;1,表示有键按下,按下的键码为*dat.
unsigned char HW_scan(unsigned int *dat) //红外扫描,接收按键并进行解码
{
unsigned char count=0;
unsigned long int x=0,y=0;
if(IO_HW==0) //判断IO口状态,0表示有数据
{ while(IO_HW==0);//等待
while(IO_HW==1);
for(count=0;count <32;count++) //接收32个脉冲
{
TH1=0;TL1=0;
while(IO_HW==0&&x <5000)x++; //等待低电平到,并延时退出,防止死在这里
if(x> 4900)return 0;
TR1=1;
while(IO_HW==1&&x <10000)x++; //低电平维持时间用定时器1计时,并长时间无响应退出
if(x> 9900)return 0;
TR1=0;
x=TH1*256+TL1;
if(x> 1000) y=y|0x01; //553,> 0.6ms认为宽脉冲,位数据为1.
y=y < <1; //先读高位
}
y=y> > 1; //最后多余的一位退回去.
*dat=y;
// if(*dat==0x00ff||*dat==0x807f||*dat==0x40bf||*dat==0x20df||*dat==0xa05f||*dat==0x609f||*dat==0x10ef||*dat==0x906f||*dat==0x50af||*dat==0xb04f||*dat==0xc03f||*dat==0xe01f||*dat==0xd02f||*dat==0x3ad6)return 1;
// if(*dat==0xc03f||*dat==0x20df||*dat==0x906f||*dat==0x50af||*dat==0xd02f||*dat==0x2ad6||*dat==0x3ad6||*dat==0x40bf||*dat==0xe01f)return 1;
if(*dat==0x40bf||*dat==0xc03f||*dat==0xe01f||*dat==0x50af||*dat==0xd02f||*dat==0x02fd||*dat==0x2ad5||*dat==0xe817||*dat==0x6897||*dat==0x0af5||*dat==0xc837||*dat==0x48b7||*dat==0x32cd||*dat==0xf00f||*dat==0x708f||*dat==0x12ed)return 1;
//10个键的编码依次为:1234567890
else return 0;
}
else return 0;
}
/*main()
{
unsigned int dat;
TMOD=0X11;//定时器1用作红外检测
TH0=0xee;
TL0=0;
TR0=1;
ET0=1;
EA=1;
disp_buff[0]=0;
while(1)
{
if(HW_scan(&dat)==1)
{
if(dat==0x00ff)
{disp_buff[0]=1;}
else if(dat==0x807f)
{disp_buff[0]=2;}
else if(dat==0x40bf)
{disp_buff[0]=3;}
else if(dat==0xc03f)
{disp_buff[0]=4;}
else if(dat==0x20df)
{disp_buff[0]=5;}
else if(dat==0xa05f)
{disp_buff[0]=6;}//
else if(dat==0x609f)
{disp_buff[0]=7;}
else if(dat==0xe01f)
{disp_buff[0]=8;}
else if(dat==0x10ef)
{disp_buff[0]=9;}
else if(dat==0x906f)
{disp_buff[0]=12;}//
else if(dat==0x50af)
{disp_buff[0]=13;}
else if(dat==0xd02f)
{disp_buff[0]=14;}
else if(dat==0x2ad6)
{disp_buff[0]=0;}
}
}
} */
main()
{
unsigned int dat;
TMOD=0X11;//定时器1用作红外检测
TH0=0xee;
TL0=0;
TR0=1;
ET0=1;
EA=1;
disp_buff[0]=0;
while(1)
{
if(HW_scan(&dat)==1)
{
if(dat==0x40bf) //ok
{disp_buff[0]=11;}
else if(dat==0xc03f) //+下方
{disp_buff[0]=12;}
else if(dat==0xe01f) //+
{disp_buff[0]=13;}
else if(dat==0x50af) //-
{disp_buff[0]=14;}
else if(dat==0xd02f) //.
{disp_buff[0]=15;}
else if(dat==0x02fd)
{disp_buff[0]=0;}
else if(dat==0x2ad5) //1
{disp_buff[0]=1;}
else if(dat==0xe817) //2
{disp_buff[0]=2;}
else if(dat==0x6897) //3
{disp_buff[0]=3;}
else if(dat==0x0af5)//4
{disp_buff[0]=4;}
else if(dat==0xc837)
{disp_buff[0]=5;}
else if(dat==0x48b7)
{disp_buff[0]=6;}//
else if(dat==0x32cd)
{disp_buff[0]=7;}
else if(dat==0xf00f)
{disp_buff[0]=8;}
else if(dat==0x708f)
{disp_buff[0]=9;}
else if(dat==0x12ed)
{disp_buff[0]=0;}
}
}
}
void timer0() interrupt 1
{
static unsigned char Bit=0;
TH0=0xEE;
TL0=0x00;
P1=0xfe;
P0=DUAN_TABLE[disp_buff[Bit]];
}