单片机
通过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;
}
}
}