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