OpenEdv-开源电子网

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

请教:遥控器按键连发的问题

[复制链接]

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-8-3
在线时间
31 小时
发表于 2021-2-19 10:38:13 | 显示全部楼层 |阅读模式
这几天在学习原子的红外遥控程序,成功捕获键值码,但是,程序一直在接收遥控码,相当于连续按键,我的程序使用的键值码是累加方式进行操作,按一次相当于按了8-9次,本来要进入项目1,结果跑到项目8,需要怎么修改才能用?
  1. //定时器2中断服务程序         
  2. void TIM2_IRQHandler(void)
  3. {                              
  4.         if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)                                                        //更新中断
  5.         {
  6.                 if(RmtSta&0x80)                                                                                        //上次有数据被接收到了
  7.                 {       
  8.                         RmtSta&=~0X10;                                                                                //取消上升沿已经被捕获标记
  9.                         if((RmtSta&0X0F)==0X00)        RmtSta|=1<<6;                                                                                //标记已经完成一次按键的键值信息采集
  10.                         if((RmtSta&0X0F)<14)                RmtSta++;
  11.                         else
  12.                         {
  13.                                 RmtSta&=~(1<<7);                                                                //清空引导标识
  14.                                 RmtSta&=0XF0;                                                                                //清空计数器       
  15.                         }                                                                   
  16.                 }                                                            
  17.         }
  18.         if(TIM_GetITStatus(TIM2,TIM_IT_CC4)!=RESET)                                                                        //CC4IE捕获中断
  19.         {          
  20.                 if(RDATA)                                                                                                                //上升沿捕获
  21.                 {
  22.                         TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Falling);                        //CC4P=1 设置为下降沿捕获                               
  23.                         TIM_SetCounter(TIM2,0);                                                //清空定时器值
  24.                         RmtSta|=0X10;                                                                                        //标记上升沿已经被捕获
  25.                 }
  26.                 else                                                                                                                                 //下降沿捕获
  27.                 {                       
  28.                         Dval=TIM_GetCapture4(TIM2);                                //读取CCR1也可以清CC1IF标志位
  29.                         TIM_OC4PolarityConfig(TIM2,TIM_ICPolarity_Rising);                        //CC4P=0 设置为上升沿捕获
  30.                        
  31.                         if(RmtSta&0X10)                                                                                //完成一次高电平捕获
  32.                         {
  33.                                 if(RmtSta&0X80)                                                                        //接收到了引导码
  34.                                 {
  35.                                         if(Dval>300&&Dval<800)                                //560为标准值,560us
  36.                                         {
  37.                                                 RmtRec<<=1;                                                                        //左移一位.
  38.                                                 RmtRec|=0;                                                                        //接收到0          
  39.                                         }
  40.                                         else if(Dval>1400&&Dval<1800)        //1680为标准值,1680us
  41.                                         {
  42.                                                 RmtRec<<=1;                                                                        //左移一位.
  43.                                                 RmtRec|=1;                                                                        //接收到1
  44.                                         }
  45.                                         else if(Dval>2200&&Dval<2600)        //得到按键键值增加的信息 2500为标准值2.5ms
  46.                                         {
  47.                                                 RmtCnt++;                                                                         //按键次数增加1次
  48.                                                 RmtSta&=0XF0;                                                                //清空计时器               
  49.                                         }
  50.                                 }
  51.                                 else if(Dval>4200&&Dval<4700)                //4500为标准值4.5ms
  52.                                 {
  53.                                         RmtSta|=1<<7;                                                                        //标记成功接收到了引导码
  54.                                         RmtCnt=0;                                                                                        //清除按键次数计数器
  55.                                 }                                                 
  56.                         }
  57.                         RmtSta&=~(1<<4);
  58.                 }                                                                                                            
  59.         }       
  60.         TIM_ClearFlag(TIM2,TIM_IT_Update|TIM_IT_CC4);                                                         //清除更新中断和CC4IE捕获中断标志
  61. }

  62. //处理红外键盘
  63. //返回值:
  64. //0,没有任何按键按下
  65. //其他,按下的按键键值.
  66. u8 Remote_Scan(void)
  67. {        
  68.         u8 sta=0;      
  69.         u8 t1,t2;  
  70.        
  71.         if(RmtSta&(1<<6))                                                                                        //得到一个按键的所有信息了
  72.         {
  73.                 t1=RmtRec>>24;                                                                                        //得到地址码
  74.                 t2=(RmtRec>>16)&0xff;                                                                //得到地址反码
  75.                 if((t1==(u8)~t2)&&t1==REMOTE_ID)                //检验遥控识别码(ID)及地址
  76.                 {
  77.                         t1=RmtRec>>8;
  78.                         t2=RmtRec;        
  79.                         if(t1==(u8)~t2)        sta=t1;                                                //键值正确         
  80.                 }   
  81.                 if((sta==0)||((RmtSta&0X80)==0))                //按键数据错误/遥控已经没有按下了
  82.                 {
  83.                          RmtSta&=~(1<<6);                                                                        //清除接收到有效按键标识
  84.                         RmtCnt=0;                                                                                                        //清除按键次数计数器
  85.                 }
  86.         }  
  87.         return sta;
  88. }

  89. void Remote_KEY()
  90. {         
  91.         IR = Remote_Scan();
  92.                   
  93.         if(IR==162)        {Key_OK=1; KCode=0x84;}                //WIFI
  94.         if(IR==2)                {Key_OK=1; KCode=0x82;}                //设置项目+
  95.         if(IR==98)        {Key_OK=1; KCode=0x83;}                //设置项目-
  96.         if(IR==226)        {Key_OK=1; KCode=0x81;}                //显示模式
  97.         if(IR==194)        {Key_OK=1; KCode=0x84;}                //设置        +
  98.         if(IR==34)        {Key_OK=1; KCode=0x85;}                //设置        -
  99.         if(IR==152)        {Key_OK=1; SET_S=0;}                        //复位

  100. }
复制代码


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

使用道具 举报

34

主题

252

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
473
金钱
473
注册时间
2020-5-11
在线时间
217 小时
发表于 2021-2-19 10:56:35 | 显示全部楼层
键码值累加之前延时一小段,相当于消抖
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-8-3
在线时间
31 小时
 楼主| 发表于 2021-2-19 11:33:11 | 显示全部楼层
asshole 发表于 2021-2-19 10:56
键码值累加之前延时一小段,相当于消抖

可不可以在解码成功后,跳出处理程序?
回复 支持 反对

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
12086
金钱
12086
注册时间
2013-3-8
在线时间
1285 小时
发表于 2021-2-19 17:43:56 | 显示全部楼层
LPX 发表于 2021-2-19 11:33
可不可以在解码成功后,跳出处理程序?

可以解码成功后,关掉中断,等处理完成后,再进中断。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 19:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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