按键状态机的一个疑问
#define key_input PIND.7 // 按键输入口#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
char read_key(void)
{
static char key_state = 0;
char key_press, key_return = 0;
key_press = key_input; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (!key_press) key_state = key_state_1; // 键被按下,状态转换到键确认态
break;
case key_state_1: // 按键确认态
if (!key_press)
{
key_return = 1; // 按键仍按下,按键确认输出为“1”
key_state = key_state_2; // 状态转换到键释放态
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press) key_state = key_state_0; //按键已释放,转换到按键初始态
break;
}
return key_return;
}
我感觉应该吧casekey_state_1改成这样
case key_state_1:
key_return = 1;
key_state = key_state_2;
break;
要是 在按键程序第一次经检测到按键按下的时候过了10ms然后转到状态1 如果处在抖动期按键程序有可能检测到的是高 也可能是低 所以我感直接就是这样写了(这是我个人的理解) 不知道对不对呵呵 把状态变换弄明白,
在状态1下有根据输入的不同有2种次态和2种不同的输出。 我感觉状态2的第二种可能没啥用处呢就是这个疑问 请下载我编写的教程参考。 这个程序我试过了,如果把key_return用static修饰的话,可能效果就不一样啦,哈哈 谢谢大家 我已经弄明白了 472666316 发表于 2010-9-22 06:15
谢谢大家 我已经弄明白了
分享心得 啊,这么一段我都看很久了。 啊,完全明白了。足足一天。漏看了一句“static char key_state = 0;”,对static理解不透彻导致
页:
[1]