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

📄 main.c

📁 用51单片机实现IR解码
💻 C
字号:
/**********************************************************************
*File		Name		:	Main.c
*Creat		Time		:	2002/02/11
*Program	Author		:	mqli
*File		Discreption	:		 
************************************************************************/
#include "common.h"
#include "var.h"
#include "main.h"
#include "key.h"
#include "Keyboard.h"
#include "Eeprom.h"

#include "lcd.h"

#include "Int.h"


void main(void)
{


	Init_51MCU();
	Init_all_Hardware();
	Init_Run_VAR();
	Init_System();

	EA = 1;


	while(1)
		{
		
		
			Process_KeyPress();
			Process_Message();
			Process_Delay_Event();
	
			
		}


}

U8 System_Main_Volume=50;
BOOL System_Play_Pause_State=0;
BOOL Beeper_On=0;
void 	Process_KeyPress(void)
{

	    if(Key_Code==0xFF) return;

           
		   if(System_Flag_Being_Scrolling)
		   	
		   	{
  
			Stop_Scroll_LCD_String();
			Normal_Dispaly();

		   	}
		   if(System_Flag_Temp_DisplaY)
		   	{
		   	System_Flag_Temp_DisplaY=0;
			Normal_Dispaly();

		   	}
		 

           switch(Key_Code)
       	{
       	        case 2:
					Beeper_On^=1;
					if(Beeper_On)
						{
						P3_4=1;
							Display_Temp_String("Beep ON");
						}
					else
						{
						P3_4=0;
							Display_Temp_String("Beep OFF");
						}
		  			 break;
			case 44:
				       if(IR_Key_Be_Hold_Key)
				 	      Start_Scrolling_Text("Get PLAY key holding");
					else
						{
						
						System_Play_Pause_State^=1;
						if(System_Play_Pause_State)
						      Display_Temp_String("  PLAY  ");
						else
							Display_Temp_String("  PAUSE  ");
						}
				 	break;
	             case 49:
				 	if(IR_Key_Be_Hold_Key)
				 	Start_Scrolling_Text("Get Stop key holding");
					else
						Display_Temp_String("  STOP  ");
				 	break;
			case 32:
				       if(IR_Key_Be_Hold_Key)
				     Start_Scrolling_Text("Get NEXT key holding");
					 else
						Display_Temp_String("  NEXT  ");
				 	break;
			case 16: //volume up
			          System_Main_Volume++;
					  if(System_Main_Volume>=100)
					  	System_Main_Volume=100;
					    Display_Temp_String("VOL        ");
					LCD_Display_Char(4, System_Main_Volume/100+'0');
					   LCD_Display_Char(5, System_Main_Volume/10%10+'0');
					       LCD_Display_Char(6, System_Main_Volume%10+'0');
			         break;
			case 17:
				if( System_Main_Volume)
				 System_Main_Volume--;
				  Display_Temp_String("VOL        ");
					LCD_Display_Char(4, System_Main_Volume/100+'0');
					   LCD_Display_Char(5, System_Main_Volume/10%10+'0');
					       LCD_Display_Char(6, System_Main_Volume%10+'0');
					
				break;
	                 
	              case	KEY_FP_MUTE:            //							0x49,
	              case     78:
				  	Mute_Key_Process();
					if(System_Flag_MuteState)
	             			  Display_Temp_String(" MUTE ");
					else
						  Display_Temp_String("MUTE CANCEL");
	             			 break;
	              case	KEY_FP_PREVIOUS:            //						0x41,
			
					   
					  Display_Temp_String(" PREVIOUS ");
					break;
		
			
			
			case	KEY_FP_TRACK_DOWN:            //					0x4B,
				           
					  Display_Temp_String(" TRACK DOWN");
					break;

			
			case	KEY_FP_SEEK_UP:            //					0x4B,
			
			              Display_Temp_String(" SEEK UP ");
					break;
	              case	KEY_IR_STEREO:            //							0x07,
	             	     default  :      
       
				
						       	{

									switch(Key_Code_Mode)
										{
									case PHILIPS_IR_KEY_MODE_DVD:
										  Display_Temp_String("DVD  ");
								                     break;
									case PHILIPS_IR_KEY_MODE_DVD_R:
										  Display_Temp_String("DVR  ");
								                     break;
									case PHILIPS_IR_KEY_MODE_DVD_R1:
										  Display_Temp_String("DVR1  ");
								                     break;
									case PHILIPS_IR_KEY_MODE_HDR:
											  Display_Temp_String("HDR  ");
								                     break;
									default:
										  Display_Temp_String("        ");
											    LCD_Display_Char(0, 'M');
											LCD_Display_Char(1, Key_Code_Mode/100+'0');
								                       LCD_Display_Char(2, Key_Code_Mode/10%10+'0');
								                        LCD_Display_Char(3, Key_Code_Mode%10+'0');
								                     break;
										}

								  LCD_Display_Char(5, Key_Code/100+'0');
								 LCD_Display_Char(6, Key_Code/10%10+'0');
								  LCD_Display_Char(7, Key_Code%10+'0');
						       	}
						            	          	
	             			 break;
			
			               
			case	INVALID_KEY:            //							              0xFF
                  
					 break;
                                
       	}
	Key_Code=INVALID_KEY;
	Key_Code_Mode=INVALID_KEY;
         IR_Key_Be_Hold_Key=0;
}


void Process_Message(void)
{
          Get_Keyboard_Key();
		  
		if(System_Flag_Power_State==OFF)
			return;
      
	
	
}



void Process_Delay_Event(void)
{

     Update_LCD_Display();
	     

        if(System_Flag_Being_Scrolling)
        	{
        	  if(Timer_for_Sytem_Display>SCROLL_TEXT_TIME_INTERVEL_X3mS)
        	    {
        	   Timer_for_Sytem_Display=0;
        	    Scrolling_Chars();
			
				
        	    }

        	}
	if(System_Flag_RTC_Update==TRUE)
		{
		U8 RTC_String[8];
			System_RTC_Second++;
			
			if(System_RTC_Second==60)
			{
			      System_RTC_Second=0;
				System_RTC_Minute++;
				if(System_RTC_Minute==60)
				{
					System_RTC_Minute=0;
					 System_RTC_Hour++;
					if(System_RTC_Hour==24)
						System_RTC_Hour=0;

				}

			}
			System_Flag_RTC_Update=FALSE;

			    if(System_Flag_Temp_DisplaY==0
				&&System_Flag_Being_Scrolling==0)
				{
						LCD_Display_String(0,"        ");
						RTC_String[0]=System_RTC_Hour/10+'0';
						RTC_String[1]=System_RTC_Hour%10+'0';
						RTC_String[2]=System_RTC_Minute/10+'0';
						RTC_String[3]=System_RTC_Minute%10+'0';
						LCD_Icon_Display_Control(SEG_P5,ON);
						LCD_Icon_Display_Control(SEG_P8,ON);
						LCD_Icon_Display_Control(SEG_P3,ON);
						RTC_String[4]=System_RTC_Second/10+'0';
						RTC_String[5]=System_RTC_Second%10+'0';
						RTC_String[6]='\0';
						LCD_Display_String(1,RTC_String);
				}
		}

    if(Timer_for_Refresh_LCD_Display>=50)//250)
    	{
         	System_Flag_RTC_Update=TRUE;
		
    	    Timer_for_Refresh_LCD_Display=0;
      	    System_Confirm_Refresh_LCD_Counter++;
	    System_Confirm_Refresh_LCD_Counter%=3;

	   switch(System_Confirm_Refresh_LCD_Counter)
	   	{
	  
		   case 0:
				for(LCD_Refresh_Poniter=0;LCD_Refresh_Poniter<5;LCD_Refresh_Poniter++)
			             {      
			            		
					  	 Refresh_LCD_One_Byte(LCD_Refresh_Poniter);

			    	  	}

			       break;
	  
		 case 1:
		 	
				for(LCD_Refresh_Poniter=5;LCD_Refresh_Poniter<10;LCD_Refresh_Poniter++)
		             {      
		            		
				  	 Refresh_LCD_One_Byte(LCD_Refresh_Poniter);

		    	  	}
				
				break;

		case 2:
			      for(LCD_Refresh_Poniter=10;LCD_Refresh_Poniter<16;LCD_Refresh_Poniter++)
		             {      
		            		
				  	 Refresh_LCD_One_Byte(LCD_Refresh_Poniter);

		    	  	}
				  
				break;
		
	  }


	}
			

        if(System_Flag_DispEvent)
	{
		
				Display_Number(Monitor);
			System_Flag_DispEvent=0;

        	}
        
      
         if(System_Flag_Temp_DisplaY)
         	{

			
         	  if(Timer_for_Sytem_Display>250)//TEMP_TEXT_DISPLAY_STILL_TIME_X3mS)
        	    {
        	         Timer_for_Sytem_Display=0;
				Normal_Dispaly();
				System_Flag_Temp_DisplaY=0;
         	  	}

         	}



 }




void Init_51MCU(void)
{
 
     IE=0;
 //IE = 0x30;	//  00110000  EA EC ET2 ES ET1 EX1 ET0 EX0

 /***PORT DATA ****/


/***extern interrupt 0,1 setting****/
	 IT1=1;  //	0/1  LOW LEVEL/FALLING  edge triggle the external  interrupt  1 (for RDS)
	 IE1=0;  //clear the interrupt flag
	 IT0=1;  //	0/1  LOW LEVEL/FALLING  edge triggle the external interrupt  0 (for CLOCK)
	 IE0=0;  //clear the interrupt flag

	
/*** Serial communucation port set ***/
	SM0   = 0;            // 8 bit UART variable baud
	SM1   = 1;
	SM2   = 0;            // disable multi-processor communication
	REN   = 1;            // receive enable
	TB8		= 0;            // clear transmit parity bit
	RB8		= 0;            // clear receive parity bit
	TI 		= 0;            // clear transmit interrupt flag
	RI 		= 0;            // clear receive interrupt flag

/***timers function set***/
/*** Timer0 for 16 timer***/    
	TMOD=0x21;             //timer0(Timer MOD1 ): 0001        use as 16 timer for the 20ms interrupt 
					    // timer1(Timer   MOD2) : 0010      use as  for baud rate and auto reload mode
	
#if ( SYSTEM_CRYSTAL	==USE_CRYSTAL_40M)
	TH0=0x00;			 /*reload value 19.6ms for X=40M*/
	TL0=0x00;		        /*reload value 19.6ms for X=40M*/
#elif(SYSTEM_CRYSTAL	==USE_CRYSTAL_27M)
	//TH0=0xDC;			 /*reload value 4ms for X=27M*/
	//TL0=0xCF;		        /*reload value 4ms for X=27M*/
	   TH0=0x50;			 /*re load value 20ms for X=27M*/
	TL0=0x37;		        /*reload value 20ms for X=27M*/
#elif(SYSTEM_CRYSTAL	==USE_CRYSTAL_27MX2)
	   TH0=0x50;			
          TL0=0x37;		
#elif( SYSTEM_CRYSTAL== USE_CRYSTAL_24M598_X2)
	
	   TH0=0xCC;               /*reload value 3ms for 25.598*2**/
         TL0=0xD5;
#elif( SYSTEM_CRYSTAL== USE_CRYSTAL_40M039_X2)
     

	    TH0=0x97;               /*reload value 4ms for 40.039*2**/
       TL0=0xBC;
#elif( SYSTEM_CRYSTAL== USE_CRYSTAL_12M_X2)
		TH0=0xE0;		/*reload value 4ms for 12M*2**/
		TL0=0xB8;

#else

	TH0=0xff;			 /*reload value 25ms for X=22.118M*/ 
	TL0=0x4b;		        /*reload value 25ms for X=22.118M*/ 
#endif

/*** Timer1 for baud rate***/      
	PCON |= 0x80;
	TL1 = 0;				// clear timer 1 counter low

	//TH1=0xFF-fs/B/32/12 +1     SMOD=0
	//TH1=0xFF-fs/B/16/12 +1     SMOD=1
/*	TH1 =0xff-0x0C+1;					//2400bps for 11.0592  	SMOD=0
	TH1 =0xff-0x06+1;					//4800bps for 11.0592 	SMOD=0
	TH1 =0xff-0x03+1;					//9600bps for 11.0592  	SMOD=0
	TH1 =0xff-0x03+1;	PCON|=0x80;		//19200bps for 11.0592   SMOD=1
	
	TH1 =0xff-0x18+1;					//2400bps for 22.1184 	SMOD=0
	TH1 =0xff-0x0C+1;					//4800bps for 22.1184 	SMOD=0  
	TH1 =0xff-0x06+1;					//9600bps for 22.1184 	SMOD=0 
	TH1 =0xff-0x03+1;					//19200bps for 22.1184 	SMOD=0  
	TH1 =0xff-0x01+1;					//38400bps for 22.1184 	SMOD=0  */
	

	TH1 =0xff-0x1D+1;		SM1   =0;	//2400bps for 27 	SMOD=0
/*	TH1 =0xff-0x0E+1;					//4800bps for 27 	SMOD=0  
	TH1 =0xff-0x07+1;					//9600bps for 27 	SMOD=0 
	TH1 =0xff-0x0F+1;				     //9600bps for 27 	SMOD=1  
	TH1 =0xff-0x07+1;				       //19200bps for 27 	SMOD=1  
	TH1 =0xff-0x04+1;				         //19200bps for 27 	SMOD=0  
	TH1 =0xff-0x02+1;					//38400bps for 27 	SMOD=0
	TH1 =0xff-0x01+1;					//57600bps for 27 	SMOD=0
     
	TH1 =0xff-0x56+1;					//2400bps for 40.039*2M	SMOD=0
	TH1 =0xff-0x2B+1;					//4800bps for 40.039*2M 	SMOD=0  
	TH1 =0xff-0x15+1;					//9600bps for 40.039*2M 	SMOD=0 
	TH1 =0xff-0x0A+1;					//19200bps for40.039*2M 	SMOD=0  
	TH1 =0xff-0x05+1;					//38400bps for 40.039*2M 	SMOD=0
	TH1 =0xff-0x04+1;					//57600bps for 40.039*2M 	SMOD=0
       TH1 =0xff-0x02+1;					//115200bps for 40.039*2M 	SMOD=0  
	*/
	

/***timer 2 for  timer***/

	T2CON=0x09;			/*TF2	EXF2	RCLK	TCLK	EXEN2	TR2	C/T2	CR/RL2*/
						/* use the timer2 as capture mode   and timer1 for baud rate*/
                                          /*TF2 timer2 overflow flag,not set*/
						/*EXF2  T2 extern pin P1.1 negative edge flag*/
						  /*RCLK	TCLK =00 ,use timer1 overflow clock to RXD TXD*/
                                         /*set the EXEN2=1, allow the extern input T2EX(P11) */
					     /*set TR2=0,temp to mask the timer2 clock input*/
					     /*set C/T2=0,select the timer fuction for TIMER2 */
					    /*set CP/RT2=1, enable the timer capture */
										 
        TH2=0;	TL2=0; 	/*reload the prescalor 19.6ms for X=40M , 37.5ms for X=22.118M*/  

	

/****triggle the timer***/
	TR0=1;				//start timer0
	TR1=1;              // start timer 1 for baud rate
	TR2=1;                 //start timer2 for IR decoder

/****set the priority of interrupt***/
	PS = 0;              // set serial to low priority
	ES = 1;              // enable serial interrupt
	
	PT0=0;				//set timer0 to low prioity
       PX1=0;                   // set the Externel 1 interrupt
      PT2	=1;				//timer2 to high prioty
       PT1=0;
	  
	ET0=1;				//enable timer0 interrupt
	ET1=1;				/*enable T1 interrupt*/
	ET2=1;				/*enable T2 interrupt*/
	
	EX0=0;				//disable the EXtern0 interrupt
	EX1=0;                         // disable the extern  interrupt1


	ET1=1;				/*enable T1 interrupt*/
       ET0=1;
	
	
	
}


void Init_all_Hardware(void)
{
    
	 Init_LCD_COtrollor();
      //first init the EEPROM
  /*   ReadXEEprom(temp_byte,EEPAddress_INIT_FLAG,1);
     if(*temp_byte!=0xAA)
    {
	 WriteEEprom(EEPAddress_INIT_FLAG, 0xAA);
	 Reset_EEProm();
     	}
     	*/
	P3_4=0;
	Display_Temp_String("POWER ON");
	  

}


void Save_all_Var_to_EEProm(void)
{




}


void Reset_EEProm(void)
{
//save all var
Save_all_Var_to_EEProm();

}



void Init_Run_VAR(void)
{
Need_Send_Single_Key=0;
Flag_Get_Hold_Key=0;
IR_Get_Start_Begin=0;
	Start_Parse_Key_Input=0;
	Key_Scan_Step=0;
	 Enable_Get_Key=1;
	 Need_Send_Click_key=0;	
	 Get_Single_Key_Code=0;
	
 System_Flag_Being_Scrolling=0;          //flag to indicate that allow scrolling
 
 IR_Get_Start_Begin=0;
System_Flag_RTC_Update=FALSE;	

  
Start_Parse_Key_Input=0;
 Key_Scan_Step=0;
 Enable_Get_Key=0;
 Need_Send_Click_key=0;

IR_Key_Be_Hold_Key=0;                     //when we check the IR realse we will set the flag for send out a single key
Get_Single_Key_Code=0;
Enable_Hold_Key_Valid=0;
System_Flag_Temp_DisplaY=0;

 Enable_Repeat_Bit=0;

 Timer_for_Refresh_LCD_Display=0;
 System_Confirm_Refresh_LCD_Counter=0;
 System_RTC_Hour=0;
 System_RTC_Minute=0;
 System_RTC_Second=0;

}
void Init_System()
{	


	


}
void Mute_Key_Process()
{
		 System_Flag_MuteState^=1;
	     if(System_Flag_MuteState)
		{
          
		    LCD_Icon_Display_Control(SEG_MUTE, ON);
		

		}
	 else
		{
		
		      LCD_Icon_Display_Control(SEG_MUTE, OFF);
		
	 	}

}

void Normal_Dispaly()
{
}


void Delay_x5uS(U8  time )
{
	
	while(time)
		time--;
	
	
}


void Delay_xmS( U8  time)
{
       U8 i;
	 i=0;
      while(i<time)
      	{
             
		Delay_x5uS(190);
	       Delay_x5uS(190);
		i++;
      	}
	

}



⌨️ 快捷键说明

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