單片機(jī)
通過(guò)P1口的中斷開(kāi)啟定時(shí)器,然后利用定時(shí)器中斷不斷掃描相應(yīng)的端口狀態(tài),判斷按鍵的
//定時(shí)器設(shè)置
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 ;//啟動(dòng)定時(shí)器
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; //啟動(dòng)定時(shí)器
Key_Tmp = Key_Sel;
break;
case Key_Menu:
TA1CTL |= MC__UP; //啟動(dòng)定時(shí)器
Key_Tmp = Key_Menu;
break;
}
P1IFG &= 0x00;
}
/***********************************************************
函數(shù)名稱(chēng):__interrupt void Timer_A1_Count (void)
函數(shù)功能:
入口參數(shù):無(wú)
出口參數(shù):無(wú)
備 注:
***********************************************************/
#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;
//定時(shí)器停止
TimerA1_Stop;
}
}
else if((P1_Value & BIT2) != 0)//按鍵釋放
{
if( (i >= 5) && (i < 300) ) //短按鍵
{
LCD_B1_RT_ON;
TimerA1_Stop;
i= 0;
}
else
{
i = 0; //否則認(rèn)為是抖動(dòng);
}
}
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; //否則認(rèn)為是抖動(dòng);
}
}
break;
}
}
}