就以部分显示来说吧,我的思路是这样的,如果我在遥控器按下一个键,通过键值解析来实现具体功能,现在按下一个按键之后,一直在循环这个按键的处理程序
uchar code password[]={1,2,3,4,5,6,7,8};
sbit led1=P2^0;
sbit led2=P2^1;
sbit dz=P1^5;
sbit moto=P1^0;
sbit IRIN = P3^2;
unsigned char irok;
unsigned char IrValue[6];
unsigned char Time;这是主程序里的
while(1)
{
//num=Keyvalue
switch(IrValue[2]) // 通过红外键值来给s赋值,b暂时没有用
{
case 0x16: b=0;s=0;break;
case 0x0c: b=1;s=1;break;
case 0x18: b=2;s=2;break;
case 0x5e: b=3;s=3;break;
case 0x08: b=4;s=4;break;
case 0x1c: b=5;s=5;break;
case 0x5a: b=6;s=6;break;
case 0x42: b=7;s=7;break;
case 0x52: b=8;s=8;break;
case 0x4a: b=9;s=9;break;
case 0x07: b=15;s=15;break;
case 0x19: b=14;s=14;break;
case 0x0d: b=13;s=13;break;
// default:h=1;s=0xff;;break;
}
//
{
num=s;
//将s在赋值给num,通过判断num的数字来实现具体功能
if(i<16&&num!=14&&num!=15)//如果输入的数字小于16并且14和15按键都没有按下
{
passwordtemp=num;//将num得到的数字放进密码缓存
LCD_Write_Char(i,1,num+0x30);//在1602显示
delay(100);
}
i++;
}
//红外初始化接收
void IrInit()
{
IT0=1
EX0=1
EA=1;
IRIN=1;
}
红外数值读取的中断函数,
void ReadIr() //interrupt 0
{
unsigned char j,k;
unsigned int err;
Time=0;
DelayMs(70);
if(IRIN==0) 确认是否接收到正确的信号
{
err=1000;
while((IRIN==0)&&(err>0)) //等待前面9ms低电平过去
{
DelayMs(1);
err--;
}
if(IRIN==1) //如果正确等到9ms低电平过去
{
err=500;
while((IRIN==1)&&(err>0)) //等待4.5ms起始高电平过去
{
DelayMs(1);
err--;
}
for(k=0;k<4;k++)//共4组数据
{
for(j=0;j<8;j++) //接收一组数据
{
err=60;
while((IRIN==0)&&(err>0)//等待信号前面的560us过去
// while (!IRIN)
{
DelayMs(1);
err--;
}
err=500;
while((IRIN==1)&&(err>0)) //计算高电平时间长度
{
DelayMs(1);//0.14ms
Time++;
err--;
if(Time>30)
{
EX0=1;
return;
}
}
IrValue[k]>>=1; //k表示第几组数据
if(Time>=8) //如果高电平出现大于565us,是1
{
IrValue[k]|=0x80;
}
Time=0; //用完时间重新赋值
}
}
}
if(IrValue[2]!=~IrValue[3])
{
return;
}
}
}
|