本帖最后由 初学-菜鸟 于 2012-5-29 20:25 编辑
我仿照网上的程序,写了个状态机检测独立按键程序,4个按键,每个键按下并松开,对应的一个数码管显示数字加1。实际上,按了10多次,才会响应一两次,不知道问题出在哪里。
我用传统按键检测方法:检测到按键延时10ms确认键按下并while等待按键送开,返回键值,没有任何问题。
附代码:
//定时器1每10ms进入一次中断,调用该函数。
uchar Key_Scan(void)
{
static uchar Key_State = 0; //按键状态
static uchar Key_Prev = 0; //上次按键
//static unsigned int Key_Delay = 0;
uchar Key_Press = KEY_NONE; //按键值
uchar Key_Return = KEY_NONE; //返回值
Key_Press = Get_Key();
switch (Key_State)
{
case 0: //按键初始态
if (Key_Press !=KEY_NONE) //有键按下
{
Key_State = 1;
Key_Prev = Key_Press;
}
break;
case 1:
if ( Key_Press ==Key_Prev ) //确认和上次按键状态相同
{ //等待释放
Key_State = 2;
//Key_Return = KEY_DOWN | Key_Prev;
}
else //
{
Key_State = 0;
}
break;
case 2:
if(Key_Press == KEY_NONE) //按键释放
{
Key_State = 0;
Key_Return = (KEY_UP | Key_Prev); //返回
}
break;
default :
Key_State = 0;
break;
}
return Key_Return;
}
附上keil2工程代码: |