打印
[其他ST产品]

Stm32解决按键长按与短按

[复制链接]
1148|64
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Stm32 解决按键的长按和短按废话不多说, 直接上干货 注意:本文是采用Stm32 HAL库编写, 可以移植成库函数, 其原理是相同的!!!![color=rgba(0, 0, 0, 0.75)]第一步 : 首先在key.h定义几个变量
/ 按键的键值
#define KEY1_Press 1
#define KEY2_Press 2
#define KEY3_Press 3
#define KEY4_Press 4

/ 读取IO口的电平
#define KEY1 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
#define KEY2 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1)
#define KEY3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2)
#define KEY4 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0)



使用特权

评论回复
评论
突然下起雨 2023-1-15 15:17 回复TA
———————————————— 版权声明:本文为CSDN博主「YELLOW_YELLOW_YELOW」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/zhengyuehai/article/details/124078619 
沙发
突然下起雨|  楼主 | 2023-1-15 15:15 | 只看该作者
第二步: 在key.c 中编写按键扫描函数
<font color = blue  size   = 5> 编写的按键扫描函数, 只需要返回键值即可, 不需要我们判断按键是否松开这些情况 

uint8_t KEY_Scan()
{
        if ((KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0)) 判断是否有按键按下
        {
                HAL_Delay(10);  消抖
                if((KEY1 == 0 || KEY2 == 0 || KEY3 == 0 || KEY4 == 0))/// 判断按键是否按下
                {
                        if (!KEY1)  return KEY1_Press;/ 返回键值
                        else if (!KEY2) return KEY2_Press;
                        else if (!KEY3) return KEY3_Press;
                        else if (!KEY4) return KEY4_Press;
                }
               
        }
        return 0; / 如果没有按键按下 返回0
}

使用特权

评论回复
板凳
突然下起雨|  楼主 | 2023-1-15 16:15 | 只看该作者
编写定时器(1ms)
这里我们认为 当按下按键的时间持续 0.8s 认为是长按 !!!!, 需要开启一个定时器和2个记录时间的变量(key_last_time, key_now_time), 为了快速配置, 这里我们使用 Stm32cubemx 配置 我们还可以设置长按的时间来设置不同的状态, 这也是实现仅一个按键可以实现控制多个状态的方法 我使用的板子时钟配置为80MHz, 配置 1ms的中断,

使用特权

评论回复
地板
突然下起雨|  楼主 | 2023-1-15 16:17 | 只看该作者

使用特权

评论回复
5
突然下起雨|  楼主 | 2023-1-15 16:20 | 只看该作者

使用特权

评论回复
6
突然下起雨|  楼主 | 2023-1-15 16:52 | 只看该作者

使用特权

评论回复
7
突然下起雨|  楼主 | 2023-1-15 16:53 | 只看该作者
接下来, 我们只需要 让key_now_time变量在这一个定时器中断里面加1即可

使用特权

评论回复
8
突然下起雨|  楼主 | 2023-1-15 16:54 | 只看该作者

使用特权

评论回复
9
突然下起雨|  楼主 | 2023-1-15 16:55 | 只看该作者
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)  1ms的中断
{
        key_now_time++;
}

使用特权

评论回复
10
突然下起雨|  楼主 | 2023-1-15 16:56 | 只看该作者
编写按键处理函数

使用特权

评论回复
11
突然下起雨|  楼主 | 2023-1-15 16:57 | 只看该作者
按键处理函数:
void Deal_Key(void)
{
        uint8_t key_value;
        key_value = KEY_Scan(); 获取键值
       
       
        if (key_value !=key_old )
                 与上一次的键值比较 如果不相等,表明有键值的变化,开始计时
        {
               
                key_old = key_value; 更新旧键值
                key_last_time = key_now_time; 让2者相等,
        }
        else
                key_value = 0; 如果没有键值的改变 说明没有按键按下或松开
       
       
        if (key_value)/ 短按处理
        {
                switch(key_value)
                {
                        case 1 :   printf("KEY1 按下\r\n"); break;
                        case 2 :   printf("KEY2 按下\r\n"); break;
                        case 3 :   printf("KEY3 按下\r\n"); break;
                        case 4 :   printf("KEY4 按下\r\n"); break;
                }
                key_value = 0; /// 该语句可有可无, 为了保险, 最好加上
        }
       
       
        if ((key_now_time- key_last_time > 800))/ 如果按键按下超过0.8s 判断按键
        {
                if(key_old) / 注意 一定是判断旧键值, 因为当按键一直按下未松开时, 即key_old == key_value,
                 此时key_value 0 ;
                {
                        switch(key_old)
                        {
                        case 1 :   printf("KEY1 长按\r\n"); break;
                        case 2 :   printf("KEY2 长按\r\n"); break;
                        case 3 :   printf("KEY3 长按\r\n"); break;
                        case 4 :   printf("KEY4 长按\r\n"); break;
                        }
                }
        }
}

使用特权

评论回复
12
突然下起雨|  楼主 | 2023-1-15 16:58 | 只看该作者
接下来, 我们只需要把按键处理函数放入while(1) 大循环中即可!!!!

使用特权

评论回复
13
盾视工作室| | 2023-4-24 22:28 | 只看该作者
有全源代码吗?我移植没成功

使用特权

评论回复
14
caoenq| | 2023-4-25 08:50 | 只看该作者
程序里最好不要有HAL_Delay

使用特权

评论回复
15
tabmone| | 2023-5-5 13:28 | 只看该作者
轮询方式需要在主循环中不断地检测按键状态,当检测到按键被按下后,可以设置一个定时器来延迟一段时间,再次检测按键状态。如果按键一直处于按下状态,则可以将其视为连续按键。

使用特权

评论回复
16
janewood| | 2023-5-5 18:45 | 只看该作者
在STM32中,实现连续按键可以通过轮询或中断的方式来实现。

使用特权

评论回复
17
usysm| | 2023-5-5 18:54 | 只看该作者
这个是使用的定时器判断的吗
              

使用特权

评论回复
18
kmzuaz| | 2023-5-5 20:36 | 只看该作者
这个长按和端按的界定是什么              

使用特权

评论回复
19
lzbf| | 2023-5-5 21:10 | 只看该作者
STM32如何实现连续按键              

使用特权

评论回复
20
cashrwood| | 2023-5-5 21:35 | 只看该作者
按键松开, 判断是短按还是长按, 如果长按时间大于设定的时间(根据key.h的宏定义进行修改),返回长按数值 如果小于设定时间,说明是短按,返回短按数值

使用特权

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

本版积分规则

25

主题

244

帖子

1

粉丝