/*****************************************
*函數(shù)名稱:ir_drive
*功 能:NEC紅外解碼
*調(diào)用時間:定時器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;
}
}
|