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

📄 ir.c

📁 C code for using 8051 to control philiphs I2C FM tuner (use sdcc compiler)
💻 C
字号:
#include <at89x52.h>#include "ir.h"#include "i2c.h"#include "tuner.h"static unsigned char	impulse = 0;static unsigned char	eximpulse = 0;static unsigned char	IR_flag = 0;static unsigned short	impulseCounter = 0;static unsigned short	spaceCounter = 0;static unsigned char	preDataCounter = 0;static unsigned char	bitCounter = 0;static unsigned short	keycode = 0;static unsigned char tuner_data[5] = {0x00};static unsigned char channel = 5;/* IR Initial */void IR_Initial(void) {	IR_DETECT_PIN = 1;  /* Set IR Detect Pin as input Pin */	TCON	=	0x00;	TMOD	=	0x01;	IP		=	0x01;	IE		=	0x83;	TL0 	= 	_TL0_;	TH0 	= 	_TH0_;	TR0 	= 	1;		/* IR Timer Run */}/* IR Decoder Algorithm */void IR_Timer(void) interrupt 1{    /* Reload the timer counts */	    TL0 = _TL0_;    TH0 = _TH0_;     if ( IR_DETECT_PIN == 1)        impulse=0;     else        impulse=1;     if ((eximpulse==0) && (impulse==1)) // Rising Edge    {        impulseCounter=0;         if ((spaceCounter>1)&&(IR_flag==1)&&(spaceCounter<24))         {           preDataCounter++;            if ((spaceCounter<10) && (preDataCounter>16))           {             keycode <<= 1;             bitCounter++;                        }               if ((spaceCounter>10) && (preDataCounter>16))           {             keycode <<= 1;                      keycode |= 1;              bitCounter++;            }              }              }        	if((impulse==1)&&(impulseCounter<200))		impulseCounter++;  	if((eximpulse==1)&&(impulse==0)) //falling edge	{    	spaceCounter=0;     	if(impulseCounter>30)    		IR_flag=1;	} 	if((impulse==0)&&(IR_flag==1)&&(impulseCounter<150))	//counting negative pulses		spaceCounter++; 	 if (bitCounter == 16) 	{		if (keycode == 0x6897) // power		{			channel = 9; // max channel		}		else if (keycode == 0xA05F) // CH+		{			if (channel == 11) // max channel				channel = 5;   // min channel			else				channel += 2;		}		else if (keycode == 0x40BF) // CH-		{ 			if (channel == 5) // min channel				channel = 11; // max channel			else				channel -= 2;        }#if 0		else if (keycode == 0x50AF) // Vol-		{     	}		else if (keycode == 0x7887) // Vol+		{     	}#endif	switch (channel) {		/*			NTSC USA, fVIF = 45.75MHz, fss = 62.5KHz	         	Test Cable Channel 7, fRF = 175.25MHz, TV Mid Band		*/		case 7:			tuner_data[0] = 0x0D; // DB1			tuner_data[1] = 0xD0; // DB2			tuner_data[2] = 0xCE; // CB			tuner_data[3] = 0x02; // BB			tuner_data[4] = 0x20; // AB		break;               	/*			Test Cable Channel 11, fRF = 199.25MHz, TV Mid Band		*/		case 11:			tuner_data[0] = 0x0F; // DB1			tuner_data[1] = 0x50; // DB2			tuner_data[2] = 0xCE; // CB			tuner_data[3] = 0x02; // BB			tuner_data[4] = 0x20; // AB		break; 		/*			Test Cable Channel 5 , fRF = 77.25MHz, TV Low Band			(77.25 + 45.75) *  1000 / 62.5		*/		case 5:			tuner_data[0] = 0x07; // DB1			tuner_data[1] = 0xB0; // DB2			tuner_data[2] = 0xCE; // CB			tuner_data[3] = 0x01; // BB			tuner_data[4] = 0x20; // AB		break;			/*			Test Cable Channel 9 , fRF = 187.25MHz, TV Mid Band			(187.25 + 45.75) *  1000 / 62.5		*/		case 9:			tuner_data[0] = 0x0E; // DB1			tuner_data[1] = 0x90; // DB2			tuner_data[2] = 0xCE; // CB			tuner_data[3] = 0x02; // BB			tuner_data[4] = 0x20; // AB		break; 		} 		/* Write Data to Tuner */		tuner_write(tuner_data);		I2C_NOP(); 		/* Reset counters */		preDataCounter=0;		IR_flag=0;		spaceCounter=0;		impulseCounter=0;		keycode = 0;		bitCounter=0; 	}	 if (spaceCounter > 300) 	{ 		preDataCounter=0;		IR_flag=0;		spaceCounter=0;		impulseCounter=0;		keycode = 0;		bitCounter=0;      	} 	eximpulse=impulse; }

⌨️ 快捷键说明

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