野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20291|回复: 3

写了一个按键长短按的程序,有一些问题不知道如何解决

[复制链接]
发表于 2021-8-28 10:48:45 | 显示全部楼层 |阅读模式
#include "./key/bsp_key.h"
#include "bsp_led.h"  

/**
  * @brief  配置按键用到的I/O口
  * @param  无
  * @retval 无
  */
void Key_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /*开启按键端口的时钟*/
        RCC_APB2PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK|KEY3_GPIO_CLK,ENABLE);
       
        //选择按键的引脚
        GPIO_InitStructure.GPIO_Pin = KEY1_GPIO_PIN;
        // 设置按键的引脚为浮空输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        //使用结构体初始化按键
        GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);
       
        //选择按键的引脚
        GPIO_InitStructure.GPIO_Pin = KEY2_GPIO_PIN;
        //设置按键的引脚为浮空输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        //使用结构体初始化按键
        GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);       
       
        //选择按键的引脚
        GPIO_InitStructure.GPIO_Pin = KEY3_GPIO_PIN;
        //设置按键的引脚为浮空输入
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        //使用结构体初始化按键
        GPIO_Init(KEY3_GPIO_PORT, &GPIO_InitStructure);
}




/*状态机按键,实现短按、长按、双击*/

typedef enum
{
        KEY_STATE_RELEASE = 0,
       
       
        KEY_STATE_PRESSED,
       
               
}Touch_State;

uint8_t KEY_self = 0;

//uint8_t KEY_longflag = 0;

//uint8_t KEY_longcnt = 0;

//uint8_t KEY_doubleflag = 0;

//uint8_t KEY_doublecnt = 0;

//按键状态机
uint8_t tough_detect(void)
{
        static Touch_State touch_state = KEY_STATE_RELEASE;
        static uint8_t KEY_longflag=0;
        static uint8_t KEY_longcnt=0;
        uint8_t result;
       
        if(KEY_longflag==1)
                KEY_longcnt++;

       
        switch(touch_state)
        {
                case KEY_STATE_RELEASE:
                        if(GPIO_ReadInputDataBit(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==Bit_SET)
                        {
                                KEY_longflag = 1;
                                touch_state = KEY_STATE_PRESSED;
                                result = KEY_NOT_PRESSED;
                        }
                        else
                        {
                                touch_state = KEY_STATE_RELEASE;
                                result = KEY_NOT_PRESSED;
                        }
                        break;
                       
                       
                case KEY_STATE_PRESSED:
                        if(GPIO_ReadInputDataBit(KEY1_GPIO_PORT,KEY1_GPIO_PIN)==Bit_RESET)
                        {
                                if(KEY_longcnt<=100)
                                {       
                                        touch_state = KEY_STATE_RELEASE;
                                        result = KEY_SHORT_PRESSED;
                                }
                                else
                                {
                                        touch_state = KEY_STATE_RELEASE;
                                        result = KEY_LONG_PRESSED;
                                }
                               
                                KEY_longflag = 0;
                               
                                KEY_longcnt = 0;
                               
                        }
                        else
                        {
                                touch_state = KEY_STATE_PRESSED;
                                result = KEY_NOT_PRESSED;
                        }
                        break;
                       
        }       
       
        return result;
}



        注释这句 ,if(KEY_longflag==1)
                KEY_longcnt++;
短按就有用,不注释就出了问题,不知道哪里出了问题。


按键检测 - 2.zip

2.51 MB, 下载次数: 12

回复

使用道具 举报

 楼主| 发表于 2021-8-29 15:48:34 | 显示全部楼层
主函数里面加个10ms的延时就好了
回复 支持 反对

使用道具 举报

发表于 2021-8-30 08:54:51 | 显示全部楼层

回帖奖励 +10 火花

加10ms的延时吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-8-30 15:14:41 | 显示全部楼层
这是一位大佬写的,你可以参考一下

多功能按键.zip

2.34 MB, 下载次数: 48

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-24 13:00 , Processed in 0.030106 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表