📄 ir_data.c
字号:
//红外解码
void CheckIR()
{
//uchar iNowBit,iPos;
if ((PIND&(1<<IR))>0) //ICP INPUT CHECK
iNowBit=0;
else
iNowBit=1;//先反相
//把信号持续的处理作为公共处理
if ((iPreBit==1)&&(iNowBit==1))//hight++
{ iHight++;
return;
}
if ((iPreBit==0)&&(iNowBit==0))//low++
{ iLow++;
return;
}
switch (iIrMode)
{
case 0://等待9ms的高电平
if ((iPreBit==0)&&(iNowBit==1))//0->1:start
{ iPreBit=1;
iHight=1;
return;
}
if ((iPreBit==1)&&(iNowBit==0))//1->0
{ iPreBit=0;
if (iHight>12)//1.30ms
{ iIrMode=1;
iLow=1;
iHight=0;
//bCmdOk=1;iCmd=10;//Test..
}
else
{iHight=0;//reset
}
return;
}
break;
case 1://等待1.6ms的低电平
if ((iPreBit==0)&&(iNowBit==1))//0->1
{ iPreBit=1;
if (iLow>15)//1.6ms
{ iIrMode=2;
iBitCount=0;
iIrData[0]=0;iIrData[1]=0;iIrData[2]=0;iIrData[3]=0;
iHight=1;
//bCmdOk=1;iCmd=10;//Test..
}
else
{ iIrMode=0;
//确实只发送一次,后面的是按键保持信号,无按键码信息
}
return;
}
break;
case 2://接收用户码和按键码,共32Bit
if ((iPreBit==1)&&(iNowBit==0))//1->0
{ iPreBit=0;
iLow=1;
}
if ((iPreBit==0)&&(iNowBit==1))//0->1
{ iPreBit=1;
//已经接收1Bit,根据占空比判断01
if (iLow>(iHight+iHight)) iNowBit=0;else iNowBit=1;
//Bit0在前,右移位
iPos=iBitCount/4;
iIrData[iPos]=iIrData[iPos]>>1;
if (iNowBit==1) iIrData[iPos]|=0x80;
iBitCount++;
if (iBitCount>=24)
{ bIrCmdOk=1;
iIrMode=0;
//bCmdOk=1;iCmd=10;//Test..
}
iHight=1;//must!
}
break;
default:
iIrMode=0;
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -