使用定时扫描10-50ms.根据不同硬件平台更改void bsp_keyInit(void)和static uint8_t bsp_getKeyState(void)
/*
* bsp_key.h
*
* Created on: 2017年6月7日
* Author: foreversun
*/
#ifndef BSP_BSP_KEY_H_
#define BSP_BSP_KEY_H_
#include "driverlib.h"
#define KEY1_PORT GPIO_PORT_P1
#define KEY1_PIN GPIO_PIN7
#define KEY2_PORT GPIO_PORT_P6
#define KEY2_PIN GPIO_PIN6
#define KEY3_PORT GPIO_PORT_P6
#define KEY3_PIN GPIO_PIN5
#define KEY1_ID 0x01
#define KEY2_ID 0x02
#define KEY3_ID 0x04
#define KEY4_ID 0x08
#define KEY5_ID 0x10
#define KEY6_ID 0x20
#define KEY7_ID 0x40
#define KEY8_ID 0x80
#define KEY_LONG_TIME 100 //1s
#define KEY_REPEAT_SPEED 5 //50ms
void bsp_keyInit(void);
void bsp_keyScan(void);
#endif /* BSP_BSP_KEY_H_ */
/*
* bsp_key.c
*
* Created on: 2017年6月8日
* Author: foreversun
*
*/
#include "bsp_key.h"
//下降沿触发
static uint8_t keyDown = 0;
//按键持续按下
static uint8_t keyContinue = 0;
//上升沿触发
static uint8_t keyUp = 0;
void bsp_keyInit(void){
GPIO_setAsInputPin(KEY1_PORT,KEY1_PIN);
GPIO_setAsInputPin(KEY2_PORT,KEY2_PIN);
GPIO_setAsInputPin(KEY3_PORT,KEY3_PIN);
}
//读取按键端口状态返回按键ID
static uint8_t bsp_getKeyState(void){
if(GPIO_getInputPinValue(KEY1_PORT,KEY1_PIN) == 0)
return KEY1_ID;
else if(GPIO_getInputPinValue(KEY2_PORT,KEY2_PIN) == 0)
return KEY2_ID;
else if(GPIO_getInputPinValue(KEY3_PORT,KEY3_PIN) == 0)
return KEY3_ID;
else
return 0;
}
void bsp_keyScan(void){
uint8_t readData = 0;
static uint16_t longKeyTime = 0;
static uint8_t repeatCount = 0;
//程序核心部分,以下四条语句实现8个按键扫描
readData = bsp_getKeyState();
//记录下降沿触发 ,仅出现一次,出现后自消除,持续时间 = 扫描时间,相当于一个脉冲
keyDown = readData & (readData ^ keyContinue);
//记录上升沿触发 ,仅出现一次,出现后自消除,持续时间 = 扫描时间 ,相当于一个脉冲
keyUp = readData ^ (readData | keyContinue);
//按键持续按下记录
keyContinue = readData;
//扫描后处理,根据实际情况自定义
//按键按下处理
if(keyDown){
switch(keyDown){
case KEY1_ID:
break;
case KEY2_ID:
break;
case KEY3_ID:
break;
case KEY4_ID:
break;
case KEY5_ID:
break;
case KEY6_ID:
break;
case KEY7_ID:
break;
case KEY8_ID:
break;
default: break;
}
}else
//按键持续按下处理
if(keyContinue){
if(longKeyTime < KEY_LONG_TIME){
//按键长按处理,只进来一次
if(++longKeyTime == KEY_LONG_TIME){
switch(keyContinue){
case KEY1_ID:
break;
case KEY2_ID:
break;
case KEY3_ID:
break;
case KEY4_ID:
break;
case KEY5_ID:
break;
case KEY6_ID:
break;
case KEY7_ID:
break;
case KEY8_ID:
break;
default: break;
}
}
}else {
//按键长按后连发处理
if(++repeatCount >= KEY_REPEAT_SPEED){
repeatCount = 0;
switch(keyContinue){
case KEY1_ID:
break;
case KEY2_ID:
break;
case KEY3_ID:
break;
case KEY4_ID:
break;
case KEY5_ID:
break;
case KEY6_ID:
break;
case KEY7_ID:
break;
case KEY8_ID:
break;
default: break;
}
}
}
}else
//按键抬起后处理
if(keyUp){
longKeyTime = 0;
repeatCount = 0;
switch(keyUp){
case KEY1_ID:
break;
case KEY2_ID:
break;
case KEY3_ID:
break;
case KEY4_ID:
break;
case KEY5_ID:
break;
case KEY6_ID:
break;
case KEY7_ID:
break;
case KEY8_ID:
break;
default: break;
}
}
}