📄 ir.h
字号:
unsigned char ir_rx_complete_flag=0;
unsigned char bitcnt=0;
unsigned char user_code=0;
unsigned char operate_code=0;
unsigned char codebegin;
unsigned int ir_num;
void spk(void)
{
PORTD&=~BIT(PD7);
delay_ms(100);
PORTD|=BIT(PD7);
}
#pragma interrupt_handler timer1_capt_isr:iv_TIM1_CAPT
void timer1_capt_isr(void)
{
//timer 1 input capture event, read (int)value in ICR1 using;
// value=ICR1L; //Read low byte first (important)
// value|=(int)ICR1H << 8; //Read high byte and shift into top byte
static unsigned int oldFall;
unsigned int temp,newFall;
newFall=ICR1;
temp=newFall-oldFall; //计算脉冲加间隔的时间
oldFall=newFall;
if(temp>100&&temp<1500) //判断数据0信号
{
temp=0;
bitcnt++;
if(bitcnt<16)//开始接收前16位
user_code<<=1;
else if(bitcnt<32)//开始接收后16位
operate_code<<=1;
else if(bitcnt==32)//接收完最后一位
{
ir_rx_complete_flag=1;
bitcnt=40;
}//接收完最后一位
}
else if(temp>1500&&temp<4000)//判断数据1信号
{
temp=1;
bitcnt++;
if(bitcnt<16) //开始接收前16位
{
user_code++;
user_code<<=1;
}
else if(bitcnt==16)
user_code++;
else if(bitcnt<32) //开始接收后16位
{
operate_code++;
operate_code<<=1;
}
else if(bitcnt>=32)
{
operate_code++;
ir_rx_complete_flag=1;//接收完最后一位
bitcnt=40;
return;
}
}
else if(temp>10000&&temp<15000) //判断引导码信号,返回,等待下次开始接收
{
codebegin=1;
bitcnt=0;
user_code=0;
operate_code=0;
}
}
void get_ir_code(void)
{
if(ir_rx_complete_flag==1)
{
if((codebegin==1)&&(bitcnt==40))
{
switch(operate_code)
{
case 0x04: ir_num=0;break;//0
case 0x84: ir_num=1;break;//1
case 0x44: ir_num=2;break;//2
case 0xc4: ir_num=3;break;//3
case 0x24: ir_num=4;break;//4
case 0xa4: ir_num=5;break;//5
case 0x64: ir_num=6;break;//6
case 0xe4: ir_num=7;break;//7
case 0x14: ir_num=8;break;//8
case 0x94: ir_num=9;break;//9
case 0xe8: ir_num=10;break;//取消
case 0x49: ir_num=11;break;//确认
case 0x78: ir_num=12;break;//左
case 0x98: ir_num=13;break;//右
case 0xf8: ir_num=14;break;//前
case 0x18: ir_num=15;break;//后
case 0x2d: ir_num=16;break;
case 0xc8: ir_num=17;break;
case 0x20: ir_num=18;break;
case 0xc0: ir_num=19;break;
case 0x3e: ir_num=20;break;
case 0x89: ir_num=21;break;
case 0xda: ir_num=22;break;
case 0x5a: ir_num=23;break;
case 0xde: ir_num=24;break;
case 0x9e: ir_num=25;break;
case 0xb9: ir_num=26;break;
case 0x38: ir_num=27;break;
default: break;
}
LCD_write_data(10,0,operate_code);
if(ir_num<28)
{
codebegin=0;
spk();
}
ir_rx_complete_flag=0;
bitcnt=0;
operate_code=0;
user_code=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -