IR遥控转码功能
关键字:IR 转码 DVD 遥控
适用机种:MIPS架构平台所有机型
以下为遥控转码(NEC码)功能的参考代码,使用1个IO口来模拟IR波形给DVD或其它后端设备。
现只是使用延时而没有使用中断的方式来做,因为现系统中的MsOS_DelayTaskUs函数实际时间不准确,需加入修正值,具体的可通过
示波器测量波形来验证。
#if (ENABLE_DVD_IR_SEND_FUNCTION)
#define FIX_MUL_VAL 0.66
#define IR_LEADER_LOW 5940 //(9000*FIX_MUL_VAL) // us
#define IR_LEADER_HIGH 3000 //(4500*FIX_MUL_VAL) // us
#define IR_LOGIC_HIGH 385 //(560*FIX_MUL_VAL) // us
#define IR_LOGIC0_LOW 385 //(560*FIX_MUL_VAL) //1120 // us
#define IR_LOGIC1_LOW 1155 //(1680*FIX_MUL_VAL) //2240 // us
#define IR_HEADCODE 0xBF00
U32 u32_SendIRtimerCounter;
#define IR_DELAY(X) {MsOS_DelayTaskUs(X);}//{u32_SendIRtimerCounter = MsOS_GetSystemTime();while(MsOS_Timer_DiffTimeFromNow(u32_SendIRtimerCounter) >= X);}
void SendIRCode(U8 Datecode)
{
U8 i;
U32 j = 0x01;
U32 SendDATA; //, HeadCode;
//HeadCode = IR_HEADCODE;
SendDATA = IR_HEADCODE | (Datecode << 16) | ((~Datecode)<<24) ;
// putstr("\r\n Set P0_6");
printf("\r\n DATA = %x",SendDATA);
DVD_IR_LOW();
IR_DELAY(IR_LEADER_LOW);
DVD_IR_HIGH();
IR_DELAY(IR_LEADER_HIGH);
for(i=0;i<32;i++)
{
DVD_IR_LOW();
IR_DELAY(IR_LOGIC_HIGH);
DVD_IR_HIGH();
if(SendDATA&j)
{
IR_DELAY(IR_LOGIC1_LOW);
}
else
{
IR_DELAY(IR_LOGIC0_LOW);
}
j <<=1;
}
/*
j = 0x01;
for(i=0;i<16;i++)
{
DVD_IR_LOW();
IR_DELAY(IR_LOGIC_HIGH);
DVD_IR_HIGH();
if(SendDATA&j)
{
j <<=1;
IR_DELAY(IR_LOGIC1_LOW);
}
else
{
j <<=1;
IR_DELAY(IR_LOGIC0_LOW);
}
}
*/
DVD_IR_LOW();
IR_DELAY(IR_LOGIC_HIGH);
DVD_IR_HIGH();
printf("\r\n ONE BYTE SEND");
//putstr("\r\n - "); putstr(" - "); putstr(" - ");
MsOS_DelayTask(10);
DVD_IR_HIGH();
return;
}
#endif
|