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

moshuiilove520   2016-8-30 14:24 楼主
通过P1口的中断开启定时器,然后利用定时器中断不断扫描相应的端口状态,判断按键的
  1. //定时器设置
  2. void TimerA1Init()
  3. {   
  4.   _UINT  data = 0 ;
  5.   TA1CTL = data ;//clear all ,diaable interrupt , claer ifg
  6.   TA1CTL |= TASSEL__ACLK | ID_0 | TACLR  ;  // ACLK, stop mode, ,div:1 ,clear TAR  
  7.   //TA0CTL |= MC__UP ;//启动定时器  
  8.   TA1CCTL0 = CCIE ; //ccr0  比较中断允许
  9.   TA1CCR0 = 327 ;  //ccr0 compare mode , ie disable , ifg clear  
  10. }

  11. //P1端口中断程序
  12. #pragma vector = PORT1_VECTOR
  13. __interrupt void Port1ADISR( void )
  14. {
  15.   P1IFG &= 0x0f;
  16.   switch(P1IFG)
  17.   {
  18.     case Key_Sel:

  19.       TA1CTL |= MC__UP;   //启动定时器
  20.       Key_Tmp = Key_Sel;

  21.       break;
  22.     case Key_Menu:

  23.       TA1CTL |= MC__UP;   //启动定时器
  24.       Key_Tmp = Key_Menu;

  25.       break;
  26.   }
  27.   P1IFG &= 0x00;

  28. }


  29. /***********************************************************
  30. 函数名称:__interrupt void Timer_A1_Count (void)
  31. 函数功能:
  32. 入口参数:无
  33. 出口参数:无
  34. 备   注:
  35. ***********************************************************/
  36. #pragma vector = TIMER1_A0_VECTOR
  37. __interrupt void Timer_A1_Count(void)
  38. {  
  39.   static _UINT i = 0;
  40.   _UBYTE P1_Value;
  41.   P1_Value = P1IN;

  42.   P1_Value &= 0x06;
  43.   switch(Key_Tmp)
  44.   {
  45.   case Key_Menu:
  46.     {
  47.       if( (P1_Value & BIT2) == 0)    //按键按下
  48.       {
  49.         i++;
  50.         if(i >= 300)   //常按键处理
  51.         {

  52.           BUZZER_ON;
  53.           i = 0;

  54.           //定时器停止
  55.           TimerA1_Stop;
  56.         }
  57.       }
  58.       else if((P1_Value & BIT2) != 0)//按键释放
  59.       {

  60.         if( (i >= 5) && (i < 300) )  //短按键
  61.         {

  62.           LCD_B1_RT_ON;
  63.           TimerA1_Stop;
  64.           i= 0;
  65.         }
  66.         else
  67.         {
  68.           i = 0;  //否则认为是抖动;
  69.         }
  70.       }

  71.       break;
  72.     }
  73.   case Key_Sel:
  74.     {
  75.       if( (P1_Value & BIT1) == 0)       //按键按下
  76.       {
  77.         i++;
  78.       }
  79.       else if( (P1_Value & BIT1) != 0)  //按键释放
  80.       {

  81.         if(i > 5)                       //短按键处理
  82.         {
  83.           LCD_B1_RT_OFF;
  84.           TimerA1_Stop;
  85.           i = 0;
  86.         }
  87.         else
  88.         {
  89.           i = 0;   //否则认为是抖动;
  90.         }
  91.       }

  92.       break;
  93.     }
  94.   }
  95. }


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复