×
嵌入式 > 技术百科 > 详情

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

发布时间:2020-06-01 发布时间:
|

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

    }

  }

}


 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
LM2576D2T-005G的技术参数