|
在《深入浅出》中看到版主写的键盘状态机函数
unsigned char Key_service (void)
{
static unsigned char KeyStatu = Key_Press;
static unsigned char KeyTimer = 0;
static unsigned char KeyTmpValue;
switch (KeyStatu)
{
case Key_Press : //检测按键按下
{
if (KeyPin != 0xFF) //检测是否有键按下
{
KeyTmpValue = KeyPin; //暂存键值
KeyStatu++; //如检测到有键按下则翻转处理状态
KeyTimer = 10; //初始化抗抖动定时器,抗抖动时间10mS
}
break;
}
case Key_Bounce : //抗抖动
{
KeyTimer--;
if (KeyTimer == 0)
{
if (KeyPin != KeyTmpValue) //检测按键是否依然按下
KeyStatu = Key_Press; //按键信号不在了,当作干扰信号丢弃
else
KeyStatu++;
}
break;
}
case Key_Release : //等待按键松开
{
if (KeyPin == 0xFF)
{ //若按键已经释放,则提取键值
switch (KeyTmpValue)
{
case 0xFE :
{
KeyStatu = Key_Press;
return Key_8;
break;
}
case 0xFD :
{
KeyStatu = Key_Press;
return Key_7;
break;
}
case 0xFB :
{
KeyStatu = Key_Press;
return Key_6;
break;
}
case 0xF7 :
{
KeyStatu = Key_Press;
return Key_5;
break;
}
case 0xEF :
{
KeyStatu = Key_Press;
return Key_4;
break;
}
case 0xDF :
{
KeyStatu = Key_Press;
return Key_3;
break;
}
case 0xBF :
{
KeyStatu = Key_Press;
return Key_2;
break;
}
case 0x7F :
{
KeyStatu = Key_Press;
return Key_1;
break;
}
}
KeyStatu = Key_Press; //读到的端口状态无法解析
} //End Of "if (KeyPin == 0)"
break;
} //End Of " case Key_Release :"
} //End Of "switch (KeyStatu)"
return Key_Null;
}
其中
KeyTimer = 10; //初始化抗抖动定时器,抗抖动时间10mS
和
KeyTimer--;
相配合,请问这个的原理是不是每次主函数循环到这里的时候就对KeyTimer减一?
也就是说这个函数的延时是用主函数循环10次作为基础的。
如果这样的话 如果主函数很长和很短是不是会影响到延时效果呢? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|