📄 ir.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 + -