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

📄 telecontrol.c

📁 单片机I2C和遥控器程序.支持通用遥控器!
💻 C
字号:
#include  <reg52.h>
#include  "INITIAL.H"
#include  "SYS_FUN.H"
#include  "KEY.H"
#include  "OSD_MENU.H"
#include  "TELECONTROL.H"

_TeleCon    TeleCon;

/////////////////////////////////////////////////
void  InitialExternInterrupt(void)
{
   TeleCon.mOver=0;
   TeleCon.mKeyValue = IR_N0_CODER;
   TeleCon.mInterruptTimes=0;

   TeleCon.mSendCount=0;
   TeleCon.mBitStart=0;
}
////////////////////////////////////////////////////
void  InterruptTime1(void) interrupt 3
{
     TL1=0;
	 TH1=0;
}

////////////////////////////////////////////////////////
void IsrInterrupt(void) interrupt  0 
{
    if(TeleCon.mBitStart==0)
    {
         TH1=0; TL1=0;
		 TR1=1;
		 TeleCon.mtemp=0;
         while(TeleCon.mtemp==0)
         {
            TeleCon.mtemp=P3;
            TeleCon.mtemp&=0x04;
         }
         TR1=0;
         TeleCon.mPulse=TH1;
         TeleCon.mPulse<<=8;
         TeleCon.mPulse+=TL1;

         TH1=0; TL1=0;
         if(TeleCon.mPulse>8000)
          TeleCon.mBitStart=1;
    }
    else
    {
        TeleCon.mInterruptTimes++;
	    if(TeleCon.mInterruptTimes==1)
	    {
           TH1=0; TL1=0;
	       TR1=1;
	       TeleCon.mBitValue=0;
	    }
	    if(TeleCon.mInterruptTimes>1&&TeleCon.mInterruptTimes<=33)
	    {
	       TR1=0;
           TeleCon.mPulse=TH1;
           TeleCon.mPulse<<=8;
	       TeleCon.mPulse+=TL1;
	       TH1=0;  TL1=0;
	       TR1=1;
          
           TeleCon.mBitValue<<=1;
	       if(TeleCon.mPulse>1450)
	          TeleCon.mBitValue+=1;
            
          if(TeleCon.mInterruptTimes==33)
	      {
	         TR1=0; TH1=0; TL1=0;	
             TeleCon.mOver=1;
             EX0=0;
	      }
        }
   }
   IT0=1;
}
////////////////////////////////////////////////////////////////////////////////////
BYTE  TeleHandleData(void)
{
    BYTE temp;

    TeleCon.mResult[3]=TeleCon.mBitValue;
	TeleCon.mResult[2]=TeleCon.mBitValue>>8;
	TeleCon.mResult[1]=TeleCon.mBitValue>>16;
	TeleCon.mResult[0]=TeleCon.mBitValue>>24;

    temp=TeleCon.mResult[3];
    temp=~temp;

    if(temp!=TeleCon.mResult[2])
	{
	   TeleCon.mKeyValue=IR_N0_CODER;
	   return 0;
	}
	else
	{
	   TeleCon.mKeyValue=TeleCon.mResult[2];
	   return 1;
	}
}
//////////////////////////////////////////////////////////////////////////////
void  PanelOSDHandle(void)
{
      switch(TeleCon.mKeyValue)
	  {
 		  case IR_POWER: 
			   IRPowerHandle();	     
			   break;
		  case IR_MENU:
               KeyMenuHandle();
			   break;
		  case IR_UP: 
		       KeyUpHandle();
			   break;
		  case IR_DOWN:
 		       KeyDownHandle();
			   break;
          case IR_LEFT:
		       KeyLeftHandle();
               break;
          case IR_RIGHT:
		       KeyRightHandle();
               break;
		  case IR_VIDEO_SELECT:
 		       IRChannelSelectHandle();
			   break;
		  case IR_ENTER:
		       KeyEnterHandle();
               break;
          case IR_EXIT:
               KeyExitHandle();
               break;
		  default:break;
 	 }
}

////////////////////////////////////////////////////////////////////////////////////////////////////
void  TeleControlHandle(void)
{
   if(TeleCon.mOver)
   {
      if(TeleHandleData()&&TeleCon.mKeyValue!=IR_OSD_CHANGE)
      {
	     if(TeleCon.mPanelOSDFlag==DECODE_OSD)
            SendTeleHandle();
		 else
		    PanelOSDHandle();
	  }
	  if(TeleCon.mKeyValue==IR_OSD_CHANGE)
	  {
	     if(Glogal.mSignalMode==_LibSignalMode)
		 {
	       if(TeleCon.mPanelOSDFlag==DECODE_OSD)
		     TeleCon.mPanelOSDFlag=PANEL_OSD;
		   else
		     TeleCon.mPanelOSDFlag=DECODE_OSD;
		   DisplayOSDChange();
		 }
	  }
     DelayXms(100);	
	 TeleCon.mOver=0;
	 TeleCon.mInterruptTimes=0;
	 TeleCon.mBitValue=0;
     TeleCon.mBitStart=0;
     EX0=1;
   }
}

//////////////////////////////////////////////////////////////////////////////////////////
/*
    以下为遥控器按键向外发送出去子程序
/////////////////////////////////////////////////////////////////////////////////////////*/
void  SendTeleHandle(void)
{
     BYTE  i,j;
	 BYTE   Resend; 

     EX0=0;
     IR_OUT=IR_OUT_HIGH;
	 TeleCon.mSendCount=0;

	 TH1=0;TL1=0;
	 TR1=1;
     while(TeleCon.mSendCount<9000)
     {
        IR_OUT=IR_OUT_LOW;
		TeleCon.mSendCount=TH1;
		TeleCon.mSendCount<<=8;
		TeleCon.mSendCount+=TL1;
     }
     TeleCon.mSendCount=0;
	 TH1=0;TL1=0;
     while(TeleCon.mSendCount<4500)
     {
        IR_OUT=IR_OUT_HIGH;
		TeleCon.mSendCount=TH1;
		TeleCon.mSendCount<<=8;
		TeleCon.mSendCount+=TL1;
     }
	 for(i=0;i<4;i++)
	 {
	   for(j=0;j<8;j++)
	   {
	      TeleCon.mSendCount=0;
	      IR_OUT=IR_OUT_LOW;
		  TH1=0;TL1=0;
		  while(TeleCon.mSendCount<560)
		  {
		  	 TeleCon.mSendCount=TH1;
		     TeleCon.mSendCount<<=8;
		     TeleCon.mSendCount+=TL1;
		  }
		  Resend=TeleCon.mResult[i]&0x80;
		  TeleCon.mSendCount=0;
		  IR_OUT=IR_OUT_HIGH;
          TH1=0;TL1=0;
          if(Resend==0)
		  {
             while(TeleCon.mSendCount<560)
		     {
		        IR_OUT=IR_OUT_HIGH;
			    TeleCon.mSendCount=TH1;
		        TeleCon.mSendCount<<=8;
		        TeleCon.mSendCount+=TL1;
		     }
		  }
		  else
		  {
		     while(TeleCon.mSendCount<1600)
		     {
		         IR_OUT=IR_OUT_HIGH;
				 TeleCon.mSendCount=TH1;
		         TeleCon.mSendCount<<=8;
		         TeleCon.mSendCount+=TL1;
		     }
		  }
		  TeleCon.mResult[i]<<=1;
		}
       
	 }
	 TeleCon.mSendCount=0;
	 TH1=0;TL1=0;
	 while(TeleCon.mSendCount<560)
	 {
	    IR_OUT=IR_OUT_LOW;
		TeleCon.mSendCount=TH1;
		TeleCon.mSendCount<<=8;
		TeleCon.mSendCount+=TL1;
	 }
	 IR_OUT=IR_OUT_HIGH;
	 TR1=0;
	 TH1=0;TL1=0;
//	 EX0=1;
}

⌨️ 快捷键说明

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