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

📄 time0.c

📁 Infrared remote decode firmware ,use time measure pulse to decode 1 or 0 this code can decode Nec pr
💻 C
字号:
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
//	this code main function is for decode the infrared remote controller
//	ahtor: 	郭福珍
//	email:	frankgfz@yahoo.com.cn
//	msn:	guofuzhen@hotmail.com
//
/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/

#include <reg51.h>
#define uchar unsigned char
#define MAINCLOCK 	110592	
#define PulsNum		32
#define DEBUG__

#define SET20MS		SetTimerLong(0xA9,0x94)
#define SET2MS		SetTimerLong(0xF9,0x12)
#define SET15MS		SetTimerLong(0xBF,2f)
#define SETZEROMS	SetTimerLong(0,0)
#define TIM0_1MS			0x3//99	
//#define RAW_DATA
#define KEY_NUMBER_1	41
#define KEY_NUMBER_2	6
sbit IRIN = P3^2; //红外接收器数据线
sbit BEEP = P3^7; //蜂鸣器驱动线
sbit RELAY= P3^6; //继电器驱动线
#if 0

char code power[]	={0x42,042,0x87,0x8f};/*power*/

char code VendCode[][2]={{0x45,0x87},{0x38,0x7a}};

char code keyCode1[KEY_NUMBER_1]={	0xc2/*up*/,0xc3/*down*/,0x93/*left*/,0x8f/*right*/,0x63/*ok*/,0xc6 /*menu*/,0x20/*guide*/,
						0x76/*pip*/,0x56/*fangkuang*/,0x57/*play*/,0x42/*pause*/,0x29/*source*/,
						0x5b/*quick back*/,0x6d/*back*/,0x55/*quick play*/,0x65/*back begin*/,0x75/*rec*/,0x66/*to end*/,0x64/*exit*/,0x58/*info*/,
						0x72/*shift*/,0x9b/*fav*/,0x71/*home*/,	0x74/*setup*/,0x43/*1*/,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b/*9*/,0x4c/*0*/,
						0x67/*enter*/,0x77/*red*/,0x78/*green*/,0x7a/*blue*/,0x79/*yellow*/};  //0x87
						
//char code keyCode2[]={0x50/*valume+*/,0x5a/*mute*/,0x63/*ch +*/,0x51/*v -*/,0x65/*sleep*/}; //0x7a
#endif
// CtestDlg 对话框
unsigned char code power[]	={0x42,042,0x87,0x8f};/*power*/

unsigned char code VendCode[][2]={{0x45,0x87},{0x38,0x7a}};

unsigned char code keyCodeIntel1[KEY_NUMBER_1]={	0xc2/*up*/,0xc3/*down*/,0x93/*left*/,0x8f/*right*/,0x63/*ok*/,0xc6 /*menu*/,0x20/*guide*/,
						0x76/*pip*/,0x56/*fangkuang*/,0x57/*play*/,0x42/*pause*/,0x29/*source*/,
						0x5b/*quick back*/,0x6d/*back*/,0x55/*quick play*/,0x65/*back begin*/,0x75/*rec*/,0x66/*to end*/,0x64/*exit*/,0x58/*info*/,
						0x72/*shift*/,0x9b/*fav*/,0x71/*home*/,	0x74/*setup*/,0x43/*1*/,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b/*9*/,0x4c/*0*/,
						0x67/*enter*/,0x73/*<--*/,0x77/*red*/,0x78/*green*/,0x7a/*blue*/,0x79/*yellow*/,0x8f/*power*/};  //0x87
						
unsigned char code keyCodeIntel2[KEY_NUMBER_2] = {0x50/*valume+*/,0x5a/*mute*/,0x63/*ch +*/,0x51/*v -*/,0x64/*chan -*/,0x65/*sleep*/}; //0x7a

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

unsigned char code keyCodeDragon1[KEY_NUMBER_1]={	0x80/*up*/,0x81/*down*/,0x51/*left*/,0x4d/*right*/,0x21/*ok*/,0x84 /*menu*/,0xde/*guide*/,
						0x34/*pip*/,0x14/*fangkuang*/,0x15/*play*/,0x00/*pause*/,0xe7/*source*/,
						0x19/*quick back*/,0x2b/*back*/,0x13/*quick play*/,0x23/*back begin*/,0x33/*rec*/,0x24/*to end*/,0x22/*exit*/,0x16/*info*/,
						0x30/*shift*/,0x39/*fav*/,0x2f/*home*/,	0x32/*setup*/,0x01/*1*/,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09/*9*/,0x0a/*0*/,
						0x25/*enter*/,0x31/*<--*/,0x35/*red*/,0x36/*green*/,0x38/*blue*/,0x37/*yellow*/,0x12/*power*/};  //0x45

unsigned char code keyCodeDragon2[KEY_NUMBER_2] = {0x0e/*valume+*/,0x18/*mute*/,0x21/*ch +*/,0x0f/*v -*/,0x22/*chan -*/,0x23/*sleep*/}; //0x38

////////////////////////////////////////////////////////////////////////
//Input: parameter is ir address and command that high 8 bits is address low8bits command
//return :return intel format value; if error return 0 
/////////////////////////////////////////////////////////////////////////

unsigned short convert2intel(unsigned short input)
{
		int i;
		unsigned char * pdragon,*pintel;
		unsigned short Id,maxkey;
		if((unsigned char)(input>>8)==0x45)
		{
			pdragon=&keyCodeDragon1[0];
			pintel=&keyCodeIntel1[0];
			Id=(0x87<<8);
			maxkey=KEY_NUMBER_1;
		}
		else if ((unsigned char)(input>>8)==0x38)
		{
				pdragon=&keyCodeDragon2[0];
				pintel=&keyCodeIntel2[0];
				Id=(0x7a<<8);
				maxkey=KEY_NUMBER_2;
		}


		for(i=0;i<maxkey;i++)
		{
			if((unsigned char)input==*pdragon++)
				break;
		}
		return (Id|pintel[i]);

}



//
//Phone Number  886 - 2 - 29588630  
//Fax Number      886 - 2 - 29588990  
//
/********************************************************************/
/**/
/* initail the uart regeister*/
/**/
/*******************************************************************/
void InitUart(void)
{
  SCON = 0x50; 		// 8-bit UART mode
  TMOD |= 0x20; 	// timer 1 mode 2 auto reload
  TH1= 0xfd; 		// 9600 8n1 @ 12Mhz
  TR1 = 1; 			// run timer1;
  //ES  = 1;
}

void printc(char a)
{
      SBUF=a;
      while(!TI);
      TI=0;

}
void prints(char * string)
{
	char *pbuf=string;
	while(*pbuf!=0){
	printc(*pbuf);
	pbuf++;
		}
}


void SetTimerLong(uchar Cout_h,uchar Cout_l)
{
	TH0=Cout_h;
	TL0=Cout_l;
}
uchar Compare(uchar th0)
{
	return(th0>TIM0_1MS ? 1:0);
}
///////////////////////////////////////////////
//   解码红外计数器的数组输入
//	return key value if erro return 0
//   return  high 8bits is address and low bits is command
/////////////////////////////////////////////

unsigned short DecodeIr(uchar * p)
{
	unsigned char value[4]={0,0,0,0};
		char i=0,j=0;
		for(j=0;j<4;j++)
			{
				for(i=0;i<8;i++)
					{
						if(Compare(p[j*8+i]))
							{
								//value[j] |= 0x1<<(7-i);
								value[j]|=0x1<<i;
							}
					}
			}
		if(value[0]!=(uchar)~value[1])
			return 0;
		if(value[2]!=(uchar)~value[3])
			return 0;
#ifdef DEBUG
		printc(value[0]);
#endif
		return (unsigned short)(value[2]|(unsigned short)(value[0]<<8));
}


uchar TimeMode =0;
uchar Coun45msTime =0;
//uchar KeyboardValue[4]={0,0,0,0};
uchar KeyStata=0;
unsigned long KeyboardValue =0;
uchar DecodeArray[PulsNum];

void GlobleVarInit(void)
{
	TimeMode=0;
	Coun45msTime=0;
	KeyStata=0;
	KeyboardValue=0;
}
void OutIr2Uart(void)
{	
unsigned short KeyValue=0,convert_val=0;
		if(KeyStata==1)
		{
#ifdef DEBUG		
			//prints("111");
				for(j=0;j<PulsNum;j++)
					printc(DecodeArray[j]);
			prints("\r\n");
#endif			
			KeyValue=DecodeIr(DecodeArray);// keyValue high 8bits is address and low address is command
#ifdef RAW_DATA			
			printc((uchar)(KeyValue>>8));
			printc((uchar)KeyValue);
#else
		convert_val=convert2intel(KeyValue);
		if((convert_val==0x878f)&&((uchar)KeyValue==0x12))  //power
			{
				printc(0x42);
				printc(0x42);
			}
		printc((uchar)(convert_val>>8));
		printc((uchar)convert_val);

#endif
			KeyStata=0;
			
		}
}		
void KeyTransact(void)
{


}
void main(void)
{	
#ifdef DEBUG
	char j=0;
#endif

	InitUart();
	EA=1;
	ET0=1;
	TMOD|=0x01;
	SET2MS;
	TR0=1;
	GlobleVarInit();
	prints("Ok\r\n");  //if burn must content this sentence
	while(1)
	{
	
		OutIr2Uart();
	}
}	
void Time0(void)interrupt 1 using 1
{

	uchar i=0;
	uchar * pbuf;
	P1=~P1;
	//TR0=0;
	//prints("t");
	if(TimeMode==0)
	{
		if(IRIN)
		{
			goto ENDTIME;	
		}
		Coun45msTime++;
		if(Coun45msTime<=3)
		{
				goto ENDTIME;
		}
	   	if(Coun45msTime>3)   //if Coun45msTime >=2 is boot code 4.5ms lowlever ? 
		{
				TR0=0;
	   			while(IRIN==0);
				while(IRIN==1);
				TimeMode=1;
		}
	}

	if(TimeMode==1)  
	{
#ifdef DEBUG		
		prints("@");
#endif
		pbuf=DecodeArray;
		KeyboardValue=0;
		for(i=0;i<32;i++)
			{
				while(IRIN==0);
				SETZEROMS;
				TR0=1;
				while(IRIN==1);
				*pbuf++=TH0;
				//*pbuf++=TL0;
				TR0=0;
			}
		TimeMode=0;
		KeyStata=1;
		Coun45msTime=0;
		SET2MS;
		TR0=1;

	}

ENDTIME:
	SET2MS;
	TR0=1;


}
		

⌨️ 快捷键说明

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