|
应用马老师书上基于状态机的按键方法时,键一按下不等松开就作用,为什么不是松开后才起作用?
unsigned char Getkey()
{
static unsigned char key_state = 0,key_value,key_line;
unsigned char key_return = NO_key, i;
switch(key_state)
{
case 0:
key_line = 0b00010000;
for (i = 1; i <= 4; i++) //扫描键盘
{
PORTX = ~key_line; //输出行线电平
PORTX = ~key_line; //送2次
key_value = Key_mask & PINX; //读列电平
if(key_value == Key_mask)
key_line <<= 1; //没有按键继续扫描
else
{
key_state++; //有按键,停止扫描
break; //转消抖确认状态
}
}
break;
case 1:
if(key_value == (Key_mask & PINX)) //再次读列电平
{
switch (key_line | key_value) //与状态0的相同,确认按键
{ //键盘编码,返回编码值
case 0b00011110:
key_return = K1;
break;
……
case 0b10000111:
key_return = K16;
break;
}
key_state++; //转入等待按键释放状态
}
else
{
key_state--; //两次列电平不同,返回状态0(消抖处理)
}
break;
case 2: //等待按键释放状态
PORTX = 0b00001111; //行线全部输出低电平
PORTX = 0b00001111; //重复送一次
if((Key_mask & PINX) == Key_mask)
{
key_state = 0; //列线全部为高电平,返回状态0
}
break;
}
return key_return;
}
应用马老师书上基于状态机的按键方法时,键一按下不等松开就作用,为什么不是松开后才起作用?
|
阿莫论坛20周年了!感谢大家的支持与爱护!!
一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。
|