stm8 红外解码 使用TL IO中断与定时实现(芯片用103)

//  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;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值