就以部分顯示來說吧,我的思路是這樣的,如果我在遙控器按下一個鍵,通過鍵值解析來實現具體功能,現在按下一個按鍵之后,一直在循環這個按鍵的處理程序
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;
}
}
}
|