STM32F103红外遥控长按加减音量

2019-07-20 02:38发布

如题所示,怎么设置判断红外按键的长按与短按,判断连发码么?下面是定时器5中断服务程序,求大佬指教!!!
void TIM5_IRQHandler(void)
{                  
    if(TIM_GetITStatus(TIM5,TIM_IT_Update)!=RESET)
    {
        if(RmtSta&0x80)//上次有数据被接收到了
        {   
            RmtSta&=~0X10;                        //取消上升沿已经被捕获标记
            if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集
            if((RmtSta&0X0F)<14)RmtSta++;
            else
            {
                RmtSta&=~(1<<7);//清空引导标识
                RmtSta&=0XF0;    //清空计数器   
            }                                    
        }                                
    }
     if(TIM_GetITStatus(TIM5,TIM_IT_CC2)!=RESET)
    {      
        if(RDATA)//上升沿捕获
        {

            TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Falling);        //CC1P=1 设置为下降沿捕获               
            TIM_SetCounter(TIM5,0);           //清空定时器值
            RmtSta|=0X10;                    //标记上升沿已经被捕获
        }else //下降沿捕获
        {            
               Dval=TIM_GetCapture2(TIM5);//读取CCR1也可以清CC1IF标志位
             TIM_OC2PolarityConfig(TIM5,TIM_ICPolarity_Rising); //CC4P=0    设置为上升沿捕获
            
            if(RmtSta&0X10)                    //完成一次高电平捕获
            {
                 if(RmtSta&0X80)//接收到了引导码
                {
                    
                    if(Dval>300&&Dval<800)            //560为标准值,560us
                    {
                        RmtRec<<=1;    //左移一位.
                        RmtRec|=0;    //接收到0      
                    }else if(Dval>1400&&Dval<1800)    //1680为标准值,1680us
                    {
                        RmtRec<<=1;    //左移一位.
                        RmtRec|=1;    //接收到1
                    }else if(Dval>2200&&Dval<2600)    //得到按键键值增加的信息 2500为标准值2.5ms
                    {
                        RmtCnt++;         //按键次数增加1次
                        RmtSta&=0XF0;    //清空计时器        
                    }
                 }else if(Dval>4200&&Dval<4700)        //4500为标准值4.5ms
                {
                    RmtSta|=1<<7;    //标记成功接收到了引导码
                    RmtCnt=0;        //清除按键次数计数器
                }                        
            }
            RmtSta&=~(1<<4);
        }                                                            
    }
TIM_ClearFlag(TIM5,TIM_IT_Update|TIM_IT_CC2);        
}


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。