} //end main
/**********************************************************/
void IR_IN() interrupt 0 using 0
{
unsigned char j,k,N=0;
EX0 = 0; //關(guān)掉外部中斷防止中斷的再次發(fā)生進入檢測引導(dǎo)碼階段(9ms的低電平4.5ms的高電平)
delay(15);
if (IRIN==1)
{ EX0 =1; //9ms的檢測檢測結(jié)束從新打開外部中斷
return;
}
//確認IR信號出現(xiàn)
while (!IRIN) //等IR變?yōu)楦唠娖剑^9ms的前導(dǎo)低電平信號。
{delay(1);}
for (j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
{
while (IRIN) //等 IR 變?yōu)榈碗娖剑^4.5ms的引導(dǎo)高電平信號。
{delay(1);}
while (!IRIN) //等 IR 變?yōu)楦唠娖?br />
{delay(1);}
while (IRIN) //計算IR高電平時長(0和1的低電平的時長一樣的,只要判斷高電平時長超過0.56ms并小于1.12ms為1否 則為0)
{
delay(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms計數(shù)過長自動離開。
} //高電平計數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補“0”
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;} //高電平持續(xù)時間大于1.12ms則數(shù)據(jù)最高位補“1”
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) // 判斷有沒有誤碼(有責(zé)放棄沒有判斷鍵碼)
{ EX0=1;
return;
}
switch(IRCOM[2])
{ // 顯示遙控上的字符按鍵
case 0x09:
RELAY1=!RELAY1;
break;
case 0x0c:
RELAY2=!RELAY2;
break;
case 0x0e:
RELAY3=!RELAY3;
break;
case 0x00:
RELAY4=!RELAY4;