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

时间:2022-07-07 19:45:10

通过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;
    }
  }
}