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

📄 ir.c

📁 7寸TFT电视的源程序
💻 C
字号:
//#define DEBUG_MSG
#include "target.h"

#ifdef __IR__

#define KEY_INDEX			2
#ifdef __EMULATOR_H__
#define time_ms(t) ((unsigned int)((t) * 24000000 / 12000))
//#define time_ms(t) ((unsigned int)((t) * 22118400 / 12000))
#else
#define time_ms(t) ((unsigned int)((t) * 24000000 / 12000))
#endif

#define LEADER_TIME_MAX time_ms(13.5 * 1.1)
#define LEADER_TIME_MIN time_ms(13.5 * 0.9)
#define REPEAT_TIME_MAX time_ms(11.25 * 1.1)
#define REPEAT_TIME_MIN time_ms(11.25 * 0.9)

#define LEADER_TIME_MAX2 time_ms(5.0625 * 1.1)
#define LEADER_TIME_MIN2 time_ms(5.0625 * 0.9)
#define REPEAT_TIME_MAX2 time_ms(2.8125 * 1.1)
#define REPEAT_TIME_MIN2 time_ms(2.8125 * 0.9)

#define ONE_TIME_MAX time_ms((2.25 * 1.1) + 0.3)
#define MEDIAN_BIT_TIME time_ms(1.6875)
#define ZERO_TIME_MIN time_ms((1.125 * 0.9) - 0.3)


#define IR_REPEAT_TIME 	4

#define IR_CUSTOMER_CODE1 0x00
#define IR_CUSTOMER_CODE2 0xff

typedef enum { idle, leader, bits, repeat1, repeat2 ,double1,double2} ir_state;

ir_state idata mode0 = idle;
extern unsigned char idata AudioToneMode;

unsigned char idata remote_buf[4];
unsigned char idata remote_pointer;
unsigned char idata repeat_counter;

bit double_key_flag = 0;
unsigned char idata IrDoubleKeyTimer = 0xff;
unsigned char idata IrDoubleKeyIndex = 0;


unsigned char code IrArray[] = {
    NULL_KEY,		/* 0x00 */
    NUM2_KEY,              	/* 0x01 */
    NUM3_KEY,                     /* 0x02 */
    NUM4_KEY,			/* 0x03 */

    NUM6_KEY,   	         	/* 0x04 */
    NUM7_KEY,                     /* 0x05 */
    NUM8_KEY,                     /* 0x06 */
    NUM0_KEY,                     /* 0x07 */

    NULL_KEY,               /* 0x08 */
    CLEAR_KEY,                 /* 0x09 */
    NULL_KEY,            	/* 0x0a */
    POWER_KEY,			/* 0x0b */
    
    PBC_KEY,   		/* 0x0c */
    RIGHT_KEY,			/* 0x0d */
    NULL_KEY,    		/* 0x0e */
    NULL_KEY,			/* 0x0f */
    NULL_KEY,    		/* 0x10 */
    NULL_KEY, 			/* 0x11 */
    NULL_KEY,                    /* 0x12 */
    NULL_KEY,			/* 0x13 */
    
    NUM9_KEY,			/* 0x14 */
    NULL_KEY, 		/* 0x15 */
    NULL_KEY, 		/* 0x16 */
    NULL_KEY,			/* 0x17 */
    
    NULL_KEY,  			/* 0x18 */
    ENTER_KEY,			/* 0x19 */
    SETUP_KEY,                 /* 0x1a */
    NULL_KEY,            	/* 0x1b */
    
    AUDIO_KEY,     		/* 0x1c */
    MUTE_KEY,                  /* 0x1d */
    NULL_KEY,    		/* 0x1e */
    ANGLE_KEY,               	/* 0x1f */
//0x20
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0x30
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,SUBTITLE_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0x40	
    NULL_KEY,		/* 0x40 */
    NUM1_KEY,                     /* 0x41 */
    NULL_KEY,                    /* 0x42 */
    NULL_KEY,			/* 0x43 */

    NULL_KEY,			/* 0x44 */
    NULL_KEY,              	/* 0x45 */
    LEFT_KEY,             	/* 0x46 */
    NULL_KEY,			/* 0x47 */
    	
    EJECT_KEY,			/* 0x48 */
    NULL_KEY,			/* 0x49 */
    NUM5_KEY,			/* 0x4a */
    STOP_KEY,		        /* 0x4b */
    
    NULL_KEY,			/* 0x4c */
    GOTO_KEY,  		/* 0x4d */
    PREV_KEY,              /* 0x4e */
    FR_KEY,    		/* 0x4f */
   	
    NULL_KEY,  	        	/* 0x50 */
    NULL_KEY,  		/* 0x51 */
    NULL_KEY,                  /* 0x52 */ 
    REPEAT_KEY,               	/* 0x53 */

    TITLE_KEY, 		/* 0x54 */
    NULL_KEY,            /* 0x55 */
    NEXT_KEY,                  /* 0x56 */
    FF_KEY, 		        /* 0x57 */

    NULL_KEY,			/* 0x58 */
    UP_KEY,		        /* 0x59 */
    VOL_UP_KEY,          	/* 0x5a */
    DOWN_KEY,       	  	/* 0x5b */

    NULL_KEY,       		/* 0x5c */
    NULL_KEY,			/* 0x5d */
    VOL_DOWN_KEY,		/* 0x5e */
    MODE_KEY,                  /* 0x5f */
//0x60
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0x70
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0x80
NULL_KEY,NULL_KEY,VOL_UP_KEY,VOL_DOWN_KEY,  NULL_KEY,NULL_KEY,UP_KEY,EJECT_KEY,
NULL_KEY,NULL_KEY,LEFT_KEY,DOWN_KEY,  NULL_KEY,NULL_KEY,ENTER_KEY,RIGHT_KEY,
//0x90
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY, NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0xA0
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0xB0
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0xC0
P1_KEY,P5_KEY,NULL_KEY,NULL_KEY,  P2_KEY,P6_KEY,NULL_KEY,NULL_KEY,
P3_KEY,BAND_KEY,NULL_KEY,NULL_KEY,  P4_KEY,MODE_KEY,NULL_KEY,NULL_KEY,
//0xD0
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0xE0
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
//0xF0
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,  NULL_KEY,NULL_KEY,NULL_KEY,NULL_KEY,
};	
unsigned char code allow_repeat[] ={
	0x5a,//vol up remote
	0x5e,//vol down remotes
	0x82,//vol_up panel 
	0x83,//vol_down panel
	0x4d,
	0x55,
	0x96,
	0x9e,
};
unsigned char code allow_double[] = {
	0x59,//up	remote
	0x5b,//down remote
	0x86,//up panel
	0x8b,//down panel

	0x41,//1 remote
	0x01,//2
	0x02,//3
	0x03,//4
	0x4a,//5
	0x04,//6

	0xc0,//'1'  panel
	0xc4,//'2'
	0xc8,//'3'
	0xcc,//'4'
	0xc1,//'5'
	0xc5,//'6'

};

unsigned char code ir_double[] = {
	SEEKUP_KEY,
	SEEKDOWN_KEY,
	SEEKUP_KEY,
	SEEKDOWN_KEY,
	
	M1_KEY,
	M2_KEY,
	M3_KEY,
	M4_KEY,
	M5_KEY,
	M6_KEY,
	M1_KEY,
	M2_KEY,
	M3_KEY,
	M4_KEY,
	M5_KEY,
	M6_KEY
};

void IRInter() interrupt 2 using 2
{
	unsigned char i;
	unsigned int remote_count;

	remote_count = (TH0 << 8) | TL0;
	TH0 = 0;
	TL0 = 0;
	if(remote_count > LEADER_TIME_MIN && remote_count <= LEADER_TIME_MAX)
	{
		for(i = 0; i < 4; i++) remote_buf[i] = 0;
		remote_pointer = 0;
		mode0 = bits;
		double_key_flag = 0;
	}
	else if(mode0 == bits && remote_count > ZERO_TIME_MIN && remote_count <= ONE_TIME_MAX)
	{
		if(remote_count > MEDIAN_BIT_TIME) // one bit
			remote_buf[remote_pointer >> 3] |= (1 << (remote_pointer & 0x07));

		remote_pointer++;

		if(remote_pointer >= 32)
		{
			if(remote_buf[0] == IR_CUSTOMER_CODE1 && remote_buf[1] == IR_CUSTOMER_CODE2)
			{

				mode0 = idle;

				for(i = 0; i < sizeof(allow_repeat); i++)
				{
					if(remote_buf[KEY_INDEX] == allow_repeat[i])
					{
						repeat_counter = 0;
						mode0 = repeat1;
						if(AudioToneMode==0){
							if(	i>3){//up and down key
									i = sizeof(allow_repeat);
									mode0 = idle;
								}
						}
						break;
					}
				}
				
				if(i == sizeof(allow_repeat) ){
					for(i=0; i< sizeof(allow_double); i++)
					{
						if(remote_buf[KEY_INDEX] == allow_double[i]){
							repeat_counter = 0;
							mode0 = double1;
							IrDoubleKeyIndex =i;
							IrDoubleKeyTimer = TIME_150MS;
							break;
						}
					}
				}
				
				i = remote_buf[KEY_INDEX];
				if(mode0 != double1){
					SaveKeyToBuff(IrArray[i]);
				}
			}
		}
	}
	else if(mode0 == repeat1 || mode0 == double1){
		mode0++;
		if(mode0 == double1) IrDoubleKeyTimer = TIME_200MS;
	}
	else if(mode0 == repeat2 && remote_count > REPEAT_TIME_MIN && remote_count <= REPEAT_TIME_MAX)
	{
		if(repeat_counter < IR_REPEAT_TIME)
			repeat_counter++;
		else{
			i = remote_buf[KEY_INDEX];
			SaveKeyToBuff(IrArray[i]);
		}
		mode0--;
	}
	else if(mode0 == double2 && remote_count > REPEAT_TIME_MIN && remote_count <= REPEAT_TIME_MAX)
	{
		if(repeat_counter < IR_REPEAT_TIME){
			IrDoubleKeyTimer = TIME_200MS;
			repeat_counter++;
			mode0--;
		}
		else{
			IrDoubleKeyTimer = 0xff;
			double_key_flag = 1;
			SaveKeyToBuff(ir_double[IrDoubleKeyIndex]);
			mode0 = idle;
		}
	}
	else
		mode0 = idle;
}


void NotDoubleKey()
{
	unsigned char i;
	mode0 = idle;
	IrDoubleKeyTimer = 0xff;
	i = allow_double[IrDoubleKeyIndex];
	SaveKeyToBuff(IrArray[i]);
}



#endif


⌨️ 快捷键说明

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