5856|8

230

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

按键采用管脚触发方式进入中断,如何区分长按、短按 [复制链接]

如题,按下键,进入中断,
    那如何区分 是长按还是短按呢?

最新回复

也可以用一个变量作为标志。按键按下,开始计数。看看抬起时计数值,判断长短按。  详情 回复 发表于 2014-9-20 19:13
 
点赞 关注

回复
举报

5310

帖子

453

TA的资源

五彩晶圆(高级)

沙发
 
开定时器判断

点评

能说具体点不、  详情 回复 发表于 2014-9-20 15:38
 
 

回复

230

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

能说具体点不、
 
 
 

回复

5310

帖子

453

TA的资源

五彩晶圆(高级)

4
 
按下开始计时,释放时判断时间,或者规定时间超3秒定时中断

点评

长按和短按是处理不同情况,按键按下,为低电平。[/backcolor] 目前做法是 首先 设置引脚为 下降沿触发。[/backcolor] 按键中断程序为:关按键中断使能,清标志位,自己设置的全局标志自加一次(标  详情 回复 发表于 2014-9-22 14:45
 
 
 

回复

230

帖子

0

TA的资源

一粒金砂(中级)

5
 
 
 
 

回复

3471

帖子

13

TA的资源

五彩晶圆(高级)

6
 
也可以用一个变量作为标志。按键按下,开始计数。看看抬起时计数值,判断长短按。
 
 
 

回复

230

帖子

0

TA的资源

一粒金砂(中级)

7
 
蓝雨夜 发表于 2014-9-20 15:41
按下开始计时,释放时判断时间,或者规定时间超3秒定时中断

长按和短按是处理不同情况,按键按下,为低电平。

       目前做法是 首先 设置引脚为  下降沿触发。
     按键中断程序为:关按键中断使能,清标志位,自己设置的全局标志自加一次(标志位初始值为0),并退出低功耗模式。
     定时器设置为:定时器每20ms中断一次,并把时间计数器加1,如果时间计数器大于1——也就是按键按下后40ms,改引脚触发方式为 上升沿触发,并开启引脚中断使能。
      
   主程序里初始化各项后,进入低功耗模式。只能由外部中断唤醒。

   while(1)里   判断全局标志是否等于1,是则启动定时器计时,把全局标志赋值为2。
                    判断全局标志是否为3,是则关闭定时器,清零全局标志。进而根据时间计数器的数值判断
按键是长按 还是 短按。

          但是问题就是好像第一次可以判断,第二次就不行了。或者不稳定,不晓得问题具体在哪。


 
 
 

回复

230

帖子

0

TA的资源

一粒金砂(中级)

8
 
本帖最后由 lingergz 于 2014-9-23 23:22 编辑
ienglgge 发表于 2014-9-20 19:13
也可以用一个变量作为标志。按键按下,开始计数。看看抬起时计数值,判断长短按。
这个程序 检测按键不太稳定,大家帮我看看问题在哪里?
  1. #pragma vector=TIMER0_A0_VECTOR
  2. __interrupt void Timer_A (void)
  3. {
  4.         cnt++;
  5.         if(cnt>1)                  //按键按下后40ms,改变引脚为 上升沿触发,从而避免抖动                        
  6.         {
  7.             P2IES &= ~ E_BTN ;    //P2.1 & P2.2 LO/HI edge
  8.                
  9.                 P2IE |= E_BTN;       //开启引脚中断
  10.                
  11.         }
  12. }


  13. #pragma vector=PORT2_VECTOR
  14. __interrupt void PORT2_ISR(void)
  15. {
  16.         
  17.         if(P2IFG & E_BTN)         
  18.         {
  19.             P2IE &= ~E_BTN;           //禁止引脚中断
  20.                 P2IFG &= ~ E_BTN;               
  21.         
  22.             pin_flag ++;
  23.             LPM4_EXIT;                   //退出中断
  24.                
  25.             
  26.     }
  27.         
  28. }


  29. void Timer0_init()                //定时器0初始化,上数模式:定时器计数增加至 TACCR0触发中断
  30. {
  31.   CCTL0 = CCIE;
  32.   
  33.   TACTL = TASSEL_2 + MC_1;                  // SMCLK, contmode
  34. }


  35. void main(void)
  36. {
  37.    
  38.     WDTCTL = WDTPW + WDTHOLD; // Stop WDT
  39.         
  40.     ConfigureClocks();   
  41.     ConfigureSwitches();
  42.         Timer0_init();                                //系统初始化
  43.         
  44.     ConfigureOLED();
  45.      Clear_Screen();
  46.     Write_HZ((unsigned char *)HZ,4,0);
  47.    
  48.     pin_flag = 0;     //全局变量,用于判断上升沿触发,还是下降沿触发
  49.     cnt = 0;           //全局变量,定时器计数器
  50.    
  51.     __bis_SR_register( GIE);   
  52.     LPM4;                                     //开启总中断并进入低功耗模式4
  53.    
  54.     while(1)
  55.     {            
  56.             if(pin_flag==1)                      //下升沿中断,说明是按键开始按下,开启定时器计时
  57.             {
  58.                     CCR0 = 20000;
  59.                     pin_flag=2;                    
  60.                     
  61.             }
  62.             else if(pin_flag==3)                //上升沿中断,证明按键释放。
  63.             {
  64.                     CCR0 = 0;                       //停止定时器,清零判断上升沿和下降沿的标志位
  65.                     pin_flag=0;
  66.                     
  67.                     if(cnt>150)   //long longpress   //开始判断长按和短按
  68.                     {
  69.                             cnt = 0;
  70.                 Clear_Screen();
  71.                 Write_HZ((unsigned char *)HZ,10,1);
  72.                     }
  73.                     else if(cnt>50)//long press
  74.                     {
  75.                             cnt= 0;
  76.                 Clear_Screen();
  77.                 Write_HZ((unsigned char *)HZ,5,1);
  78.                     }
  79.             else  // short press
  80.             {
  81.               cnt = 0;
  82.               Clear_Screen();
  83.               Write_HZ((unsigned char *)HZ,6,1);
  84.             }
  85.                         
  86.                         
  87.             P2IES |=  E_BTN ;    //P2.1 & P2.2 LO/HI edge,按键判断完毕,开启按键下降沿触发
  88.                     P2IE |= E_BTN;
  89.                         
  90.             LPM4;
  91.             }
  92.    
  93.         }
  94. }
复制代码


 
 
 

回复

230

帖子

0

TA的资源

一粒金砂(中级)

9
 

mark一下,之前的问题 通过串口打印的方式找到问题了,是按键释放抖动重进中断导致出了问题。
       改成,按键中断程序里改变触发方式——下升沿触发时,开启定时器;下降沿触发时,关闭定时器。
主程序里判断定时时间就好了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表