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

📄 remote.c

📁 原创ateml avr 单片机遥控器解码程序
💻 C
字号:
/*\\file:	audio.c
	Date.	2005.12.10	Ipman Robbin
	Desp.	ir decode.
	Last update: 2006.08.10	
	Common:	use icp decode ir 
  */
//#include "system.h"
#include "remote.h"
void RemoteInit(void);


BYTE irDataBuff[4];
BYTE irKeyEvent=0;				//按键状态
UIN16 icrCurrent=0;			//当前icr值
UIN16 icrPrevious=0;			//上次icr值
UIN16 icrSpace=0;				//icr值间隔
BYTE irByteIndex=0;				//当前处理遥控器的字节INDEX
BYTE irBitIndex=0;				//遥控码位INDEX
BYTE irIsFinish=TRUE;			//标志解码成功
BYTE irIndex;
BYTE irCode;
BYTE lastIrCode;
BYTE irState;
BYTE irKeyRpt_f;

BYTE irKeyRptTimes;


static void ir_get_bit(char bit)
{	
	irDataBuff[irByteIndex]<<=1;
	if(bit)
		irDataBuff[irByteIndex] |= 1;
	else
		irDataBuff[irByteIndex] &= 0xFE;
	irBitIndex++;
	if(irBitIndex%8==0)
		irByteIndex++;
	if(irBitIndex==32)//累计到32个,则发送遥控器接收完成标志
	{
		if(irDataBuff[0]==REMOTE_ADDR&&irDataBuff[2]==~irDataBuff[3])//厂家码校验
		{
			irCode=irDataBuff[2];
			irKeyEvent = _IR_KEY_DOWN;
			irKeyRptTimes=0;
			irKeyRpt_f=0;
			irState++;
			SendIRCodeStop();			//接收到新的遥控码停止发送上一个遥控码
		}
		else
		{
			irState=0;
		}
	}
}

/*
	ICP中断,电平宽度捕捉,遥控解码
  */
	//irState
	//0:	接收引导码					13.5ms
	//1:	接收客户码和遥控码			45ms-63ms
	//2:	接收截止码					32ms-50ms
	//3:	接收重复发送引导码			11.25ms
	//4:	接收重复发送截止码			96.75ms
SIGNAL(SIG_INPUT_CAPTURE1)//ICP1
{
//	test();
	if(!key_in_press_f)//注意:在键盘有按键未释放,遥控不允许工作
	{
		icrCurrent = ICR1;						//读取本次宽度
		icrSpace = icrCurrent - icrPrevious;	//获得与上次下降沿的距离
		icrPrevious = icrCurrent;				//保存当前icr值,以备下次比较用

		switch(irState)
		{
			case 0:
				if (icrSpace>(ICR_SPACE_1ST-ICR_SHIFT)&&icrSpace<(ICR_SPACE_1ST+ICR_SHIFT) )
				{
					irBitIndex=0;			
					irByteIndex=0;		
					irState++;					
				}
				break;
			case 1:		
				if(icrSpace<(ICR_SPACE_BIT0+ICR_SHIFT) && icrSpace>(ICR_SPACE_BIT0-ICR_SHIFT))//收到0
				{
					ir_get_bit(0);DVDPowOff();
				}
				else if(icrSpace<(ICR_SPACE_BIT1+ICR_SHIFT) && icrSpace>(ICR_SPACE_BIT1-ICR_SHIFT))//收到1
				{
					ir_get_bit(1);DVDPowOn();
				}
				else
				{		
					irState=0;			//误码时重新置位
				}
				break;
			case 2:		
				test();
				if(icrSpace>(ICR_RUMP_MIN-ICR_SHIFT) && icrSpace<(ICR_RUMP_MAX+ICR_SHIFT))
					irState++;
				else
					irState=0;
				break;
			case 3:
				if (icrSpace<(ICR_SPACE_2ND+ICR_SHIFT) && icrSpace>(ICR_SPACE_2ND-ICR_SHIFT))
				{
					irState++;
					icrPrevious = TCNT1_VAL;
					TCNT1 = TCNT1_VAL;
				}
				else					
				{
					irState=0;			//误码时重新置位
					irKeyEvent = _IR_KEY_UP;
				}
				break;
			case 4:
				if (icrSpace<(ICR_SPACE_1ST*8-ICR_SPACE_2ND+ICR_SHIFT*8) && icrSpace>(ICR_SPACE_1ST*8-ICR_SPACE_2ND-ICR_SHIFT*8))
				{
					irState--;
					irKeyRptTimes++;
					if(irKeyRptTimes==10)
					{
						irKeyRpt_f=1;
						irKeyRptTimes=0;
					}
				}
				else
				{
					irState=0;			//误码时重新置位
					irKeyEvent = _IR_KEY_UP;
				}
				break;
			default:
				irState=0;
				break;
		}
	}
	else// if(irState!=0)	//有按键时遥控键接收状态初始化
	{
		irKeyEvent=0;
		irState=0;
	}
}


/*
	定时器溢出,当无按键时产生此事件
  */
SIGNAL(SIG_OVERFLOW1)		
{
	TCNT1 = TCNT1_VAL;
	icrPrevious = TCNT1_VAL;
//	if(irState!=0)
//	{
		if(irState >=2)
			irKeyEvent = _IR_KEY_UP;		//按键释放
//		irState=0;
//	} 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -