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