📄 ir.c
字号:
#include "comm.h"
#include "Key_process.h"
#include "ir.h"
#include "debug.h"
bit pre_bit = 0;
uint32 dataIR = 0; /* System/customer IR code */
static uchar cntIRbits = 0; /* Number of IR sys/cust. bits */
char stateIR = IR_IDLE; /* IR state machine state */
extern bit ir_enable;
extern uchar codeIR;
uchar pre_code = 0;
bit repeat_flag =0;
#if 0
static void code_valid()
{
if(dataIR == pre_code)
{
if(pre_code == _POWER_KEY) /*POWER key do not allow repeat*/
return;
}
else
{
ir_enable = 1;
codeIR = dataIR & 0xFF;
pre_code = dataIR;
}
stateIR = IR_IDLE;
j cntIRbits = 1;
dataIR = 1;
pre_bit = 1;
}
#endif
void Timer_0(void) interrupt 1
{
//extern int Get_key_timer;
/*15.6ms 正常的一次信号是 9.0MS + 4.5 超过这个时间,就表示,信号不符合
或是IR_REEP
*/
TR0 = 0;
TL0=0x00;
TH0=0x90;
/*TR0 = 1;*/
#if 0 //def IRREP
if (stateIR == IR_REPEAT)
{
repeat_flag =1;
if(pre_code == _POWER_KEY)
return; /*POWER 键不需要连按*/
codeIR = pre_code; /* Indicate a new code */
ir_enable = 1;
}
#endif
stateIR = IR_IDLE;
cntIRbits = 1;
dataIR = 1;
pre_bit = 1;
}
#if 0
void ir_core_philips()
{
uint width;
TR0=0;
/* two_byte_tmp._WORD.H_BYTE = TH0;
two_byte_tmp._WORD.L_BYTE = TL0;*/
width = (uint)(TH0 * 256) + TL0;
TL0=0x00;
TH0=0x90;
TR0=1;
/* width = two_byte_tmp.word;*/
if((width > PLUSE2_WIDTH_MIN) && (width < PLUSE2_WIDTH_MAX))
{
width = 2;
}
else if((width > PLUSE3_WIDTH_MIN) && (width < PLUSE3_WIDTH_MAX))
{
width = 3;
}
else if((width > PLUSE4_WIDTH_MIN) && (width < PLUSE4_WIDTH_MAX))
{
width = 4;
}
else
{
width = 1;
}
pre_bit = dataIR & 0x1;
if(stateIR == IR_IDLE)
{
stateIR = IR_CUSTOM;
cntIRbits = 1;
dataIR = 1;
pre_bit = 1;
}
else
{
switch(width){
case 2:
cntIRbits += 2;
break;
case 3:
cntIRbits += 3;
break;
case 4:
cntIRbits += 4;
break;
default:
break;
}
dataIR <<= 1;
if(cntIRbits & 0x1) /*half bit*/
{
switch(width){
case 2: /*如果接收到2个脉冲之后数据是半位,则数据和前一位的值一样*/
if(pre_bit)
dataIR |= 0x1;
break;
case 3: /*如果接收到3个脉冲之后数据是半位,则数据是前一位的值以及前一位的反*/
if(pre_bit)
{
dataIR |= 1;
dataIR <<= 1;
}
else
{
dataIR <<= 1;
dataIR |= 1;
}
break;
case 4: /*如果接收到4个脉冲之后数据是半位,则数据是前一位的值的反以及前一位的值*/
if(pre_bit)
{
dataIR <<= 1;
dataIR |= 1;
}
else
{
dataIR |= 1;
dataIR <<= 1;
}
break;
}
}
else /*full bit*/
{
switch(width){
case 2: /*如果接收到2个脉冲之后数据是完整位,则数据和前一位的值一样*/
if(pre_bit)
dataIR |= 0x1;
break;
case 3:
case 4:
if(pre_bit) /*如果接收到3个或者4个脉冲宽度之后数据是完整位,则数据为前一位的反以及前一位一样的值*/
{
dataIR <<= 1;
dataIR |= 1;
}
else
{
dataIR |= 1;
dataIR <<= 1;
}
break;
}
}
}
if(cntIRbits == 0x1B)
{
code_valid();
}
if(cntIRbits > 0x1B)
{
stateIR = IR_IDLE;
}
}
#endif
#define IR_NEC
#if 1//def IR_NEC
#ifdef DEBUG_PRINTF
unsigned char sys_code;
unsigned char ivcode;
#endif
void ir_core_nec() using 1
{
int reset = 0;
uint width;
// static uchar rep_cnt=0;
//unsigned char temp_data,temp_data1;
TR0=0;
width = (uint)((TH0 -0x90)* 256) + TL0 ;
TL0=0x00;
TH0=0x90;
TR0=1;
// temp_data = (width>>8);
// temp_data1 = width&0xff;
if (stateIR == IR_IDLE)
{
stateIR = IR_LEADER_LOW;
}
else if (stateIR == IR_CUSTOM)
{
dataIR <<= 1;
if ((width >= DATA_1_MIN) && (width <= DATA_1_MAX))
{
dataIR |= 0x1;
}
else if ((width < DATA_0_MIN) || (width > DATA_1_MAX))
{
reset = 1;
}
cntIRbits++;
/* First 16 bits are syscode */
#if 1
if (cntIRbits == 16 )
{
if(dataIR != SYSTEM_CODE)
{
reset = 1;
}
#ifdef DEBUG_PRINTF
sys_code = dataIR&0xff; /*jian add in 07-07-26*/
#endif
}
#endif //csg
if (cntIRbits == 24)
{
codeIR = dataIR&0xff;// | 0x100; /* Indicate a new code */
ir_enable = 1; /*jian add in 07-08-1*/
#ifdef IRREP
pre_code = codeIR;
#endif
//ir_enable = 1;
}
else if (cntIRbits == 32)
{
#ifdef DEBUG_PRINTF
ivcode = dataIR&0xff;
#endif
reset = 1;
}
}
#if 0
else if (stateIR == IR_LEADER_LOW)
{
if ((width >= LEADER_LOW_MIN) && (width <= LEADER_LOW_MAX))
{
stateIR = IR_LEADER_HIGH;
}
else
reset = 1;
}
#endif
else if(stateIR == IR_LEADER_LOW)
{
// tvbox_printf("h_vaule:",temp_data ,1);
// tvbox_printf("l_vaule:",temp_data1 ,1);
/* stateIR has to be equal to IR_LEADER_HIGH */
if ((width >= (LEADER_HIGH_MIN + LEADER_LOW_MIN)) && (width <= (LEADER_HIGH_MAX + LEADER_LOW_MAX)))
{
dataIR = cntIRbits = 0;
stateIR = IR_CUSTOM;
}
#ifdef IRREP
else if ((width >= (REPEAT_HIGH_MIN + LEADER_LOW_MIN)) && (width <= (REPEAT_HIGH_MAX + LEADER_LOW_MAX)))
{
/* if the width is 2.25 ms, it is repeat code leader */
stateIR = IR_REPEAT;
if(pre_code != _POWER_KEY)
{
codeIR = pre_code; /* Indicate a new code */
ir_enable = 1;
repeat_flag =1;
reset = 1; /*jian add in 07-07-20*/
}
/*power key needn't ireep!!!*/
}
#endif
else
reset = 1;
}
#if 0//def IRREP
else if (stateIR == IR_REPEAT)
{
if ((width >= REPEAT_DATA_MIN) && (width <= REPEAT_DATA_MAX))
{
/* the width is 0.56 ms */
codeIR = pre_code; /* Indicate a new code */
ir_enable = 1;
}
reset = 1;
}
#endif
else
{
reset = 1;
}
if (reset)
{
/* Reset all, start from the very beginning */
stateIR = IR_IDLE;
}
}
#endif
void EXTIRQ_interrupt_service(void) interrupt 0 using 1
{
EA = 0;
// ir_core_philips();
ir_core_nec();
EA = 1;
}
#if 0
void delay_889us()
/*
*FOR 4MHz CLOCK TO DELAY 889uS
*/
{
uint i = 220;
while(--i);
}
#endif
void Nec_send_vaule(unsigned char vaule)
{
unsigned char j;
for(j = 0; j < 8; j++)
{
delay(30);/*0.565ms 10 us*//*0.173ms*/
OUTPUT_IR = 1;
if(vaule & 0x80)
delay(100);/*1.69ms 10 us*//*0.173ms*/
else
delay(30);/*0.565ms 10 us*//*0.173ms*/
OUTPUT_IR = 0;
vaule <<= 1; /*低位开始传输*/
}
}
void send_ir(unsigned char code_value)
{
#if 0
uchar i = 0xCC,j = 0;
EA = 0;
// if(reversal_ir)
// i |= 0x20;
for(j = 0;j<6;j++)
{
if(i & 0x80)
{
OUTPUT_IR = 1;
}
else
{
OUTPUT_IR = 0;
}
delay_889us();
i <<= 1;
OUTPUT_IR = ~OUTPUT_IR;
delay_889us();
}
i = (uchar)(code_value);
for(j = 0;j<8;j++)
{
if(i & 0x80)
{
OUTPUT_IR = 1;
}
else
{
OUTPUT_IR = 0;
}
delay_889us();
i <<= 1;
OUTPUT_IR = ~OUTPUT_IR;
delay_889us();
}
// reversal_ir = ~reversal_ir;
OUTPUT_IR = 1;
EA = 1;
#else
{
EA = 0;
OUTPUT_IR = 0;
delay(520);/*9ms 10 us*//*0.173ms*/
OUTPUT_IR = 1;
#ifdef IRREP
if(repeat_flag == 1)
{
delay(130);/*2.25ms 10 us*//*0.173ms*/
OUTPUT_IR = 0;
delay(30);/*0.565ms 10 us*//*0.173ms */
OUTPUT_IR = 1;
repeat_flag =0 ;
EA = 1;
return;
}
#endif
delay(260);/*4.5ms 10 us*//*0.173ms*/
OUTPUT_IR = 0;
Nec_send_vaule(0xff);
Nec_send_vaule(0x00);
//code_value = ~code_value;
Nec_send_vaule(code_value);
code_value = ~code_value;
Nec_send_vaule(code_value);
delay(30);/*0.565ms 10 us*//*0.173ms */
OUTPUT_IR = 1;
delay(100);/*1.69ms 10 us 停止位!!!!*//*0.173ms*/
OUTPUT_IR = 0;
delay(30);/*0.565ms 10 us*//*0.173ms */
OUTPUT_IR = 1;
EA = 1;
}
#endif
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -