📄 irrecv.c
字号:
** g_keyUser -- 用户码
** g_keyUserF -- 用户反码
** g_keyValue -- 键码
** g_keyValueF -- 键码反码
** 调用模块: 无
** 被调模块:
** checkPulse -- 脉冲检测
** 作 者: 金雨和
** 创建日期: 2006年1月15日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void pulseProc(unsigned char pulseNum)
{
if(pulseNum > 0)
{
if(g_insr1 == 0)
return;
if(pulseNum > 1)
{
if((pulseNum >=2) && (pulseNum <= 9)) //用户码处理
{
if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
g_keyUser >>= 1;
else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
{
g_keyUser >>= 1;
g_keyUser = g_keyUser+128;
}
else
;//g_RSDA3 = 1;
}
else if((pulseNum >= 10) && (pulseNum <= 17)) //用户码反码处理
{
if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
g_keyUserF >>= 1;
else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
{
g_keyUserF >>= 1;
g_keyUserF = g_keyUserF+128;
}
else
;//g_RSDA3 = 1;
}
else if((pulseNum >= 18) && (pulseNum <= 25)) //键值处理
{
if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
g_keyValue >>= 1;
else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
{
g_keyValue >>= 1;
g_keyValue = g_keyValue+128;
}
else
;//g_RSDA3 = 1;
}
else if((pulseNum >= 26) && (pulseNum <= 33)) //键值反码处理
{
if((g_insr1 > MIN_BIT0_PLS) && (g_insr1 < MAX_BIT0_PLS)) //比较脉宽,0.3ms<脉宽<0.7ms,为0
g_keyValueF >>= 1;
else if((g_insr1 > MIN_BIT1_PLS) && (g_insr1 < MAX_BIT1_PLS)) //比较脉宽,1.4ms<脉宽<1.9ms,为1
{
g_keyValueF >>= 1;
g_keyValueF = g_keyValueF+128;
}
else
;//g_RSDA3 = 1;
}
if(pulseNum >= 33) //正确收到
{
if((g_keyUser == 0x00) && (g_keyUserF == 0xFF) && (g_keyValue == ~g_keyValueF))
{
g_rsData = g_keyValue; //得到红外遥控键值
g_IR_SF = 0;
g_rsFlag = 1;
g_RSDA1 = 0;
}
else
g_RSDA1 = 0;
}
}
else //g_pulseNum为1,第一个脉冲为前导码标志,
{ //一个下降沿和上升沿构成一个波形脉冲|_|--
if((g_insr1 > MIN_CODE_PLS)&&(g_insr1 < MAX_CODE_PLS)) //检测到前导码
{
g_keyValue = 0x00; //键值
g_keyValueF = 0x00; //键值反码
g_keyUser = 0x00; //用户码
g_keyUserF = 0x00; //用户码反码
}
else
;//g_RSDA3 = 1;
}
//g_insr1 = 0;
}
else
g_RSDA3 = 0; //清无效标志
}
/*******************************************************************
** 函 数 名: convertIRRCode()
** 输 入:
** irrCode -- 红外码值
** 输 出:
** -- 键盘码值
** 描 述: 将红外码值转换成对应的键盘码值。
** 全局变量: 无
** 调用模块: 无
** 被调模块:
** OnIRRecv -- 检测到正确的红外接收码后,通过IIC发送给主控
** 作 者: 金雨和
** 创建日期: 2006年1月15日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
unsigned char convertIRRCode(unsigned char irrCode)
{
unsigned char rslt;
switch(irrCode)
{
case 0x1F:
rslt = 0x52;
break;
case 0x05:
rslt = 0x53;
break;
case 0x19:
rslt = 0x54;
break;
case 0x54:
rslt = 0x51;
break;
case 0x0A:
rslt = 0x32;
break;
case 0x08:
rslt = 0x42;
break;
case 0x4A:
rslt = 0x38;
break;
case 0x44:
rslt = 0x34;
break;
case 0x0E:
rslt = 0x33;
break;
case 0x0C:
rslt = 0x48;
break;
case 0x4E:
rslt = 0x40;
break;
case 0x53:
rslt = 0x3B;
break;
case 0x12:
rslt = 0x37;
break;
case 0x10:
rslt = 0x3F;
break;
case 0x52:
rslt = 0x39;
break;
case 0x5C:
rslt = 0x3A;
break;
case 0x14:
rslt = 0x36;
break;
case 0x16:
rslt = 0x41;
break;
case 0x56:
rslt = 0x3E;
break;
case 0x57:
rslt = 0x56;
break;
case 0x02:
rslt = 0x50;
if(QUIETLED)
QUIETLED = 0;
else
QUIETLED = 1;
break;
case 0x59:
rslt = 0x49;
break;
case 0x00:
rslt = 0x4F;
if(MUTELED)
MUTELED = 0;
else
MUTELED = 1;
break;
case 0x18:
rslt = 0x55;
break;
case 0x07:
rslt = 0x44;
break;
case 0x55:
rslt = 0x3C;
break;
case 0x15:
rslt = 0x43;
break;
case 0x58:
rslt = 0x47;
break;
case 0x43:
rslt = 0x57;
break;
case 0x5D:
rslt = 0x45;
break;
case 0x42:
rslt = 0x58;
break;
case 0x4F:
rslt = 0x46;
break;
default :
rslt = 0xFF;
break;
}
return rslt;
}
/*******************************************************************
** 函 数 名: OnIRRecv()
** 输 入: 无
** 输 出: 无
** 描 述: 检测到正确的红外接收码后,通过IIC发送给主控
** 全局变量:
** g_rsData -- 红外键码
** g_ucI2CSendBuf_Len --发送的IIC数据长度
** g_ucI2CSendBuf -- 发送的IIC数据缓冲
** g_ucI2CSendBuf_offset -- 发送的IIC数据缓冲偏移值
** 调用模块:
** SendDataToBsp -- 通知CPU,IIC有数据发送
** convertIRRCode -- 将红外码值转换成对应的键盘码值
** 被调模块:
** main -- 主控函数
** 作 者:
** 创建日期: 2006年1月15日
** 修 改:
** 日 期 版本 修改人 修改内容
** 1.
********************************************************************/
void OnIRRecv()
{
unsigned char sndCode;
if(g_rsFlag) //if Remote not active,waiting
{
//IR_LED = 1; //turn on the led if a key coming
g_rsFlag= 0; //Ready for next ir receiving
/* 通过IIC发送数据给CPU */
sndCode = convertIRRCode(g_rsData);
if(sndCode == 0xFF)
return;
g_ucI2CSendBuf_Len = 2;
g_ucI2CSendBuf[0] = IRR;
g_ucI2CSendBuf[1] = sndCode;
g_ucI2CSendBuf_offset = 0;
IICSendIntToCPU(); //通知CPU,IIC有数据发送
}
else
{
;//IR_LED = 0; //turn off the led if no key pressed
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -