#include <c8051f020.h> // SFR 声明
unsigned char xdata Ir_Data[3]={0,0,0}; //Ir_Data[0]-->设备用户识别码; Ir_Data[1]-->设备用户识别码反码
//Ir_Data[2]-->操作码(键值码); Ir_Data[2]-->操作码(键值码)反码
unsigned char xdata IrKeyVal=0; //解码键值
bit IrKey_sign=0; //按键标志,值1表示是红外按键,值2表示是7290按键
unsigned char Bit_Cnt=0; //红外解码数据接受标识位一帧数据共有4个字节共32位
/***************************************************************************************
**函数名称: PCA0_Init
**函数功能: PCA0初始化
**输入参数: 无
**输出参数: 无
***************************************************************************************/
void PCA0_Init (void) //PCA0初始化
{
PCA0MD = 0x00; //PCA0采用系统时钟12分频,禁止PCA0溢出中断
EIE1 |= 0x08; //允许PCA0中断
PCA0CPM0 = 0x11; //模块0下降沿中断允许
CR = 0; //关PCA0
}
/***************************************************************************************
**函数名称: PCA0_INT
**函数功能: PCA0中断处理
**输入参数: 无
**输出参数: 无
***************************************************************************************/
void PCA0_INT (void) interrupt 9
{
static unsigned char Irdata; //用于保存红外接收到的数据
static unsigned char oldFall; //用于保存前一次下降沿中断时定时器PCA的数值
unsigned char temp,newFall; //用于保存本次下降沿中断时定时器PCA的数值
EA=0; //关总中断,清中断标志位,此步骤不可少
CCF0=0;
newFall=PCA0CPH0; //读取捕获寄存器的高八位数
temp=newFall-oldFall; //计算脉冲加间隔的时间
oldFall=newFall;
if(temp>=6&& temp<11) // "0"码
{
temp=0x00;
Bit_Cnt++;
}
else
if(temp>10 && temp<=0x15) //"1"码
{
temp=0x80;
Bit_Cnt++;
}
else
if(temp>=0x59&& temp<=0x65) //引导码信号
{
Bit_Cnt=0;
Ir_Data[0]=0;
Ir_Data[1]=0;
Ir_Data[2]=0;
Ir_Data[3]=0;
EA=1;
return; //返回,等待下次开始接收
}
else //干扰信号
{
Bit_Cnt=0;
EA=1;
return;
}
Irdata=Irdata|(unsigned char)temp;//将接收到的一位数据放在Irdata的高位
switch(Bit_Cnt)
{
case 8: //第一字节数据
Ir_Data[0]=Irdata;
Irdata=0;
break;
case 16: //第二字节数据
Ir_Data[1]=Irdata;
Irdata=0;
break;
case 24: //第三字节数据
Ir_Data[2]=Irdata;
Irdata=0;
break;
case 32: //第四字节数据
Ir_Data[3]=Irdata;
Bit_Cnt=0;
IrKey_sign=1;//一个按键数据发送完毕
IrKeyVal=Ir_Data[2];
break;
default:
break;
}
Irdata=Irdata>>1;//接收到的数据低位在前先发送
EA=1;
} |