请教版主 关于你的键盘状态机的延时函数
在《深入浅出》中看到版主写的键盘状态机函数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次作为基础的。
如果这样的话 如果主函数很长和很短是不是会影响到延时效果呢? 这个函数应该是固定1MS调用一次的吧,你在看看 哦对哦,用定时器10MS调用一次。。 飘过…… 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;
}
break; //是不是在这里跳出switch 那后面的两个case不是没有用了吗
看不懂 后面两个case 程序是怎么进去的 K,4L看看C语言基础方面的书再来吧
switch case你会用吗?
不会用翻书... break跳出当前case,后面的case在符合其的条件发生时进去。 楼上的,你懂C吗?break是跳出当前case吗?
页:
[1]