⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irrecv.c

📁 此代码实现功能为:在philips P89LPC935单片机上实现红外遥(对应红外发送芯片为:HT6222)控解码接收
💻 C
📖 第 1 页 / 共 2 页
字号:
**			 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 + -