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

[复制链接]
941|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 | 显示全部楼层
中断可能没有消抖会误触发。
uptown 发表于 2016-9-5 17:08 | 显示全部楼层
Soraka 发表于 2016-8-31 21:53
这还是用的延时吧

怎么不用硬件消抖呢
uptown 发表于 2016-9-5 17:10 | 显示全部楼层
软件实现确实比较简单。
yujielun 发表于 2016-9-7 22:52 | 显示全部楼层
这是消抖的程序看着好繁琐。
yujielun 发表于 2016-9-7 22:54 | 显示全部楼层
不是都是延时消抖吗
iyoum 发表于 2016-9-8 16:35 | 显示全部楼层
怎么还有中断能够去抖
iyoum 发表于 2016-9-8 16:37 | 显示全部楼层
msp430的按键用延时都可以实现。
gygp 发表于 2016-9-9 16:43 | 显示全部楼层
定时器还能消抖?
gygp 发表于 2016-9-9 16:47 | 显示全部楼层
这样不是浪费定时器中断资源吗
您需要登录后才可以回帖 登录 | 注册

本版积分规则

183

主题

849

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部