/*****************************************
*函数名称:ir_drive
*功 能:NEC红外解码
*调用时间:定时器125us中断
******************************************/
typedef union{
struct{
unsigned char bit0:1;
unsigned char bit1:1;
unsigned char bit2:1;
unsigned char bit3:1;
unsigned char bit4:1;
unsigned char bit5:1;
unsigned char bit6:1;
unsigned char bit7:1;
}bits;
unsigned char byte;
}bit_struct;
#define ir_io FP51
volatile bit_struct ir_flag;
volatile unsigned char ir_phase,ir_l_count,ir_h_count,ir_recv_bit_count;
volatile unsigned char ir_buf_tem,ir_buf[4];//[0]地址[1]地址反码[2]键值[3]键值反码
#define ir_io_stare ir_flag.bits.bit0
#define ir_io_stare_old ir_flag.bits.bit1
#define ir_ok ir_flag.bits.bit2
#define ir_repeat ir_flag.bits.bit3
void ir_drive(void)
{
ir_io_stare = ir_io;
if(ir_io_stare)
{
if(ir_l_count != 0)
ir_h_count++;
}
else
{
ir_l_count++;
}
if(ir_io_stare_old != ir_io_stare)
{
ir_io_stare_old = ir_io_stare;
if(ir_io_stare_old == 0)
{
if(ir_phase == 0)
{//9ms低电平+4.5ms高电平
if(ir_l_count >= 60)
{
if(ir_h_count >= 31)
{//起始码
ir_phase++;
ir_recv_bit_count = 0;
}
else if(ir_h_count >= 15)
{//重复码
ir_buf_tem++;
if(ir_buf_tem > 4)
{
ir_buf_tem = 0;
ir_repeat = 1;
}
}
}
}
else if(ir_phase == 1)
{//解码,1:560us低电平+1690us高电平
if(ir_l_count >= 2)
{
ir_buf_tem <<= 1;
if(ir_h_count >= 11)
{
ir_buf_tem++;
}
ir_buf[ir_recv_bit_count/8] = ir_buf_tem;
ir_recv_bit_count++;
if(ir_recv_bit_count == 32)
{
ir_recv_bit_count = 0;
ir_phase = 0;
ir_buf_tem = 0;
ir_ok = 1;
}
}
else
ir_phase = 0;
}
ir_h_count = 0;
ir_l_count = 0;
}
}
}
void ir_task(void)
{
if(ir_ok)
{
ir_ok = 0;
}
if(ir_repeat)
{
ir_repeat = 0;
}
}
|