|
马老师,你好,我碰到一个按键问题,百思不得其解,所以又来麻烦你了,我是看了你的书以后,用状态机写了一人非矩阵的按键扫描,大至情况是:UP键(可连_发),DOWN键(可连_发),ENTER键,ESC键,问题是:其它的键都好使,就是UP键为什么要按几下它才有反应呀,UP键和DOWN键都是一样的程序,为什么DOWN键就不会,我已经排除了硬件固障,更换了按键还是一样,所以我在想还是程序问题,一直不知怎么回事,所以请教,谢谢先!!
按键程序如下:
/******************按键函数***********************************************/
#define key_input PIND // 按键输入口
#define key_mask 0b00001111 // 按键输入屏蔽码
#define key_no 0
#define up 1
#define down 2
#define enter 3
#define esc 4
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
#define key_state_3 3
#define key_state_4 4
#define key_state_5 5
#define key_state_6 6
unsigned char key_time1=0,key_time2=0,key_return1;
unsigned char read_key(void)
{
static unsigned char key_state = 0,key_old;
unsigned char key_press, key_return=key_no;
key_press = key_input & key_mask; // 读按键I/O电平
switch (key_state)
{
case key_state_0: // 按键初始态
if (key_press != key_mask)
{
key_old = key_press; // 记录原电平
key_state = key_state_1; // 键被按下,状态转换到键确认态
}
break;
case key_state_1: // 按键确认态
if (key_press == key_old) // 与原电平比较(消抖处理)
{
if (key_press == 0b00001110) //UP键检测
{
key_state = key_state_2; // 状态转换到键释放态
key_time1=0;
}
else if(key_press == 0b00001101) //DOWN键检测
{
key_state = key_state_3; // 状态转换到键释放态
key_time2=0;
}
else if (key_press == 0b00001011) //ENTER检测
{
key_return = enter;
key_state = key_state_6; // 状态转换到键释放态
}
else if (key_press == 0b00000111) //ESC键检测
{
key_return = esc;
key_state = key_state_6; // 状态转换到键释放态
}
}
else
key_state = key_state_0; // 按键已抬起,转换到按键初始态
break;
case key_state_2:
if(key_press ==key_mask)
{
key_state = key_state_0;
key_return=up;
}
else if(++key_time1>=100)
{
key_state=key_state_4;
key_time1=0;
key_return=7;//输出为7时产生连_发功能
}
break;
case key_state_3:
if(key_press ==key_mask)
{
key_state = key_state_0;
key_return=down;
}
else if(++key_time2>=100)
{
key_state=key_state_5;
key_time2=0;
key_return=8;//输出为8时产生连_发功能
}
break;
case key_state_4:
if (key_press == key_mask) key_state = key_state_0; //按键已释放,转换到按键初始态
else
{
if(++key_time1>=50)//按键计数时间
{
key_time1=0; //清按键计时
key_return=7; //输出为7时产生连_发功能
}
}
break;
case key_state_5:
if(key_press=key_mask) key_state=key_state_0;
else if(++key_time2>=50)//按键计数时间
{
key_time2=0; //清按键计时
key_return=8; //输出为8时产生连_发功能
}
break;
case key_state_6:
if (key_press == key_mask) key_state = key_state_0;
break;
}
return key_return;
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|