// http://blog.csdn.net/yingqiyingqi/article/details/7425047
void EXTI_init(void)
{
EXTI_CR1_PCIS = 2; // PC口下降沿触发中断
}
void TIM1_init(void)
{
CLK_PCKENR1|=0x80; //开启定时器1外设时钟
TIM1_PSCRH = 0; // 8M系统时钟经预分频f=fck/(PSCR+1)
TIM1_PSCRL = 15; // PSCR=0x1F3F,f=8M/(15+1)=1/2MHz,每个计数周期2US
TIM1_ARRH = 0xff; // 自动重载寄存器ARR=0xffff=130ms
TIM1_ARRL = 0xff;
TIM1_IER_UIE = 1; // 允许更新中断
TIM1_EGR_UG = 1; //产生更新事件
TIM1_CR1_ARPE = 1; // 自动装载
TIM1_CR1_CEN = 0; // 禁止计数 定时器1关
}
#pragma vector=0x02
__interrupt void EXTI_PC3_TLI(void)
{
switch(IR_ID)
{
//解码开始
case 0:
{
IR_ID=1;
TIM1_CR1_CEN =1;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
}
break;
//同步码头
case 1:
{
TIM1_CR1_CEN =0; //定时器1关
HIGH_WORD=TIM1_CNTRH; //保存高低字节
LOW_WORD=TIM1_CNTRL;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1_CEN =1; //定时器1开
SURGE_INTERVAL=0; //测量数据整开
SURGE_INTERVAL=(u16)HIGH_WORD;
SURGE_INTERVAL=SURGE_INTERVAL<<8;
SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD;
bak1=SURGE_INTERVAL;
nop();
//引导码捕捉
if(SURGE_INTERVAL>=6300&&SURGE_INTERVAL<=7300)
{
IR_ID=2; //遥控头获得位置1
SURGE_COUNT=0;
}
else
{
IR_ID=0;
}
}
break;
//解码
case 2:
{
TIM1_CR1_CEN =0; //定时器1关
HIGH_WORD=TIM1_CNTRH; //保存高低字节
LOW_WORD=TIM1_CNTRL;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1_CEN =1; //定时器2开
SURGE_INTERVAL=0; //测量数据整开
SURGE_INTERVAL=(u16)HIGH_WORD;
SURGE_INTERVAL=SURGE_INTERVAL<<8;
SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD;
if(SURGE_COUNT<32)
{
if(SURGE_INTERVAL>=500&&SURGE_INTERVAL<=650)//0码
{
IR_CODE=IR_CODE<<1;
SURGE_COUNT++;
}
else if(SURGE_INTERVAL>=1000&&SURGE_INTERVAL<=1300)//1码
{
IR_CODE=IR_CODE<<1;
IR_CODE=IR_CODE|0x0001;
SURGE_COUNT++;
}
else
{
IR_ID=0;
IR_CODE=0;
SURGE_COUNT=0;
}
break;
}
else
{
IR_COMPLAT=1;
IR_ID=3;
SURGE_COUNT=0;
IR_REPEAT_COUNT=0; //IR重复码清零
break;
}
}
break;
case 3:
{
TIM1_CR1_CEN =0; //定时器1关
HIGH_WORD=TIM1_CNTRH; //保存高低字节
LOW_WORD=TIM1_CNTRL;
TIM1_CNTRH=0;
TIM1_CNTRL=0;
TIM1_CR1_CEN =1; //定时器1开
SURGE_INTERVAL=0; //测量数据整开
SURGE_INTERVAL=(u16)HIGH_WORD;
SURGE_INTERVAL=SURGE_INTERVAL<<8;
SURGE_INTERVAL=SURGE_INTERVAL|LOW_WORD;
if(SURGE_INTERVAL>=5000&&SURGE_INTERVAL<=8000) //100ms为连加信号
{
IR_REPEAT_FOLLOW_UP=1;
IR_ID=3;
if(IR_REPEAT_COUNT<250)
{
IR_REPEAT_COUNT++;
}
}
}
break;
default:
break;
}
}
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF(void)
{
TIM1_SR1 = 0; // 清除更新中断标记
TIM1_CNTRH=0;
TIM1_CNTRL=0;
IR_ID=0;
printf("连按次数: %d\n\r", IR_REPEAT_COUNT);
TIM1_CR1_CEN =0;
IR_REPEAT_COUNT=0;
}