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

📄 ir.c

📁 8051单片机的LCDTV用户界面程序
💻 C
字号:


//-------------------------------
//IR receive program for MXIC demo board:
//2 interrupt were occupy for IR receive
//1: timmer 1 interrupt
//2: external interrupt 1
//
//-------------------------------
//typedef		unsigned char 	BYTE;
typedef		unsigned int 	UINT;
typedef		unsigned long 	ULONG;
//typedef		unsigned char 	BYTE;

//#include "reg52.h"
//#include "public2.h"
//#include <stdio.h>					/* define I/O functions */

#include "mxREG52.H"
//#include "Define.H"
#include "Mxic_IR.h"
//#include ".\inc\ir_var.h"

void InitialTimer1(void);   //for IR period count 
void InitialEx1Int(void);   //check edge

bit CheckIrRepeatCode1(void);
extern BYTE GetIrCodeData(void);
extern BYTE GetIrIDData(void);

extern int	T0_0Interval;
bit CheckIrCommand(void);
bit CheckIrRepeatCode(void);
bit CheckIrRepeatCode1(void);
//------------------------------------
//------------------------------------
//sbit	testpin=P2^0;
//sbit	testpin_1=P2^1;
//------------------------------------
union FLAME{
	struct IR_ID{
	//UINT 	ID;  
	BYTE	ID0;
	BYTE	ID1;
   	BYTE	Code0;
	BYTE	Code1;
	}Mcode;
	
	ULONG	Code;
}Ir;

BYTE	IrCount;//count1;
//UINT	RemoteControllerID=0x0099;   //for Mintek

union RM_ID{
	struct REMOTE_ID{
	BYTE	MfgId;
    	BYTE	DeviceId;
	}Idx;
	
	UINT Code;
}RmId;
//------------------------------------
//------------------------------------
bit		FirstEdge;
bit		LeadCode;  //9ms_______-----4.2ms 
//------------------------------------
//------------------------------------
bit EnableIr(void)
{
	DisableIr();   //disable first
	if ( MxicIr.Bits.b1IrOn == 0 )
		{
	 	InitialTimer1();  //for time cnt
	 	InitialEx1Int();  //
	 	//IrOn=1;
	 	MxicIr.Bits.b1IrOn=1;
	 	MxicIr.Bits.b1GetIrFlame=0;
	 	MxicIr.Bits.b1GetIrRepeatCode=0;
	 	MxicIr.Bits.b1GetIrCommand=0;

	 	//initial IR parameters
	 	LeadCode=0;
	 	FirstEdge=0; //start wait IR cycle
 		}
	
	return( MxicIr.Bits.b1IrOn );
}

//------------------------------------
bit DisableIr(void)
{
	if ( MxicIr.Bits.b1IrOn == 1 )
		{
		MxicIr.Bits.b1IrOn=0;
		//for ext_int_1:
		EX1=0;  //disable Ext_INT_1;

		//for timer_int_1
		ET1=0;  //disable Timer_INT_1;
		TR1=0;  //stop counting
		TH1=0;TL1=0;  //clear timer cnt;
//	//clear Ir parameters
		}
	return(MxicIr.Bits.b1IrOn);
}

/*
//------------------------------------
bit CheckIrRepeatCode(void)
{
	if ( MxicIr.Bits.b1GetIrRepeatCode )
	{
//		MxicIr.Bits.b1GetIrRepeatCode=0;
		return(1);
	}
	else
		return(0);
//	return( MxicIr.Bits.b1GetIrRepeatCode );
}

bit CheckIrRepeatCode1(void)
{
	if ( MxicIr.Bits.b1GetIrRepeatCode )
	{
		MxicIr.Bits.b1GetIrRepeatCode=0;
		return(1);
	}
	else
		return(0);
//	return( MxicIr.Bits.b1GetIrRepeatCode );
}
*/
//------------------------------------
BYTE GetIrCodeData(void)
{
	if ( MxicIr.Bits.b1GetIrFlame == 1 )
		{
		return(Ir.Mcode.Code0);
 		}
	return(0xff);
}

BYTE GetIrIDData(void)
{
	if ( MxicIr.Bits.b1GetIrFlame == 1 )
		{
		return(Ir.Mcode.ID1);
		}
	return(0xff);
}

//------------------------------------
//------------------------------------
//timer 1 interrupt rate:
//T=12/14.318M=0.838us
//interrupt rate=0.838us * 65536 = 55ms
//-----------------------------
void InitialTimer1(void)   //for IR sampling 
{

	TF1=1;
	TR1=0;  //not start counting
	ET1=1;  //enable Timer_int_1
	TMOD= 0x11;  //timer1 mod=1 -> 16bits time count 
	TH1=0;
	TL1=0;
	//PT1=0; //low priority
}
//------------------------------------
//------------------------------------
void InitialEx1Int(void)
{
	EX1=1;  //enable external int 1
	IT1=1;  //negative trigger interrupt 
	EA=1;   //enable all int
}
//------------------------------------
//
//------------------------------------
void timer1_int( void ) interrupt 3   //about 55ms interrupt
{
	if ( LeadCode == 1 )
		{
		MxicIr.Bits.b1GetIrRepeatCode=1;
		MxicIr.Bits.b1GetIrFlame = 1;
		LeadCode=0;
		}
	else
		{  
		if(MxicIr.Bits.b1GetIrFlame==1)
		MxicIr.Bits.b1GetIrFlame = 0;
		MxicIr.Bits.b1GetIrRepeatCode=0;
		MxicIr.Bits.b1GetIrCommand=0;
		TR1=0;
		}

	FirstEdge=0;  //start wait next cycle
//	TR1=0;     //stop counting
	TH1=0;TL1=0;
}
//------------------------------------
// check timer_1 counter in EX_1 interrupt 
//------------------------------------
void Ex1_int( void ) interrupt 2 
{   
	union Counter
		{
		struct Int1Cnt
			{
			BYTE 	HiCnt;
			BYTE	LoCnt;
			}Cnt;
		
			UINT	Timer;
		}T1;

	if ( FirstEdge == 0 )
		{
		FirstEdge=1;
		TH1=0;TL1=0;
		TR1=1;   //start counting 
		}
	else
		{
		T1.Cnt.HiCnt=TH1;
		T1.Cnt.LoCnt=TL1;
		if ( LeadCode == 0) 
 	    		{	
		  	if ( (MxicIr.Bits.b1GetIrFlame == 0)&&(T1.Timer < _LEAD_UPPER) && (T1.Timer > _LEAD_LOWER))
			//   ((MxicIr.Bits.b1GetIrFlame == 1)&&(T1.Timer > _REPEAT_LOWER)&&( T1.Timer < _REPEAT_UPPER)) )
		  		{
				LeadCode=1;
				IrCount=0;	
		  		}
	    		}
		else  //LeadCode ==1 
  	    		{
			if(( T1.Timer > _IR_0_LOWER ) && ( T1.Timer < _IR_0_UPPER ))
				{  
		   		Ir.Code=(Ir.Code << 1)|0x01;
				IrCount++;
				}
			else 
				if(( T1.Timer > _IR_1_LOWER ) && ( T1.Timer < _IR_1_UPPER ))
					{   //got IR logical "1" signal
					Ir.Code = Ir.Code << 1;
					IrCount++;
					}
				else
					{  //Ir Receive fail condition
					IrCount=IrCount;   //for debug only
					}
				
			if ( IrCount >=32 )
				{   
				MxicIr.Bits.b1GetIrFlame=1;
				MxicIr.Bits.b1GetIrCommand=1;
				FirstEdge=0;    //start wait next cycle
				TR1=1; 			//starting counting
				LeadCode=0;
				}
		}
	}
	TH1=0;TL1=0;
	
}




/*BYTE IrFunction(void)
{
   BYTE i;
  
   bit IrRepeat;
   BYTE GetIr,backupir;//,BakIr
//BYTE val_str[3];


      
//	IrVaild=CheckIrFlame();
      //  Value_ASCII(GetIrCodeData(), val_str, 0);
//		OSD_ShowTitle(val_str, 3);
	
			switch(GetIrCodeData())
			{
			 case 0x5f:
	//		  SHDN_L5V=1;
			  GetIr=MENU;
			  break;
			   case 0xb7:
			  GetIr=MODE_DEC;
	//		  SHDN_L5V=1;
			  break;
			   case 0x9F:
			  GetIr=UP;
			  break;
			    case 0xDF:
			  GetIr=DOWN;
			  break;
			   case 0xef:
			  GetIr=MODE_DEC;
			  break;
			   case 0x8f:
			  GetIr=ENTER;
			  break;
			   case 0x87:
			   GetIr=POWER;
			  break;
               case 0xA7:
			   GetIr=IRMUTE;
			  break;
              case 0xBF:
			   GetIr=IRUP;
			  break;
			  case 0x1F:
			   GetIr=VOLUMADD;
			  break;
			  case 0xAF:
			   GetIr=VOLUMSUB;
			  break;
			  case 0x6F:
			   GetIr=UPDOWN;
			  break;
			  case 0x07:
			   GetIr=LEFTRIGHT;
			  break;
			  case 0xCF:
			   GetIr=CALL;
			  break;
			  case 0x4F:
			   GetIr=DISPLAYSIZE;
			  break;
              default:
              GetIr=0x00;
              break;
               
			 }
			 if(GetIr!=0x00)
			  	for (i=0; i!=0x0f; i++)
	            	{
	             	T0_0Interval = 500;				//reset the Timer interval 10sec.
		           	}
		  	IrRepeat=CheckIrRepeatCode();
           if(IrRepeat)
	     	   {
			  
	     	   GetIr=backupir;
		        }
		  
           backupir=GetIr;
//		   	 MxicIr.Bits.b1GetIrFlame = 0;	
       for(i=0;i<125;i++)
	       DELAY(20);	 			 			 			 			 			 
		
return(GetIr);
}
*/
//------------------------------------
//------------------------------------





⌨️ 快捷键说明

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