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

📄 ir.c

📁 mcu for gm5621带遥控,键盘输入的单片机代码.供学习参考使用.谢谢.
💻 C
字号:

#include "board.h"

#include "keypaddef.h"
#if DebugIRCode
#include "debug.h"
#endif
#include "ir.h"
#include "global.h"
#include "Power.h"

#if DebugIRCode
BYTE xdata IRDebugCode0=0;
BYTE xdata IRDebugCode1=0;
BYTE xdata IRDebugData=0;
#endif
BYTE IR_Status;
WORD IR_Width;
BYTE IR_Bit_Count;
BYTE IR_Data;
BYTE IR_Data_Backup;
BYTE IR_ErrTimeCount;



void IR_Init(void)
{   
	BYTE tmp;

	IT0 = 1; //set edge  trigger -(INT1)
    	EX0 = 1;
    	tmp = TMOD&0xf0;//timer0
    	TMOD = tmp|0x01;
    	Set_IR_ResetFlag();
    	Clr_IR_Data_OKFlag();
    	IR_Data = 0;
    	IR_Bit_Count = 0;
    	IR_ErrTimeCount = 0;
}



void ir_interrupt(void)   interrupt 0
{
    	EA = 0;
   	EX0 = 0;
//------------------------
   	TR0 = 0;
    	IR_Width = TH0;IR_Width <<=8;IR_Width |= TL0;
//    TMOD = 0x11;                  //change timer1 mode
    	TH0 = IR_Parameter_Table[8]>>8;
    	TL0 = IR_Parameter_Table[8]&0xFF; // timer 1 counter
    	TF0 = 0;
    	ET0 = 1;
    	TR0 = 1;
    	IR_Width -=  IR_Parameter_Table[8];
//-----------------------------------------------------------------------



    	if(IR_ResetFlag)
     	 {
     	 	
     		Clr_IR_ResetFlag();
      		Clr_IR_Data_OKFlag();
      		IR_Data = 0;
      		IR_Bit_Count = 0;
//      IR_ErrTimeCount = 110;
    	 // IR_ErrTimeCount = 108+IR_ErrTimeCountTorlance;		//jt update 2004-04-27
		IR_ErrTimeCount = 9;
	}
    	else
      {
      		if(IR_Bit_Count==0)//decode lead
        	{
        		if(IR_Width>IR_Parameter_Table[4] && IR_Width<IR_Parameter_Table[5])
            			IR_Bit_Count++;
        	}
      		else if(IR_Bit_Count<17)//decode customer code
        	{
        	//--------------------------------------------------------------
        		if(IR_Width>IR_Parameter_Table[0] && IR_Width<IR_Parameter_Table[1])
          		{
          			IR_Data >>= 1;IR_Bit_Count++;
          		}
        		if(IR_Width>IR_Parameter_Table[2] && IR_Width<IR_Parameter_Table[3])
          		{
          			IR_Data >>= 1;IR_Data |= 0x80;IR_Bit_Count++;
          		}
        //--------------------------------------------------------------
        		if(IR_Bit_Count==9)
          		{
          			#if DebugIRCode
          			IRDebugCode0 = IR_Data;
          			Set_IR_DebugCustomerCode0_OKFlag();
          			#endif

          			if(IR_Data!=IR_Customer_Code[0])
            				IR_Bit_Count = 0; 
				
          		}
        		if(IR_Bit_Count==17)
          		{
          			#if DebugIRCode
          			IRDebugCode1 = IR_Data;
          			Set_IR_DebugCustomerCode1_OKFlag();
          			#endif

         			if(IR_Data!=IR_Customer_Code[1])
            				IR_Bit_Count = 0;
				
          		}
        	}
      		else if(IR_Bit_Count<33)//decode data code
        	{
        		//test++;	
        //--------------------------------------------------------------
        		if(IR_Width>IR_Parameter_Table[0] && IR_Width<IR_Parameter_Table[1])
          		{
          			IR_Data >>= 1;IR_Bit_Count++;
          		}
        		if(IR_Width>IR_Parameter_Table[2] && IR_Width<IR_Parameter_Table[3])
          		{
          			IR_Data >>= 1;IR_Data |= 0x80;IR_Bit_Count++;
          		}
        //--------------------------------------------------------------
       	 	if(IR_Bit_Count==25)
          		{
          			
          			IR_Data_Backup = IR_Data;
          		}
        		if(IR_Bit_Count==33)
          		{
          			IR_Data = IR_Data^IR_Data_Backup;
          			if(IR_Data==0xff)
             			{
             				#if DebugIRCode
             				IRDebugData = IR_Data_Backup;
             				Set_IR_DebugData_OKFlag();
             				#endif
							
             				Set_IR_Data_OKFlag();
             			}
          		else
             			IR_Bit_Count = 0;  
          		}
        	}
      		else if(IR_Width>IR_Parameter_Table[6] && IR_Width<IR_Parameter_Table[7])//decode stop and repeat code
        	{
//          		IR_ErrTimeCount = 110;
   	  		//IR_ErrTimeCount = 108+IR_ErrTimeCountTorlance;		//jt update 2004-04-27
			IR_ErrTimeCount = 9;
			
          		#if DebugIRCode
          		IRDebugData = IR_Data_Backup;
          		Set_IR_DebugData_OKFlag();
          		#endif

			if(IR_Bit_Count==33)
            			Set_IR_Data_OKFlag();
        	}
      	}
    	EX0 = 1;
   	EA = 1;
}


void timer0(void) interrupt 1
{ 
	// Int Vector at 001BH, Reg Bank 1
  	EA = 0;
  	ET0 = 0; // inhibit timer0 interrupt
  	TR0 = 0; // stop timer0

  	
  	if(!IR_ErrTimeCount)
    	{
    		Set_IR_ResetFlag();
    	}
  	EA = 1;
  
}
/*
void timer1(void) interrupt 3 
{ 
	// Int Vector at 001BH, Reg Bank 1
  	EA = 0;
  	ET1 = 0; // inhibit timer1 interrupt
  	TR1 = 0; // stop timer1

  	
  	if(!IR_ErrTimeCount)
    	{
    		Set_IR_ResetFlag();
    	}
  	EA = 1;
  
}

*/

BYTE Get_IR_Key(void)
{
    	BYTE tmp;
    	tmp = KEY_NOTHING;

	if(IR_Data_OKFlag)
     	{
     		
     	 	tmp = IR_Key_Table[IR_Data_Backup];
      		Clr_IR_Data_OKFlag();
		//test = IR_Data_Backup;
     	}
	//----------------------------------

	return tmp;
}


/*
void PC_Interrupt(void) interrupt 6
{
             GreenLedOn();
		//ForceDelay1ms(2);
		//GreenLedOn();
			 
}*/

/*
void Reset_Ir_Key(void)
{ 
  	Clr_IR_Data_OKFlag();
}
*/
#if 0//DebugIRCode
void DebugIRHandler(void)
{
  	if(IR_DebugCustomerCode0_OKFlag)
    {
    	Clr_IR_DebugCustomerCode0_OKFlag();
    printData("IR CustomerCode0 %x",IRDebugCode0);		
    }
  	if(IR_DebugCustomerCode1_OKFlag)
    {
    	Clr_IR_DebugCustomerCode1_OKFlag();
    printData("IR CustomerCode1 %x",IRDebugCode1);
    }
  if(IR_DebugData_OKFlag)
    {
    Clr_IR_DebugData_OKFlag();
    printData("IR Data %x",IRDebugData);
    }
}
#endif

⌨️ 快捷键说明

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