volatile uint data0,data1,data2,bitcnt,oldFall,temp,newFall;
uchar shu[2];
uchar workcode;
/*===============IO口初始化函数===================
函数名称:IO口初始化
函数功能:对所需要用到的端口进行初始化
返回值:无
================================================*/
void code_io_init()
{
DDRD&=~BIT(7);
PORTD|=BIT(7); //定时器输入捕获功能引脚配置为带上拉输入
}
/*===============定时器1初始化函数===============
函数名称:定时器1初始化
函数功能:开启定时器1的输入捕获功能,8分频、下降沿输入捕获
返回值:无
================================================*/
void timer_init()
{
TCCR1A=0X00;
TCCR1B = 0x82; //T1进行8分频,捕捉噪声抑制,下降沿触发输入捕捉
TCNT1H=0; //T1高八位数据寄存器的初值(往返1cm要58us)
TCNT1L=0;//T1低八位数据寄存器的初值
TIMSK|=BIT(5);//输入捕捉中断使能
TIMSK|=BIT(2);//T1溢出中断使能位
SREG|=BIT(7);//开总中断 红外编码数据处理函数函数
}
/*===============红外编码数据处理函数====================
功能:红外编码数据处理
返回值:result
参数:pp
========================================================*/
uchar workIRcode(uchar pp)
{
uchar result;
switch(pp)
{
case 0xB0: result=0; break; //0
case 0x30: result=1; break; //1
case 0x18: result=2; break; //2
case 0x7A: result=3; break; //3
case 0x10: result=4; break; //4
case 0x38: result=5; break; //5
case 0x5A: result=6; break; //6
case 0x42: result=7; break; //7
case 0x4A: result=8; break; //8
case 0x52: result=9; break; //9
case 0x68: result=10; break; //-
case 0x98: result=11; break; //+
case 0xE2: result=12; break; //菜单 MODE
case 0xC2: result=13; break; //OK EQ
case 0xA8: result=15; break; //上 快进
case 0xE0: result=16; break; //下 快退
//case 0x1a: result=17; break; 丽音
case 0x22: result=18; break; //静音(关闹钟)CH-
case 0x02: result=19; break; //声音(开闹钟)CH+
default: result=14; break; //别的键按下返回14
}
return result;
}
/*==========定时器1输入捕获中断向量函数==========
函数名称:输入捕获中断向量
函数功能:当满足输入捕获要求进入中断服务程序
返回值:接收到数据放在shu数组中,便于显示
================================================*/
#pragma interrupt_handler IceInt:6
//下降沿触发中断
void IceInt()
{
newFall=ICR1;
temp=newFall-oldFall; //计算脉冲加间隔的时间用于判断该为是0或1
oldFall=newFall;
if(temp>1024 && temp<1225) // "0"信号(左右浮动100us)产生的下降沿
{
temp=0;
}
else if(temp>2145 && temp<2345) //"1"信号(左右浮动100us)产生的下降沿
{
temp=1;
}
else if(temp>13400 && temp<13600) //header信号
{
bitcnt=0;
data0=0;
data1=0;
return; //返回(已经接收到引导码,等待下次开始接收数据)
}
else //干扰信号
{
return;
}
bitcnt++;
if(bitcnt<16) //开始接收前16位
{
data0=data0|(uint)temp;
data0=data0<<1;
}
else if(bitcnt==16)
{
data0=data0|(uint)temp;
}
else if(bitcnt<32) //开始接收后16位
{
data1=data1|(uint)temp;
data1=data1<<1;
}
else if(bitcnt==32) //接收完最后一位
{
bitcnt=0;
data1=data1|(uint)temp;
data2=data1/256; //获取32位数据的后16位
workcode=workIRcode(data2); //处理红外编码,返回键值
}
}
/*====================定时器1溢出中断向量函数==================
函数名称:溢出中断向量
函数功能:当定时器的定时模式下计数超过计数寄存器的值溢出进入中断
返回值:接收到数据放在shu数组中,便于显示
==============================================================*/
#pragma interrupt_handler timer1:9
void timer1()
{
TCNT1H=0x00;
TCNT1L=0x00; //设置定时器1初值
}