|
//*********************************************************
/* 文件名:TEST_61F02x_Timer2.c
* 功能: FT61F02x-Time2功能演示
* IC: FT61F023 SOP16
* 晶振: 16M/2T
* 說(shuō)明: 當(dāng)DemoPortIn懸空或者高電平時(shí),
* DemoPortOut輸出5KHz占空比50%的波形-Tm2實(shí)現(xiàn)
* 當(dāng)DemoPortIn接地時(shí),DemoPortOut輸出高電平.關(guān)定時(shí)器
* FT61F023 SOP16
* ----------------
* VDD-----------|1(VDD) (VSS)16|-----------GND
* NC------------|2(PA7) (PA0)15|------------NC
* NC------------|3(PA6) (PA1)14|------------NC
* NC------------|4(PA5) (PA2)13|------------NC
* DemoPortIn----|5(PC3) (PA3)12|---DemoPortOut
* NC------------|6(PC2) (PC0)11|------------NC
* NC------------|7(PA4) (PC1)10|------------NC
* NC------------|8(PC5) (PC4)09|------------NC
* ----------------
*/
//*********************************************************
#include "SYSCFG.h"
//#include "Infrared_Rece_5104.h"
//**********************************************************
#define REC PA4 //紅外接收IO,用戶請(qǐng)將相應(yīng)IO設(shè)置為輸入
#define BootCode 0x0D //引導(dǎo)碼
typedef union
{
unsigned char all;
struct
{
unsigned b0:1;
unsigned b1:1;
unsigned b2:1;
unsigned b3:1;
unsigned b4:1;
unsigned b5:1;
unsigned b6:1;
unsigned b7:1;
}one;
}bits;
volatile unsigned char RecCode; //5104碼除去引導(dǎo)碼 后的用戶碼
volatile bits RecWork; //工作位域
#define Rflag RecWork.all
#define Flag_RecOne RecWork.one.b0 //收到5104碼標(biāo)志位
void RecServer();
void InfraredReception(); //接收函數(shù),在中斷中調(diào)用
//***********************宏定義*****************************
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
//#define GREEN RA7 //0開(kāi) 1關(guān)
#define Led1 PA7
#define Led2 PC3 //1開(kāi) 0關(guān)
volatile bit B_MainLoop;
/*-------------------------------------------------
* 函數(shù)名:POWER_INITIAL
* 功能: 上電系統(tǒng)初始化
* 輸入: 無(wú)
* 輸出: 無(wú)
--------------------------------------------------*/
//********************************************************
//**************中斷處理**********************************
void interrupt ISR(void) //PIC_HI-TECH使用
{
static unsigned char times;
//定時(shí)器2的中斷處理**********************
if(TMR2IE && TMR2IF) //100us中斷一次
{
TMR2IF = 0;
if(++times >= 20)//20*125us = 2.5ms
{
times = 0;
B_MainLoop = 1;
}
InfraredReception(); //調(diào)用紅外接收函數(shù)
}
}
/*-------------------------------------------------
* 函數(shù)名:POWER_INITIAL
* 功能: 上電系統(tǒng)初始化
* 輸入: 無(wú)
* 輸出: 無(wú)
--------------------------------------------------*/
void POWER_INITIAL (void)
{
OSCCON = 0B01110001; //WDT 32KHZ IRCF=111=16MHZ/2=8MHZ,0.125US/T
//Bit0=1,系統(tǒng)時(shí)鐘為內(nèi)部振蕩器
//Bit0=0,時(shí)鐘源由FOSC<2:0>決定即編譯選項(xiàng)時(shí)選擇
INTCON = 0; //暫禁止所有中斷
PORTA = 0B00000000;
TRISA = 0B00010000; //PA輸入輸出 0-輸出 1-輸入
//PA3->輸出
PORTC = 0B00000000;
TRISC = 0B00000000; //PC輸入輸出 0-輸出 1-輸入
WPUA = 0B00010000; //PA端口上拉控制 1-開(kāi)上拉 0-關(guān)上拉
WPUC = 0B00000000; //PC端口上拉控制 1-開(kāi)上拉 0-關(guān)上拉
OPTION = 0B00001000; //Bit3=1 WDT MODE,PS=000=1:1 WDT RATE
//Bit3 預(yù)分頻器分配位 0-Timer0 1-WDT
//Bit7(PAPU)=0 ENABLED PULL UP PA
MSCKCON = 0B00000000; //Bit6->0,禁止PA4,PC5穩(wěn)壓輸出
//Bit5->0,TIMER2時(shí)鐘為Fosc
//Bit4->0,禁止LVR
CMCON0 = 0B00000111; //關(guān)閉比較器,CxIN為數(shù)字IO口
}
/*-------------------------------------------------
* 函數(shù)名稱: TIMER2_INITIAL
* 功能: 初始化設(shè)置定時(shí)器2
* 相關(guān)寄存器: T2CON TMR2 PR2 TMR2IE TMR2IF PEIE GIE
-------------------------------------------------*/
void TIMER2_INITIAL (void)
{
T2CON = 0B00000001; //Bit[1,0]=01,T2時(shí)鐘分頻 1:4
//Bit[6-3]=0000,T2輸出時(shí)鐘分頻1:1
TMR2 = 0; //TMR2賦初值
PR2 = 200; //設(shè)置TMR2輸出比較值定時(shí)100us=(1/16000000)*2*4*200(PR2)
//16M-2T-4分頻
TMR2IF = 0; //清TIMER2中斷標(biāo)志
TMR2IE = 1; //使能TIMER2的中斷
TMR2ON = 1; //使能TIMER2啟動(dòng)
PEIE=1; //使能外設(shè)中斷
GIE = 1; //使能全局中斷
}
/***********************************************
函數(shù)名稱:RecServer
函數(shù)功能:5104紅外接收按鍵處理
入口參數(shù):無(wú)
出口參數(shù):無(wú)
備注:
************************************************/
void RecServer()
{
if(1 == Flag_RecOne)
{
Flag_RecOne = 0;
switch(RecCode)
{
case 0x0A: Led1 = ~Led1; break;//測(cè)試
case 0x15: Led1 = ~Led1; break;//測(cè)試
case 0x19: Led1 = ~Led1; break;//測(cè)試
//case 0x82: Led1 = ~Led1; break;//開(kāi)/風(fēng)速
//case 0x81: Led1 = ~Led1; break;//關(guān)機(jī)
// case 0x90: Led2 = ~Led2; break;//搖頭
// case 0x84: Led1 = ~Led1; break;//風(fēng)類
// case 0xc3: Led1 = ~Led1; break;//彩燈
//case 0x88: Led2 = ~Led2; break;// 定時(shí)
default:break;
}
}
}
/***********************************************
函數(shù)名稱:InfraredReception
函數(shù)功能:5104紅外接收解碼
入口參數(shù):無(wú)
出口參數(shù):無(wú)
備注:
************************************************/
void InfraredReception()
{
static unsigned char rlow = 0,rhigh = 0,rcount = 0,rdata = 0;
if(!REC)
rlow++; //低電平計(jì)時(shí)
else if(0 == rlow)
{
rhigh++; //高電平計(jì)時(shí)
if(rhigh & (0x20)) //持續(xù)4ms高電平,重新接受引導(dǎo)碼
{
Rflag &= 0b11101111;
rdata = 0;
if(rhigh & (0x80)) //持續(xù)20ms高電平,重新收碼
{
RecCode = 0;
rhigh = 0;
Rflag &= 0b01111111;
}
}
}
else
{
rdata <<= 1;
if(rlow >= (0x8)) //上升沿,判斷碼值,低電平大于1ms為1,否則為0
rdata |= 0x01;
rlow = 0;
rhigh = 0;
if(0 == (Rflag & 0x10)) //是否已經(jīng)收到了引導(dǎo)碼
{
if(BootCode == (rdata & 0x0f)) //還未收到引導(dǎo)碼,判斷是否是正確的引導(dǎo)碼
{
Rflag |= 0x10; //收到引導(dǎo)碼標(biāo)志
rcount = 0; //準(zhǔn)備接收數(shù)據(jù)碼
rdata = 0;
}
}
else
{
rcount++;
if(rcount & 0x8) //8位數(shù)據(jù)碼接收完成
{
if(RecCode == rdata) //收到2幀相同的碼才處理
{
if(0 == (Rflag & 0x80)) //已經(jīng)響應(yīng)過(guò)了,不再重復(fù)處理
{
Rflag |= 0x01; //收到按鍵碼標(biāo)志
Rflag |= 0x80; //用于判斷長(zhǎng)按鍵的標(biāo)志,持續(xù)20ms高電平才清零
}
}
else
RecCode = rdata;
}
}
}
}
/*-------------------------------------------------
* 函數(shù)名: main
* 功能: 主函數(shù)
* 輸入: 無(wú)
* 輸出: 無(wú)
--------------------------------------------------*/
void main()
{
POWER_INITIAL(); //系統(tǒng)初始化
TIMER2_INITIAL(); //初始化T2
while(1)
{
if(B_MainLoop) //2.5ms執(zhí)行一次
{
B_MainLoop = 0;
RecServer(); //紅外接收處理
//Led2 = 1;
}
}
}
|
|