|
发表于 2015-6-19 22:50:03
|
显示全部楼层
//在定时器中,定时10ms,定时到后在中断服务程序中调用上述函数,
//每次执行的间隔10ms,可以有效的消除消抖,提高CPU的利用率。
//PTD10,11,12,13,14
#include "key.h"
uint8 kk=0; //六个按键标志
uint8 rr=0; //松手检测标志位
void key_gpio_init()
{
GPIO_InitTypeDef gpio_init;
gpio_init.GPIO_PTx=PTD;
gpio_init.GPIO_Pins=GPIO_Pin10|GPIO_Pin11|GPIO_Pin12|GPIO_Pin13|GPIO_Pin14;
gpio_init.GPIO_PinControl=INPUT_PULL_UP|INPUT_PF_EN;
gpio_init.GPIO_Dir=DIR_INPUT;
LPLD_GPIO_Init(gpio_init); //GPIO通用初始化函数.0--配置错误;1--配置成功
}
void key_scan()
{
static enum key_states_e key_state=KEY_S1; //声明枚举变量,并且赋予枚举值
switch(key_state)
{
case KEY_S1: //按下
{
if((PTD10_I==0)||(PTD11_I==0)||(PTD12_I==0)||(PTD13_I==0)||(PTD14_I==0)) key_state = KEY_S2;
else key_state = KEY_S1;
break;
}
case KEY_S2: //防抖
{
if((PTD10_I==0)||(PTD11_I==0)||(PTD12_I==0)||(PTD13_I==0)||(PTD14_I==0))
{
key_state = KEY_S3;
if(PTD10_I==0) rr=1; //用于确定是哪个按键再松手之前按下
if(PTD11_I==0) rr=2;
if(PTD12_I==0) rr=3;
if(PTD13_I==0) rr=4;
if(PTD14_I==0) rr=5;
}
else key_state = KEY_S1;
break;
}
case KEY_S3: //松手
{
if((PTD10_I==1)&&(PTD11_I==1)&&(PTD12_I==1)&&(PTD13_I==1)&&(PTD14_I==1))
{
key_state = KEY_S1;
if(rr==1) {rr=0;kk=1;}
if(rr==2) {rr=0;kk=2;}
if(rr==3) {rr=0;kk=3;}
if(rr==4) {rr=0;kk=4;}
if(rr==5) {rr=0;kk=5;}
}
// else key_state = KEY_S1; //此语句应删除
break;
}
default:
key_state = KEY_S1;
break;
}
} |
|