/***************************************
* 文件名: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;
}
}
}
|