0
问答首页 最新问题 热门问题 等待回答标签广场
我要提问

单片机

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;

    }

  }

}

提问者:liuanzhong 地点:- 浏览次数:1405 提问时间:10-26 13:55
我有更好的答案
提 交
8条回答
60user146 05-22 20:46
这还是用的延时吧
法规处发 05-24 21:01
这个按键还是扫描的好。
沈文强66 05-22 17:46
中断可能没有消抖会误触发。
tan8561 05-25 09:53
软件实现确实比较简单。
60user176 05-23 20:54
这是消抖的程序看着好繁琐。
xixunled 05-19 21:53
不是都是延时消抖吗
学生物的程序猿 05-19 14:10
怎么还有中断能够去抖
pfdos 05-24 06:56
msp430的按键用延时都可以实现。
撰写答案
提 交
1 / 3
1 / 3
相关单片机
具有音调控制的单片机立体声前置放大器
用于单片机与电子装置中的开关电源
单片机软硬件复位的条件都有啥
电动机的单片机控制
单片机应用系统开发实例导航