高效简洁按键扫描程序模板

使用定时扫描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;
        }

    }
}
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值