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

📄 main.c

📁 电源控制,NEC遥控IR接受,和IR模拟发送代码,
💻 C
字号:

#include    <reg52.h>
#include    <stdio.h>
#include    <stdlib.h>
#include    "I2C.h"
#include    "common.h"
#include    "define.h"
#include    "delay.h"
#include    "ir.h"
#include    "KeyMap.h"

void VideoSet(uchar x);
void MpegReset(void);
void CpuInit(void);
void Mute(bool _onoff);	
void ScanPanelKey(void);
void HandleKey(void);
void KeyWait(uint Tcnt,uchar keyval);
void WaitDvdPwrDown(void);
uchar TwoSecondCnt=0;
enum system_Status
         {
           DVD,
	    AVIN,   	
	    AVIN1,
	    AVIN2,
	    AVIN3
          }SystemInputStatus;

enum video
         {
           VIDEO1,
	    VIDEO2,
	    VIDEO3,
	    VIDEO4
         }VideoStatus;	   	

bit      SimulateIRStatus;	
bit      MuteStatus;
bit      PLScanStatus;
bit      StandbyStatus;
uchar RmtRevStatus;
uchar _bIRKey;
uchar RptKeyTimer;
uchar idata RmtData[4];
#ifdef USE_STCMCU_EEPROM
uchar accLastMemoryFlag=0;
uchar accLastMemoryFlag1=0;
#endif
main( )
{
    Mute(MUTEON);  
    RstMpegIo=0;
    PowerIo=PowerOff;
    PowerOutIo=PWROUTOFF;
    SystemInputStatus=DVD;
    StandbyStatus=IsStandby;   
    CpuInit();
#ifdef POWER_LAST_MEMORY
     accLastMemoryFlag=Stc89x_byte_read(ACCADDRESS);
     Delay100us();
     accLastMemoryFlag1=Stc89x_byte_read(ACCADDRESS1);
#endif		
    while(1)
    {       
        ScanPanelKey( );      
	 HandleKey();	 
     }       
}

void VideoSet(uchar x)
{
   switch(x)
   {
      case DVD:
              AVCtrlAIo=0;
  	  	AVCtrlBIo=0;
	  	break;
      case AVIN:
              AVCtrlAIo=0;	  	
	  	AVCtrlBIo=1;
	  	break;	  	
      case AVIN1:
              AVCtrlAIo=0;	  	
	  	AVCtrlBIo=1;
	  	break;
      case AVIN2:
              AVCtrlAIo=1;	  	
	  	AVCtrlBIo=0;
	  	break;		
    }
}
#define ANDKEY  0x03
#define PORTX    P1
void ScanPanelKey(void)
{ 
 uchar Temp1,Temp2; 
  if((_bIRKey!=IR_NONE)||((PLScanStatus==NotAllowScan)))return;
   PLScanStatus=NotAllowScan; 
#ifdef POWER_LAST_MEMORY  
   if((accLastMemoryFlag||accLastMemoryFlag1)&&MasterPwrChkIo==MasterPwrOn&&StandbyStatus==IsStandby)
   {      
       _bIRKey=IR_ACC_POWER;     
       return;
   }
#endif     
   if(MasterPwrChkIo==MasterPwrOff&&StandbyStatus==IsNotStandby)
   {      
       _bIRKey=IR_ACC_POWER;     
       return;
   }
   Temp1=PORTX&ANDKEY;
    if((MasterPwrChkIo==MasterPwrOn)&&(Temp1==ANDKEY))return;
   Delay25ms(1);
   Temp2=PORTX&ANDKEY;  
   if((MasterPwrChkIo==MasterPwrOn)&&(Temp1!=Temp2))return;  
   switch(Temp2)
   {
     case 0x01://power 
              _bIRKey=IR_PNL_POWER;
		KeyWait(250,Temp2);//250ms
	 	break;
     case 0x02://eject     
	 	_bIRKey=IR_PNL_EJECT;
		KeyWait(250,Temp2);//250ms
	 	break;
#ifndef  OnlyPanelKey 		
     case 0x6F://next
	 	_bIRKey=IR_PNL_NEXT;
		KeyWait(250,Temp2);//250ms		
	 	break;
     case 0x77://pre
	 	_bIRKey=IR_PNL_PREV;
		KeyWait(250,Temp2);//250ms
	 	break;
     case 0x7B://src
	 	_bIRKey=IR_PNL_AV_IN;
	 	break;
     case 0x7D://stop
	 	_bIRKey=IR_PNL_STOP;
		KeyWait(250,Temp2);//250ms
	 	break;
     case 0x7E://play
	 	_bIRKey=IR_PNL_PLAY_PAUSE;
		KeyWait(1000,Temp2);//1000ms
	 	break;	
#endif		
     default:
    	       _bIRKey=IR_NONE;
   }   
}
void KeyWait(uint Tcnt,uchar keyval)
{
    uchar Tmp1;
#ifdef STC12C2052
   Tcnt*=10*10;
#endif
#ifdef STC89C52
   Tcnt*=10;
#endif
    while(Tcnt--)		
    {     
       Tmp1=PORTX&ANDKEY;
     	if(Tmp1!=keyval)break;
	Delay100us();
    }
}
void HandleKey(void)
{
#if (defined(VEBAIRKEY)||defined(VEBAIRKEY48)||defined(BOAIRKEY)||defined(MD10IRKEY))
   if(_bIRKey>MAXKEY)return;
   _bIRKey=KeyMap[_bIRKey];
#endif 
   if(_bIRKey==IR_NONE)return;
   EX0=0;
   TR0=0;
   switch(_bIRKey)
   {    
      case IR_AV_IN://av_in key       		 
               Mute(MUTEON); 	
 	        Delay25ms(4);
               switch(SystemInputStatus)
               {
                  case DVD:  
                          SimulateIRSendKey(IR_POWER); 		  	     
		  	     VideoSet(AVIN); 			     
			     Delay25ms(40);
			     Mute(MUTEOFF);
			     WaitDvdPwrDown();	
                          SystemInputStatus=AVIN1;
                          RstMpegIo=0;    
                          break;                 
                 case AVIN:
                          SystemInputStatus=DVD;
 			     MpegReset();//reset mpeg				
                          StandbyStatus=IsNotStandby;   
			     VideoSet(DVD); 	
		 	     Delay25ms(40);
    	   	            Mute(MUTEOFF);
			     Delay25ms(20);
		 	     break;
                 default:
                         SystemInputStatus=DVD;    // anti disturb                       
               }      
               break; 		 
     case IR_MUTE:
              if(SystemInputStatus==DVD)
              {
                 SimulateIRSendKey(IR_MUTE);  
		   break;
              }		 	
              if(MuteStatus==IsMute)
              {                    
                 Mute(MUTEOFF);
              }
              else
              {                           
                 Mute(MUTEON);
              }
	       break;
      case IR_POWER://power down              
              if(StandbyStatus==IsStandby)
              {
                 MasterPwrChkIo=1;
                 if(MasterPwrChkIo==MasterPwrOn)//check master power 
                 { 
                     Mute(MUTEON);
			Delay25ms(2);///50ms
                     PowerIo=PowerOn;
			PowerOutIo=PWROUTON;
                     Delay25ms(2);///50ms
                     VideoSet(DVD); 
			MpegReset(); 
			Delay25ms(80);///1s
#ifdef POWER_LAST_MEMORY
	              accLastMemoryFlag=0;
	              Stc89x_sector_erase(ACCADDRESS);
	              Delay25ms(1);
      	              Stc89x_byte_write(ACCADDRESS,accLastMemoryFlag);
    	              accLastMemoryFlag1=0;
	              Stc89x_sector_erase(ACCADDRESS1);
	              Delay25ms(1);
      	              Stc89x_byte_write(ACCADDRESS1,accLastMemoryFlag1);
#endif				
                     StandbyStatus=IsNotStandby;
                     SystemInputStatus=DVD;
		       Mute(MUTEOFF);
                 }
              }
              else
              {             	 
                 Mute(MUTEON);
#ifdef POWER_LAST_MEMORY 
                 accLastMemoryFlag=0;
                 accLastMemoryFlag1=0;
                 if(MasterPwrChkIo==MasterPwrOff)
	          {
	             accLastMemoryFlag=1;		     
		      accLastMemoryFlag1=1;		     
                 }
	          Stc89x_sector_erase(ACCADDRESS);
	          Delay25ms(1);
      	          Stc89x_byte_write(ACCADDRESS,accLastMemoryFlag);
	          Stc89x_sector_erase(ACCADDRESS1);
	          Delay25ms(1);
      	          Stc89x_byte_write(ACCADDRESS1,accLastMemoryFlag1);				   					   	
#endif				 
		   if(SystemInputStatus==DVD)
		   {
		      SimulateIRSendKey(IR_POWER); 
		      WaitDvdPwrDown();//about x seconds 
		   }	
		   else
		   {
		      VideoSet(DVD); 
		   }
		   Delay25ms(40);//about x seconds
                 StandbyStatus=IsStandby;                 
                 RstMpegIo=0;  
                 PowerIo=PowerOff;
		   PowerOutIo=PWROUTOFF;
		   Delay25ms(40);//about x seconds
              }             
              break;  
    case IR_USB:
	 	SimulateIRSendKey(IR_USB);
		Delay25ms(120);
	 	break;
    case IR_VOLADD:                    
    case IR_VOLDEC:                       
             Mute(MUTEOFF);
    default: 
	      SimulateIRSendKey(_bIRKey); 
             Delay25ms(4);               
             break;
   }  
  _bIRKey=IR_NONE;
   EX0=1;
   TR0=1;
}

void CpuInit(void)
{ 
#if 1
 PX0=1;     
 PX1=1;	    
 PT0=0;     
 PT1=0;     
 //PT2=0;     
            
 //TMOD=0x21; 
 TMOD=0x11; 
 
 //EXEN2 =0;  
 //C_T2  =0;  
 //CP_RL2=1;  
 //TH2   =TIMER2TH;		
 //TL2   =TIMER2TL;   
 
 TH0 = TIMER0TH;    
 TL0 = TIMER0TL;
		
 IT0=1;//Trigged by up to down    --------|_____
 IT1=1;

 EX0=1;
 EX1=0;
 
 ET0=1;
 ET1=1; 
 //ET2=1;
 
 
 //ES=1;          /*开串口中断*/ 
 //SCON=0x50;/* 串行口工作在方式3 */   
 //PCON=0x80;  //PCON = PCON & 0x7f;/* SMOD=0 */
 TH1 =TIMER1TH;  /*计数常数0xff,波特率:115200 晶振:12MHz  */  
 TL1 =TIMER1TL;     
													
 TR0=1;  
 TR1=1;  
 //TR2=1;  
 
 IE1=0;   
 EA=1;	 
#endif

}     

void MpegReset(void)
{
    RstMpegIo=0;
    Delay25ms(2);                    
    RstMpegIo=1;    
}



void Mute(bool _onoff)
{
   if(_onoff)
   {
      MuteStatus=IsMute;		
      MuteIo=MUTEON;	  
   }
   else
   {
     MuteStatus=IsNotMute;
     MuteIo=MUTEOFF;	
   }
}
void WaitDvdPwrDown(void)
{
   TwoSecondCnt=0;
   while(TwoSecondCnt<=XSECOND)
   {
      if(DVDPDownIo==HIGH)
      {
	  Delay25ms(2);
	  if(DVDPDownIo==HIGH)break;
      }
   }
}

⌨️ 快捷键说明

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