打印

msp430单片机实现常按键和短按键加去抖功能

[复制链接]
633|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Thorald|  楼主 | 2016-8-31 21:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

通过P1口的中断开启定时器,然后利用定时器中断不断扫描相应的端口状态,判断按键的
//定时器设置
void TimerA1Init()
{   
  _UINT  data = 0 ;
  TA1CTL = data ;//clear all ,diaable interrupt , claer ifg
  TA1CTL |= TASSEL__ACLK | ID_0 | TACLR  ;  // ACLK, stop mode, ,div:1 ,clear TAR  
  //TA0CTL |= MC__UP ;//启动定时器  
  TA1CCTL0 = CCIE ; //ccr0  比较中断允许
  TA1CCR0 = 327 ;  //ccr0 compare mode , ie disable , ifg clear  
}

//P1端口中断程序
#pragma vector = PORT1_VECTOR
__interrupt void Port1ADISR( void )
{
  P1IFG &= 0x0f;
  switch(P1IFG)
  {
    case Key_Sel:

      TA1CTL |= MC__UP;   //启动定时器
      Key_Tmp = Key_Sel;

      break;
    case Key_Menu:

      TA1CTL |= MC__UP;   //启动定时器
      Key_Tmp = Key_Menu;

      break;
  }
  P1IFG &= 0x00;

}


/***********************************************************
函数名称:__interrupt void Timer_A1_Count (void)
函数功能:
入口参数:无
出口参数:无
备   注:
***********************************************************/
#pragma vector = TIMER1_A0_VECTOR
__interrupt void Timer_A1_Count(void)
{  
  static _UINT i = 0;
  _UBYTE P1_Value;
  P1_Value = P1IN;

  P1_Value &= 0x06;
  switch(Key_Tmp)
  {
  case Key_Menu:
    {
      if( (P1_Value & BIT2) == 0)    //按键按下
      {
        i++;
        if(i >= 300)   //常按键处理
        {

          BUZZER_ON;
          i = 0;

          //定时器停止
          TimerA1_Stop;
        }
      }
      else if((P1_Value & BIT2) != 0)//按键释放
      {

        if( (i >= 5) && (i < 300) )  //短按键
        {

          LCD_B1_RT_ON;
          TimerA1_Stop;
          i= 0;
        }
        else
        {
          i = 0;  //否则认为是抖动;
        }
      }

      break;
    }
  case Key_Sel:
    {
      if( (P1_Value & BIT1) == 0)       //按键按下
      {
        i++;
      }
      else if( (P1_Value & BIT1) != 0)  //按键释放
      {

        if(i > 5)                       //短按键处理
        {
          LCD_B1_RT_OFF;
          TimerA1_Stop;
          i = 0;
        }
        else
        {
          i = 0;   //否则认为是抖动;
        }
      }

      break;
    }
  }
}

相关帖子

沙发
Soraka| | 2016-8-31 21:53 | 只看该作者
这还是用的延时吧

使用特权

评论回复
板凳
kkzz| | 2016-9-2 22:59 | 只看该作者
这个按键还是扫描的好。

使用特权

评论回复
地板
kkzz| | 2016-9-2 23:03 | 只看该作者
中断可能没有消抖会误触发。

使用特权

评论回复
5
uptown| | 2016-9-5 17:08 | 只看该作者
Soraka 发表于 2016-8-31 21:53
这还是用的延时吧

怎么不用硬件消抖呢

使用特权

评论回复
6
uptown| | 2016-9-5 17:10 | 只看该作者
软件实现确实比较简单。

使用特权

评论回复
7
yujielun| | 2016-9-7 22:52 | 只看该作者
这是消抖的程序看着好繁琐。

使用特权

评论回复
8
yujielun| | 2016-9-7 22:54 | 只看该作者
不是都是延时消抖吗

使用特权

评论回复
9
iyoum| | 2016-9-8 16:35 | 只看该作者
怎么还有中断能够去抖

使用特权

评论回复
10
iyoum| | 2016-9-8 16:37 | 只看该作者
msp430的按键用延时都可以实现。

使用特权

评论回复
11
gygp| | 2016-9-9 16:43 | 只看该作者
定时器还能消抖?

使用特权

评论回复
12
gygp| | 2016-9-9 16:47 | 只看该作者
这样不是浪费定时器中断资源吗

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

849

帖子

1

粉丝