📄 ir.c
字号:
#include <avr/io.h>
#include <util/delay.h>
#include<avr/interrupt.h>
#include "IR.h"
//---------------------------------------------------------------
uchar date[4]={0,0,0,0};//date数组为存放地址原码,反码,数据原码,反码
uchar ike;
//-----------------------------------------------------------------------------------
/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/
uchar IR_decode(void)
{
uchar ir_n,irnm,irn,i,j;
while(ir_0 );
delay10us(240);
if(ir_1 ) //延时2.4ms后如果是高电平则是新码
{
delay10us(200);
for(i=0;i<4;i++)
{
for(j=0;j<8;j++)
{
while(ir_0 ); //等待地址码第1位高电平到来
delay10us(84); //延时882us判断此时引脚电平
if(ir_0 )
{
date[i]>>=1;
date[i]=date[i]|0x00;
}
else if(ir_1 )
{
delay10us(100);
date[i]>>=1;
date[i]=date[i]|0x80;
}
} //1位数据接收结束
} //32位二进制码接收结束
}
irn=~date[3];
//--------------------------------------
if(date[2]==irn)
{
ir_n=date[2];
if(ir_n==0x0F){irnm=10;}
else if(ir_n==0x14){irnm=9;}
else irnm=0;
if(ir_n==0x56){irnm=17;date[2]=0;}
if(ir_n==0x1b){irnm=6;date[2]=0;}
if(ir_n==0x11){irnm=7;date[2]=0;}
if(ir_n==0x15){irnm=8;date[2]=0;}
if(ir_n==0x17){irnm=11;date[2]=0;}
if(ir_n==0x1E){irnm=12;date[2]=0;}
if(ir_n==0x5B){irnm=13;date[2]=0;}
return irnm;
}
else return 0;
//---------------------------------------
}
/*------------------------外部中断0程序-------------------------*/
/*------------------主要用于处理红外遥控键值--------------------*/
SIG_INTERRUPT0(void)
{
uchar i; uchar k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效
cli(); //检测到有效信号关中断,防止干扰
ir_in;
ir_on;
for(i=0;i<4;i++)
{
delay10us(100);
if(ir_1 ){k=1;} //刚开始为9ms的引导码.
}
if(k==0)
{
//检测到有效信号关中断,防止干扰
ike=IR_decode(); //如果接收到的是有效信号,则调用解码程序
delay10us(240);
delay10us(240);
delay10us(240);
delay10ms(7);
}
sei(); //开外部中断,允许新的遥控按键
//---------------------------------------------
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -