#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;
} |