IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 独立按键扫描实现单击、双击、长按事件,使用MultiButton来实现 -> 正文阅读

[嵌入式]独立按键扫描实现单击、双击、长按事件,使用MultiButton来实现

编译器平台及例程说明

编译器平台说明

1. Toolchain : MDK-ARM Community  Version: 5.30.0.0(Kile V5)
2. Encoding  : Encode in UTF-8 without signature
3. Device Specific Packs : Keil.STM32H7xx_DFP.2.7.0.pack
4. Preprocessor Symbols Define : USE_HAL_DRIVER, STM32H743xx
    USE_HAL_DRIVER : 允许使用HAL库驱动
    STM32H743xx    : STM32H743xx芯片
5. Chip Type : STM32H743VIT6, Flash:2MByte, ROM:1MByte
6. 在stm32h7xx_hal_conf.h文件中HSE_VALUE为外部高速振荡器,默认25MHZ。此值必须与硬件保持一致。

例程说明

1. 独立按键扫描实现单击、双击、长按事件,使用MultiButton来实现

一、宏定义说明

#define XTO_STR(e)                                                        (#e)


// PE3  -- User Key1 -- 用户按键1
// PC5  -- User Key2 -- 用户按键2
#define USER_KEY1_PIN                                               USER_KEY1_Pin                             
#define USER_KEY2_PIN                                               USER_KEY2_Pin                                    
#define Read_Key1_State()                                           HAL_GPIO_ReadPin(USER_KEY1_GPIO_Port, USER_KEY1_PIN)
#define Read_Key2_State()                                           HAL_GPIO_ReadPin(USER_KEY2_GPIO_Port, USER_KEY2_PIN)

二、变量的定义

/* 定义按键 */
static struct Button UserButton1 = {0};
static struct Button UserButton2 = {0};

/* 按键ID字符串 */
static char * BTN_ID_STR[2] = 
{
    XTO_STR(BTN1),
    XTO_STR(BTN2),
};

三、读取按键状态

/* 读取按键1状态 */
static u8 ubRead_UserBut1_State(void)
{
    return Read_Key1_State();
}


/* 读取按键2状态 */
static u8 ubRead_UserBut2_State(void)
{
    return Read_Key2_State();
}

四、按键回调处理

/* 显示按键事件 */
static void vShowButton_Event(u8 id, u8 evt)
{
    switch (evt)
    {
        case SINGLE_CLICK:
            dprintf("[%s] Click......\r\n", BTN_ID_STR[id]);
        break;

        case DOUBLE_CLICK:
            dprintf("[%s] Double Click......\r\n", BTN_ID_STR[id]);
        break;

        case LONG_RRESS_START:
            dprintf("[%s] Long Press......\r\n", BTN_ID_STR[id]);
        break;

        default: break;
    }
}


/* UserButton回调处理*/
static void vUserButton_CallBack(void * arg)
{
    Button * btn = (Button *)arg;
    if(btn == &UserButton1)
    {
        vShowButton_Event(0, btn->event);  
    }
    else if(btn == &UserButton2)
    {
        vShowButton_Event(1, btn->event); 
    }
}

五、初始化 MultiButton

/* 初始化按键输入 */
static void vInit_Key_Input(void)
{
    // PC5  -- User Key1 -- 用户按键1
    // PE3  -- User Key2 -- 用户按键2

    GPIO_InitTypeDef GPIO_InitStruct = {0};

    GPIO_InitStruct.Pin   = USER_KEY1_Pin;
    GPIO_InitStruct.Mode  = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull  = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(USER_KEY1_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin  = USER_KEY2_Pin;
    HAL_GPIO_Init(USER_KEY2_GPIO_Port, &GPIO_InitStruct);


    dprintf("6-STM32H743xx_CubeMx_KeyInput_MultiButton......\r\n");
}



/* 初始化 MultiButton */
void vInit_Multi_Button(void)
{
    vInit_Key_Input();

    /* 初始化按键 */
    button_init(&UserButton1, ubRead_UserBut1_State, 0);
    button_init(&UserButton2, ubRead_UserBut2_State, 0);

    /* 注册按键事件 */
    button_attach(&UserButton1, SINGLE_CLICK,     vUserButton_CallBack);//单击
    button_attach(&UserButton1, DOUBLE_CLICK,     vUserButton_CallBack);//双击
    button_attach(&UserButton1, LONG_RRESS_START, vUserButton_CallBack);//长按

    button_attach(&UserButton2, SINGLE_CLICK,     vUserButton_CallBack);
    button_attach(&UserButton2, DOUBLE_CLICK,     vUserButton_CallBack);
    button_attach(&UserButton2, LONG_RRESS_START, vUserButton_CallBack);

    
    /* 开始按键 */
    button_start(&UserButton1);
    button_start(&UserButton2);
}

六、测试例程

int main(void)
{
    static u8 i = 0;

    vStartUp_System();
    vInit_System_BSP();
    vShow_PlatformDevice_Info();
    vInit_Multi_Button();

    while (1)
    {
        /* 5ms定时处理MultiButton按键 */
        button_ticks();

        HAL_Delay(5);
        if((++i) > 100)
        {
            i = 0;
            USER_LED_CPL();
        }
    }
}

七、运行效果

00> Segger Rtt Init Ok...
00> STM32H743VIT6 Start Running...
00> 6-STM32H743xx_CubeMx_KeyInput_MultiButton......
00> Debug Versions......
00> Compile Date : Mar 29 2022 22:04:20
00> 
00> [BTN1] Click......
00> [BTN2] Click......
00> [BTN1] Double Click......
00> [BTN2] Double Click......
00> [BTN1] Long Press......
00> [BTN2] Long Press......
00> [BTN1] Click......
00> [BTN2] Click......
00> [BTN1] Double Click......
00> [BTN2] Double Click......

在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:15:52  更:2022-04-01 00:16:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:30:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码