OpenEdv-开源电子网

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

关于mini开发板的红外遥控

[复制链接]

6

主题

13

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2016-8-9
在线时间
7 小时
发表于 2016-9-4 18:31:24 | 显示全部楼层 |阅读模式
1金钱
//遥控器接收状态
//[7]:收到了引导码标志
//[6]:得到了一个按键的所有信息
//[5]:保留       
//[4]:标记上升沿是否已经被捕获                                                                  
//[3:0]:溢出计时器
u8         RmtSta=0;                    
u16 Dval;                //下降沿时计数器的值
u32 RmtRec=0;        //红外接收到的数据                               
u8  RmtCnt=0;        //按键按下的次数       
void TIM5_IRQHandler(void)
{
        u16 tsr;
        tsr=TIM5->SR;
        if(tsr&0x01)//溢出
        {
                if(RmtSta&0x80)
                {
                        RmtSta&=~0x10;//取消上升沿已经被捕获标记
                        if((RmtSta&0X0F)==0X00)RmtSta|=1<<6;//标记已经完成一次按键的键值信息采集
                        if((RmtSta&0X0F)<14)RmtSta++;
                        else
                        {
                                RmtSta&=~(1<<7);//清空引导标识
                                RmtSta&=0XF0;        //清空计数器       
                        }               
                }
        }
        if(tsr&(1<<2))//CC2IE中断
        {
                if(RDATA)
                {
                        TIM5->CCER|=1<<5;//设为下降沿捕获
                        TIM5->CNT=0;//清空定时器值
                        RmtSta|=0x10;//这句代码改成RmtSta|=1<<7;怎么不行
                }else//下降沿捕获
                {
                        Dval=TIM5->CCR2;
                        TIM5->CCER&=~(1<<5);
                        if(RmtSta&0x10)
                        {
                                if(RmtSta&0x80)
                                {
                                        if(Dval>300&&Dval<800)
                                        {
                                                RmtRec<<=1;
                                                RmtRec|=0;
                                    }else if(Dval>1400&&Dval<1800)
                                        {
                                                RmtRec<<=1;
                                                RmtRec|=1;
                                        }else if(Dval>2200&&Dval<2600)
                                        {
                                                RmtCnt++;
                                                RmtSta&=0xf0;
                                        }
                                }else if(Dval>4200&&Dval<4700)
                                {
                                        RmtSta|=1<<7;
                                        RmtCnt=0;
                                }
                        }
                        RmtSta&=~(1<<4);
                }
        }
        TIM5->SR=0;
}

在中断处理的代码:RmtSta|=0x10;
,这句代码改成RmtSta|=1<<7;怎么不行,为什么?

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

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-4-9
在线时间
28 小时
发表于 2016-9-5 00:32:09 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 23:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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