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

📄 ir.c

📁 p89lpc915程序
💻 C
字号:
#include "comm.h"
#include "Key_process.h"
#include "ir.h"
#include "debug.h"


bit pre_bit = 0;
uint32 dataIR = 0;		/* System/customer IR code	*/
static uchar	cntIRbits = 0;	/* Number of IR sys/cust. bits	*/
char	stateIR = IR_IDLE; /* IR state machine state	*/
extern  bit ir_enable;
extern  uchar codeIR;
uchar pre_code = 0;
bit repeat_flag =0;


#if 0
static void code_valid()
{


	if(dataIR == pre_code)
		{
		if(pre_code  == _POWER_KEY)	/*POWER key do not allow repeat*/
		return;
		}
	else
		{
		ir_enable = 1;
		codeIR = dataIR & 0xFF;
		pre_code = dataIR;
		}
	stateIR = IR_IDLE;
j	cntIRbits = 1;
	dataIR = 1;
	pre_bit = 1;
}
#endif

void Timer_0(void) interrupt 1
{
//extern int Get_key_timer;
/*15.6ms    正常的一次信号是  9.0MS + 4.5 超过这个时间,就表示,信号不符合

或是IR_REEP
*/
	TR0 = 0;
	TL0=0x00;
	TH0=0x90;
	/*TR0 = 1;*/
#if 0 //def IRREP
       if (stateIR == IR_REPEAT)
		{
		repeat_flag =1;
		if(pre_code == _POWER_KEY)
			return; /*POWER 键不需要连按*/
		codeIR = pre_code; /* Indicate a new code */
		ir_enable = 1;
		}
#endif



	stateIR = IR_IDLE;
	cntIRbits = 1;
	dataIR = 1;
	pre_bit = 1;
}
#if 0

void ir_core_philips()
{
	uint width;

	TR0=0;
/*	two_byte_tmp._WORD.H_BYTE = TH0;
	two_byte_tmp._WORD.L_BYTE = TL0;*/
	width = (uint)(TH0 * 256) + TL0;
	TL0=0x00;
	TH0=0x90;
	TR0=1;
/*	width = two_byte_tmp.word;*/

	if((width > PLUSE2_WIDTH_MIN) && (width < PLUSE2_WIDTH_MAX))
		{
		width = 2;
		}
	else if((width > PLUSE3_WIDTH_MIN) && (width < PLUSE3_WIDTH_MAX))
		{
		width = 3;
		}
	else if((width > PLUSE4_WIDTH_MIN) && (width < PLUSE4_WIDTH_MAX))
		{
		width = 4;
		}
	else
		{
		width = 1;
		}

	pre_bit = dataIR & 0x1;
	if(stateIR == IR_IDLE)
		{
		stateIR = IR_CUSTOM;
		cntIRbits = 1;
		dataIR = 1;
		pre_bit = 1;
		}
	else
		{
		switch(width){
			case 2:
				cntIRbits += 2;
				break;
			case 3:
				cntIRbits += 3;
				break;
			case 4:
				cntIRbits += 4;
				break;
			default:
				break;
			}
		dataIR  <<= 1;
		if(cntIRbits & 0x1)	/*half bit*/
			{
			switch(width){
				case 2:	/*如果接收到2个脉冲之后数据是半位,则数据和前一位的值一样*/
					if(pre_bit)
						dataIR |= 0x1;
					break;
				case 3:	/*如果接收到3个脉冲之后数据是半位,则数据是前一位的值以及前一位的反*/
					if(pre_bit)
						{
						dataIR |= 1;
						dataIR <<= 1;
						}
					else
						{
						dataIR <<= 1;
						dataIR |= 1;
						}
					break;
				case 4:	/*如果接收到4个脉冲之后数据是半位,则数据是前一位的值的反以及前一位的值*/
					if(pre_bit)
						{
						dataIR <<= 1;
						dataIR |= 1;
						}
					else
						{
						dataIR |= 1;
						dataIR <<= 1;
						}
					break;
				}
			}
		else		/*full bit*/
			{
			switch(width){
				case 2:		/*如果接收到2个脉冲之后数据是完整位,则数据和前一位的值一样*/
					if(pre_bit)
						dataIR |= 0x1;
					break;
				case 3:
				case 4:
					if(pre_bit)	/*如果接收到3个或者4个脉冲宽度之后数据是完整位,则数据为前一位的反以及前一位一样的值*/
						{
						dataIR <<= 1;
						dataIR |= 1;
						}
					else
						{
						dataIR |= 1;
						dataIR <<= 1;
						}
					break;
				}
			}
		}
	if(cntIRbits == 0x1B)
		{
		code_valid();
		}
	if(cntIRbits > 0x1B)
		{
		stateIR = IR_IDLE;
		}
}

#endif



#define IR_NEC
#if 1//def IR_NEC
  #ifdef DEBUG_PRINTF
	
 		unsigned char sys_code;
		unsigned char ivcode;
		
  #endif
  
void ir_core_nec()  using 1
{
	int reset = 0;
	uint width;
//	static uchar rep_cnt=0;
    //unsigned char temp_data,temp_data1;
	TR0=0;
	width = (uint)((TH0 -0x90)* 256) + TL0 ;
	TL0=0x00;
	TH0=0x90;
	TR0=1;
//	temp_data = (width>>8);
//	temp_data1 = width&0xff;

	if (stateIR == IR_IDLE)
		{
			stateIR = IR_LEADER_LOW;
	
		}
	else if (stateIR == IR_CUSTOM)
		{

			dataIR <<= 1;
			if ((width >= DATA_1_MIN) && (width <= DATA_1_MAX))
				{
				dataIR |= 0x1;
				}
			else if ((width < DATA_0_MIN) || (width > DATA_1_MAX))
				{
				reset = 1;
				}

			cntIRbits++;

			/* First 16 bits are syscode */
#if 1
			if (cntIRbits == 16 )
				{
				       
                          if(dataIR != SYSTEM_CODE)
                          	{
             
					reset = 1;
                          	}

			#ifdef DEBUG_PRINTF

			         sys_code = dataIR&0xff;	        /*jian add in 07-07-26*/
			
			#endif
			
				}
#endif	//csg
			if (cntIRbits == 24)
				{

				codeIR = dataIR&0xff;// | 0x100;	/* Indicate a new code */
    
			      	ir_enable = 1;  /*jian add in 07-08-1*/
				
		#ifdef IRREP
                         pre_code = codeIR;
             #endif
				//ir_enable = 1;
				}
			else if (cntIRbits == 32)
				{

		#ifdef DEBUG_PRINTF
			
				ivcode = dataIR&0xff;
			
		#endif 
				reset = 1;
				}

		}
	#if 0
	else if (stateIR == IR_LEADER_LOW) 
		{
		if ((width >= LEADER_LOW_MIN) && (width <= LEADER_LOW_MAX))
			{
			stateIR = IR_LEADER_HIGH;
			}
		else
			reset = 1;
		}
	#endif
	
	else if(stateIR == IR_LEADER_LOW)
		{
//			tvbox_printf("h_vaule:",temp_data ,1);
//			tvbox_printf("l_vaule:",temp_data1 ,1);

		/* stateIR has to be equal to IR_LEADER_HIGH */
		if ((width >= (LEADER_HIGH_MIN + LEADER_LOW_MIN)) && (width <= (LEADER_HIGH_MAX + LEADER_LOW_MAX)))
			{
			dataIR = cntIRbits = 0;
			stateIR = IR_CUSTOM;
			}
#ifdef IRREP
		else if ((width >= (REPEAT_HIGH_MIN + LEADER_LOW_MIN)) && (width <= (REPEAT_HIGH_MAX + LEADER_LOW_MAX)))
			{
			/* if the width is 2.25 ms, it is repeat code leader */
			stateIR = IR_REPEAT;
		      if(pre_code != _POWER_KEY)
		      	{
				codeIR = pre_code; /* Indicate a new code */
				ir_enable = 1;
				repeat_flag =1;
				reset = 1;  /*jian add in 07-07-20*/
		      	}
			  /*power key needn't ireep!!!*/


			}
#endif
		else
			reset = 1;
		}
#if 0//def IRREP
	else if (stateIR == IR_REPEAT)
		{
		if ((width >= REPEAT_DATA_MIN) && (width <= REPEAT_DATA_MAX))
			{ 
			/* the width is 0.56 ms */
	        	codeIR = pre_code; /* Indicate a new code */
			ir_enable = 1;
			}
		reset = 1;
		}
#endif
	else
		{
		reset = 1;
		}

	if (reset)
		{
		/* Reset all, start from the very beginning */
		stateIR = IR_IDLE; 
		}
}

#endif 

void EXTIRQ_interrupt_service(void) interrupt 0 using 1
{
	EA = 0;
//	ir_core_philips();
      ir_core_nec();
	EA = 1;
}

#if 0
void delay_889us()
/*
 *FOR 4MHz CLOCK TO DELAY 889uS
 */
{
	uint i = 220;
	while(--i);
}
#endif


void Nec_send_vaule(unsigned char vaule)
{

unsigned char j;

   for(j = 0; j < 8; j++)
	  	{
		delay(30);/*0.565ms    10 us*//*0.173ms*/	 	
		OUTPUT_IR = 1;
		if(vaule & 0x80)

		    delay(100);/*1.69ms    10 us*//*0.173ms*/	 
		
		else 

		    delay(30);/*0.565ms    10 us*//*0.173ms*/	 		
		
		OUTPUT_IR = 0;

		vaule <<= 1;   /*低位开始传输*/
		 }

}


void send_ir(unsigned char code_value)
{

#if 0
	uchar i = 0xCC,j = 0;
	EA = 0;

//	if(reversal_ir)
//		i |= 0x20;
	for(j = 0;j<6;j++)
		{
		if(i & 0x80)
			{
			OUTPUT_IR = 1;
			}
		else
			{
			OUTPUT_IR = 0;
			}
		delay_889us();
		i <<= 1;
		OUTPUT_IR = ~OUTPUT_IR;
		delay_889us();
		}
	i = (uchar)(code_value);
	for(j = 0;j<8;j++)
		{
		if(i & 0x80)
			{
			OUTPUT_IR = 1;
			}
		else
			{
			OUTPUT_IR = 0;
			}
		delay_889us();
		i <<= 1;
		OUTPUT_IR = ~OUTPUT_IR;
		delay_889us();
		}
//	reversal_ir = ~reversal_ir;
	OUTPUT_IR = 1;
	EA = 1;
      
    #else
	  {
	    
		EA = 0;
             OUTPUT_IR = 0;
		delay(520);/*9ms    10 us*//*0.173ms*/
             OUTPUT_IR = 1;		
		#ifdef IRREP
              if(repeat_flag == 1)
              	{
			delay(130);/*2.25ms    10 us*//*0.173ms*/	               	
			OUTPUT_IR = 0;
			delay(30);/*0.565ms    10 us*//*0.173ms	 */	 	
			OUTPUT_IR = 1;
			repeat_flag =0 ;	
			EA = 1;
			return;
              	}
             #endif
		delay(260);/*4.5ms    10 us*//*0.173ms*/	 
	      OUTPUT_IR = 0;

		 Nec_send_vaule(0xff);
		 Nec_send_vaule(0x00);
		 //code_value = ~code_value;
		 Nec_send_vaule(code_value);
		 code_value = ~code_value;
		 Nec_send_vaule(code_value);
		 
	      delay(30);/*0.565ms    10 us*//*0.173ms	 */	 	
		OUTPUT_IR = 1;
		delay(100);/*1.69ms    10 us  停止位!!!!*//*0.173ms*/
		OUTPUT_IR = 0;
	       delay(30);/*0.565ms    10 us*//*0.173ms	 */	 	
		OUTPUT_IR = 1;
		EA = 1;
	   }
	#endif
}

⌨️ 快捷键说明

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