/***************************************
* 文件名:0722-LED_Infrared.prj
* IC:FT61F022A
* 功能:使用紅外遙控控制LED燈的亮度
* 時間:2020-07-22
****************************************/
#include "SYSCFG.h";
/***********************宏定義**************************/
#define unchar unsigned char
#define unint unsigned int
#define unlong unsigned long
#define LED_S2 RA6
#define LED_S1 RC3
#define IR_Input RC1
/******************************************************/
void Ir_work(void);
volatile bit bit_bit;
volatile bit IR_Input_Old;
volatile bit REC_DATA_OK;
volatile bit REC_BIT_OK;
volatile unsigned char bit_count;
volatile unsigned char byte_count;
volatile unsigned char irdata[4];
volatile unsigned char irtime;
/*-------------------------------------------------
* 函數名: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 = 0B10111111; //PA輸入輸出 0-輸出 1-輸入
//PA6->輸出
PORTC = 0B00000000;
TRISC = 0B11110111; //PC輸入輸出 0-輸出 1-輸入
WPUA = 0B00000000; //PA端口上拉控制 1-開上拉 0-關上拉
WPUC = 0B00000010; //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
//But4->0,禁止LVR
CMCON0 = 0B00000111; //關閉比較器,CxIN為數字IO口
ANSEL=0X0B00000000;
}
/*-------------------------------------------------
* 函數名稱: TIMER1_INITIAL
* 功能: 初始化設置定時器1
* 相關寄存器: T1CON TMR1H TMR1L TMR1IE TMR1ON PEIE GIE
-------------------------------------------------*/
void TIMER1_INITIAL (void)
{
//需要在中斷里重新賦初始值
T1CON = 0B00000000; //B[5:4]=00,T2時鐘分頻 1:1
//B1=0,T1時鐘源選擇內部時鐘
//T1SYNC=16M/2T=8M=0.125US
TMR1L = 0XC0; //定時500US=>TMR1=8000*0.125US=1MS
//初值=65536-8000=57,536=>0XE0C0
TMR1H = 0XE0; //賦初值=>TMR1H=E0;TMR1L=0XC0
// TMR1L = (65536 - 40000) % 256;
// TMR1H = (65536 - 40000) / 256;
// TMR1L =0XA0;
// TMR1H =0XFF;
TMR1IE = 1; //使能TMER1的中斷
TMR1ON = 1; //使能TMER1啟動
PEIE = 1; //使能外設中斷
GIE = 1; //使能全局中斷
}
/**************中斷處理**********************************/
void interrupt ISR(void) //PIC_HI-TECH使用
{
if(TMR1IF)
{
TMR1IF = 0;
TMR1L = 0XE0; //定時500US=>TMR1=8000*0.125US=1MS
//初值=65536-8000=57,536=>0XE0C0
TMR1H = 0XFC; //100US
//LED_S1=1;
if(IR_Input&&irtime<100)
{
irtime++;
}
if(IR_Input==0)
{
if(IR_Input_Old==1)
{
if(irtime>1&&irtime<10)
{bit_bit=0;REC_BIT_OK=1;}
else if(irtime>9&&irtime<21)
{bit_bit=1;REC_BIT_OK=1;}
else if(irtime>40)
{
REC_BIT_OK=0;
bit_count=0;
byte_count=0;
}
}
irtime=0;
}
IR_Input_Old=IR_Input;
if(REC_BIT_OK==1&&REC_DATA_OK==0)
{
irdata[byte_count]<<=1;
if(bit_bit)
irdata[byte_count]|=0x01;
else
irdata[byte_count]&=0xfe;
bit_count++;
if(bit_count>7)
{
byte_count++;
if(byte_count>3)
REC_DATA_OK=1;
bit_count=0;
}
REC_BIT_OK=0;
}
// LED_S1=0;
}
}
/*------------------------------------------------
鍵碼對應的按鍵
------------------------------------------------*/
void Ir_work(void)//紅外鍵值散轉程序
{
if(irdata[0]==0x80&&irdata[1]==0x75&&(irdata[2]=255-irdata[3]))
{
if(irdata[2] ==0x78)//off
{
if(LED_S1)
LED_S1=0;
else
LED_S1=1;
}
if(irdata[2] ==0x00)//+
{
}
if(irdata[2] ==0x00)//-
{
}
}
}
/*****主函數********/
void main()
{
POWER_INITIAL();
TIMER1_INITIAL();
while(1)
{
if(REC_DATA_OK)
{
Ir_work();
REC_DATA_OK = 0;
}
}
}
|