?? decode.c
字號:
//====================================================================================
//文 件 名: Decode.c
//功能描述: 紅外接收頭的遙控器接收譯碼程序
//維護記錄: 2006年6月16 by hongyan.Feng
//====================================================================================
#include "SPCE061A.h"
unsigned int STime=0x0084; //定義起始位的低電平持續時間//0x00f5
unsigned int HLTime=0x0020; //定義高電平(其實是邏輯1)的持續時間//0x0020
unsigned int iData=0x0080; //鎖存I/O口讀到的數據
unsigned int iCounter=0; //用來計數
//====================================================================================
//語法格式: void RN_Initial(void)
//功能描述: 紅外接收頭的端口初始化函數
//入口參數: 無
//出口參數: 無
//維護記錄: 2006年6月26 by hongyan.Feng
//====================================================================================
void RN_Initial(void)
{
*P_IOA_Dir = 0xff00; //初始化IOA7為帶上拉電阻的輸入口(紅外接收頭的數據輸入口)
*P_IOA_Attrib = 0xff00;
*P_IOA_Data = 0x0080;
}
//====================================================================================
//語法格式: unsigned int Decode(void)
//功能描述: 紅外接收頭的遙控器譯碼函數
//入口參數: 無
//出口參數: 譯碼后數據
//維護記錄: 2006年6月26 by hongyan.Feng
//====================================================================================
unsigned int Decode(void)
{
unsigned int iCode=0; //用來存儲譯碼
unsigned int Flag,i,SFlag=0;
unsigned int j;
unsigned int iTest[8]; //存儲各個碼讀到的高電平持續時間,以便譯碼
Flag = 0;
i = 0;
iCode = 0;
*P_TimerA_Ctrl = 0x0000; //TimerA的頻率設置為fosc/2
*P_TimerA_Data = 0xFEB4; //設置38KHz的計數頻率
*P_INT_Ctrl = 0x1000; //允許IRQ1中斷
__asm("INT IRQ"); //開IRQ中斷
while(iData==0x0080) //如果讀到IOA8口的值為1,循環讀IOA8口的值,等待起始標志到來。----沒有信號時HS0038輸出高電平
{
*P_Watchdog_Clear = 0x0001;
}
iCounter = 0;
while(iData==0) //讀低電平
{
*P_Watchdog_Clear = 0x0001;
}
if(iCounter>STime) //判斷讀到的低電平是否為起始標志----根據觀察波形,這個起始位的持續時間是15ms(38*15/2)
{
SFlag = 1; //如果是,起始標志置1
iCounter = 0;
}
while(SFlag == 1) //讀數據----主要是讀8位碼高電平的持續時間
{
while(iData==0x0000) //如果讀到是低電平,等待高電平到來
*P_Watchdog_Clear = 0x0001;
iCounter = 0;
while(iData==0x0080) //讀到高電平,循環等待下跳沿的到來
{
*P_Watchdog_Clear = 0x0001;
}
iTest[i] = iCounter; //下跳沿到來,保存高電平持續時間
i++;
if(i>7) //判斷8位是否已經讀完
{
SFlag = 0; //已經讀完,清起始標志,以便下一次讀取
i = 0;
}
}
if(iTest[0]>HLTime) //先譯第一位碼
iCode |= 1;
for(j=1;j<8;j++) //譯剩余7位碼
{
if(iTest[j]>HLTime) //1的譯碼,這個HLTime可以通過示波器觀察得到,需要一定的余量
{
iCode = iCode<<1;
iCode |= 1;
}
else //0的譯碼
{
iCode = iCode<<1;
iCode |= 0;
}
*P_Watchdog_Clear = 0x0001;
}
iCode &= 0x00ff; //取得最終的譯碼值
*P_Watchdog_Clear = 0x0001;
return iCode;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -