快捷搜索:  汽车  科技

扫描插件格式规范(高效简洁按键扫描程序模板)

扫描插件格式规范(高效简洁按键扫描程序模板)#define BSP_BSP_KEY_H_#ifndef BSP_BSP_KEY_H_ * Created on: 2017年6月7日 * Author: foreversun */

使用定时扫描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_ */

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

/*

* 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;

}

}

}

扫描插件格式规范(高效简洁按键扫描程序模板)(1)

猜您喜欢: