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

通过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;
    }
  }
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值