|
楼主 |
发表于 2011-8-11 11:03:50
|
显示全部楼层
”举一反三“出现了一个奇怪的问题。
短按可以的。
长按以后,目的也能实现,就是长按松开的时候,还会执行相应的短按一次操作。
正在找问题。
把代码付上,马老师帮忙看下。是啥问题。我估计那个地方。
//key define
#define key_input PIND // 按键输入口
#define key_mask 0b11110000 // key_mask按键输入屏蔽码
//短按
#define key_no 0
#define key_short_press_k1 1
#define key_short_press_k2 2
#define key_short_press_k3 3
#define key_short_press_k4 4
//long press长按
#define key_long_press_k1 5
#define key_long_press_k2 6
#define key_long_press_k3 7
#define key_long_press_k4 8
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
unsigned char read_key(void)
{
static unsigned char key_state = 0, key_time = 0 ,key_old;
unsigned char key_press, key_return = 0;
key_press = key_input & key_mask; // 读按键I/O电平,每一个10MS都要读IO电平是什么电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask) // 测试是否有按键按下(第一个10MS检测)
{
key_old = key_press; // 记录原电平状态
key_state = key_state_1; // 键被按下,状态转换到键确认态
}
break;
case key_state_1: // 按键确认态(第二个10MS检测)
if (key_press == key_old) //
{
key_state = key_state_2; // 按键仍按下,状态转换到计时1
key_time = 0; // 清另按键时间计数器
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if (key_press == key_mask) // 按键已经抬起,利用key_old记录了IO电平的状态
{
key_state = key_state_0; // 按键已释放,转换到按键初始态
if (key_old == 0b01110000) {key_return = key_short_press_k1;}//key_short_press_k1
else if(key_old == 0b10110000) {key_return = key_short_press_k2;}
else if(key_old == 0b11010000) {key_return = key_short_press_k3;}
else if(key_old == 0b11100000) {key_return = key_short_press_k4;}
//key_return = 1; // 输出"1"
}
else if (++key_time >= 100) // 按键时间计数
{
key_state = key_state_3; // 按下时间>1s,状态转换到计时2
key_time = 0; // 清按键计数器
if (key_old == 0b01110000) {key_return = key_long_press_k1;}//key_long_press_k1
else if(key_old == 0b10110000) {key_return = key_long_press_k2;}
else if(key_old == 0b11010000) {key_return = key_long_press_k3;}
else if(key_old == 0b11100000) {key_return = key_long_press_k4;}
//key_return = 2; // 输出"2"
}
break;
case key_state_3:
if (key_press)
key_state = key_state_0; // 按键已释放,转换到按键初始态
else
{
if (++key_time >= 50) // 按键时间计数
{
key_time = 0; // 按下时间>0.5s,清按键计数器
if (key_old == 0b01110000) {key_return = key_long_press_k1;}//key_long_press_k1
else if(key_old == 0b10110000) {key_return = key_long_press_k2;}
else if(key_old == 0b11010000) {key_return = key_long_press_k3;}
else if(key_old == 0b11100000) {key_return = key_long_press_k4;}
//key_return = 2; // 输出"2"
}
}
break;
}
return key_return;
}
//我估计是这里判断有问题,还不知道怎么解决。
if (key_press == key_mask) // 按键已经抬起,利用key_old记录了IO电平的状态
马老师帮下忙看看 |
|