OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2984|回复: 2

STM32F103红外遥控长按加减音量

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-3-22
在线时间
9 小时
发表于 2019-4-10 09:36:04 | 显示全部楼层 |阅读模式
5金钱
如题所示,怎么设置判断红外按键的长按与短按,判断连发码么?下面是定时器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);        
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

153

主题

310

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2019-3-26
在线时间
18 小时
发表于 2019-4-10 14:17:57 | 显示全部楼层
http://www.iis7.com/c/90/
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2019-3-22
在线时间
9 小时
 楼主| 发表于 2019-4-10 19:09:38 | 显示全部楼层

感谢!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-10 09:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表