打印

V7新版的按键FIFO驱动扩展和移植更简单,组合键也更好用

[复制链接]
285|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
小小的人呀|  楼主 | 2018-8-9 20:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
具体代码和移植方法等下周教程发布后,直接看教程即可。


改成下面的方式,扩展更加方便:
#define HARD_KEY_NUM            8                                         /* 实体按键个数 */
#define KEY_COUNT                    (HARD_KEY_NUM + 2)        /* 8个独立建 + 2个组合按键 */

/* 使能GPIO时钟 */
#define ALL_KEY_GPIO_CLK_ENABLE() {        
                __HAL_RCC_GPIOB_CLK_ENABLE();        
                __HAL_RCC_GPIOC_CLK_ENABLE();        
                __HAL_RCC_GPIOG_CLK_ENABLE();        
                __HAL_RCC_GPIOH_CLK_ENABLE();        
                __HAL_RCC_GPIOI_CLK_ENABLE();        
        };

/* 依次定义GPIO */
typedef struct
{
        GPIO_TypeDef* gpio;
        uint16_t pin;
        uint8_t ActiveLevel;        /* 激活电平 */
}X_GPIO_T;

/* GPIO和PIN定义 */
static const X_GPIO_T s_gpio_list[HARD_KEY_NUM] = {
        {GPIOI, GPIO_PIN_8, 0},           /* K1 */
        {GPIOC, GPIO_PIN_13, 0},        /* K2 */
        {GPIOH, GPIO_PIN_4, 0},          /* K3 */
        {GPIOG, GPIO_PIN_2, 0},         /* JOY_U */        
        {GPIOB, GPIO_PIN_0, 0},         /* JOY_D */
        {GPIOG, GPIO_PIN_3, 0},         /* JOY_L */        
        {GPIOG, GPIO_PIN_7, 0},          /* JOY_R */        
        {GPIOI, GPIO_PIN_11, 0},        /* JOY_OK */
};        

/* 定义一个宏函数简化后续代码
        判断GPIO引脚是否有效按下
*/
static KEY_T s_tBtn[KEY_COUNT] = {0};
static KEY_FIFO_T s_tKey;                /* 按键FIFO变量,结构体 */

static void bsp_InitKeyVar(void);
static void bsp_InitKeyHard(void);
static void bsp_DetectKey(uint8_t i);

#define KEY_PIN_ACTIVE(id)        

/*
*********************************************************************************************************
*        函 数 名: KeyPinActive
*        功能说明: 判断按键是否按下
*        形    参: 无
*        返 回 值: 返回值1 表示按下(导通),0表示未按下(释放)
*********************************************************************************************************
*/
static uint8_t KeyPinActive(uint8_t _id)
{
        uint8_t level;
        
        if ((s_gpio_list[_id].gpio->IDR & s_gpio_list[_id].pin) == 0)
        {
                level = 0;
        }
        else
        {
                level = 1;
        }

        if (level == s_gpio_list[_id].ActiveLevel)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}

/*
*********************************************************************************************************
*        函 数 名: IsKeyDownFunc
*        功能说明: 判断按键是否按下。单键和组合键区分。单键事件不允许有其他键按下。
*        形    参: 无
*        返 回 值: 返回值1 表示按下(导通),0表示未按下(释放)
*********************************************************************************************************
*/
static uint8_t IsKeyDownFunc(uint8_t _id)
{
        /* 实体单键 */
        if (_id < HARD_KEY_NUM)
        {
                uint8_t i;
                uint8_t count = 0;
                uint8_t save = 255;
               
                /* 判断有几个键按下 */
                for (i = 0; i < HARD_KEY_NUM; i++)
                {
                        if (KeyPinActive(i))
                        {
                                count++;
                                save = i;
                        }
                }
               
                if (count == 1 && save == _id)
                {
                        return 1;        /* 只有1个键按下时才有效 */
                }               

                return 0;
        }
        
        /* 组合键 K1K2 */
        if (_id == HARD_KEY_NUM + 0)
        {
                if (KeyPinActive(KID_K1) && KeyPinActive(KID_K2))
                {
                        return 1;
                }
                else
                {
                        return 0;
                }
        }

        /* 组合键 K2K3 */
        if (_id == HARD_KEY_NUM + 1)
        {
                if (KeyPinActive(KID_K2) && KeyPinActive(KID_K3))
                {
                        return 1;
                }
                else
                {
                        return 0;
                }
        }

        return 0;
}

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

399

主题

399

帖子

0

粉丝