*************************************************/
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{ //TACCTL0&=~ CCIE; //关中断
static unsigned char KEY_State=0; //按键的状态变量
static unsigned char i,j=0; //计数,用于处理时间
switch(KEY_State) //处理按键状态
{case NOKEY: //未按键时进行按键处理
if ((P1IN&BIT3)==0)
{KEY_State=PUSH_KEY; //按下按键后,进入短按状态
}
break; //必须要,需要退出循环
case PUSH_KEY: //短按状态时进行按键处理
if((P1IN&BIT3)!=0) //释放按键,认为是一次短按,加以处理
{ KEY=1; //按键赋值
KEY_State=NOKEY; //回到未按状态
}
else
{
if (i<100)
{ //KEY=0; //KEY返回0,接收下一次数据
i++; //计数,以实现长按键,约2秒
}
else
{
i=0;
KEY=2; //输出长按初始状态
KEY_State=LONG_KEY; //长按状态
}
}
break;
case LONG_KEY: //长按状态时进行按键处理
if((P1IN&BIT3)!=0) //释放按键,退出
{ KEY=0; //按键赋值
KEY_State=NOKEY; //回到未按状态
}
else
{
if (j<5)
{
j++; //计数,以实现长按键状态计时,约0.1秒
}
else
{j=0; //重新计数
KEY=3; //长按状态的处理
}
}
break;
}
TACCTL0|= CCIE; //开中断
} |