下列为一路按键检测,可以增加到多路,原理都是这样的,工程应用在附件里。
STM32单片机源程序如下:
//按键检测
void key_scan(void)
{
key_s.get_key_num=get_key_value();
if(key_s.get_key_num) //判断是否有按键按下
{
switch(key_s.get_key_num)
{
//============================================================================================
case KEY_1: //按键1按下
switch(key_s.state)
{
case KEY_NONE: //之前没有检测到按下
key_s.state=KEY_1_DOWN;
break;
case KEY_1_DOWN: //检测到按下
key_s.long_count++; //长按检测开始
if(key_s.long_count>=KEY_LONG_TIME)
{
key_s.key_resault=KEY_1_LONG;
key_s.state=KEY_1_LONG;
}
break;
case KEY_1_UP: //双击按下
key_s.state=KEY_1_DUBDOW;
key_s.count=0;
break;
case KEY_1_LONG: //长按按下等待释放
break;
case KEY_1_DUBDOW: //双击按下等待释放
break;
case KEY_1_TIEBLE: //三击按下等待释放
break;
case KEY_1_DOUBLE: //三击按下
key_s.state=KEY_1_TIEBLE;
break;
default:
break;
}
break;
default:
break;
}
}
else
{
switch(key_s.state)
{
case KEY_NONE: //没有检测到按下
key_s.count=0;
key_s.double_count=0;
key_s.long_count=0;
key_s.trible_count=0;
break;
//============================================================================================
case KEY_1_DOWN: //检测到按键1按下后松手
key_s.state=KEY_1_UP;
break;
case KEY_1_UP:
key_s.count++; //单击计数超时检测
key_s.double_count++;
if(key_s.count>=KEY_DOUBLE_MAX)
{
key_s.key_resault=KEY_1_DOWN;
key_s.state=KEY_NONE;
}
break;
case KEY_1_LONG:
key_s.state=KEY_NONE;
break;
case KEY_1_DUBDOW:
key_s.state=KEY_1_DOUBLE;
break;
case KEY_1_DOUBLE:
key_s.count++; //双击计数超时检测
key_s.trible_count++;
if(key_s.count>=KEY_DOUBLE_MAX)
{
if((key_s.double_count>=KEY_DOUBLE_MIN)&&(key_s.double_count<=KEY_DOUBLE_MAX))
{
key_s.key_resault=KEY_1_DOUBLE;
}
key_s.state=KEY_NONE;
}
break;
case KEY_1_TIEBLE:
if((key_s.trible_count>=KEY_DOUBLE_MIN)&&(key_s.trible_count<=KEY_DOUBLE_MAX))
{
key_s.key_resault=KEY_1_TIEBLE;
}
key_s.state=KEY_NONE;
break;
default:
break;
}
}
}
全部资料51hei下载地址:
STM32_key_chank.7z
(184.6 KB, 下载次数: 113)
|