OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 1290|回复: 0

HAL库实现STM32F103C8T6状态机实现按键的长按和短按点亮LED灯

[复制链接]

2

主题

5

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2021-11-27
在线时间
5 小时
发表于 2024-1-16 17:22:35 | 显示全部楼层 |阅读模式
//key.h文件
#ifndef _KEY_H_
#define _KEY_H_
#include"stm32f1xx_hal.h"
#define CONFIRM_TIME 5
#define LONG_PRESS_TIME 1000
uint8_t Key_Scan(void);
typedef enum {
    KEY_RELEASE = 0,//释放松开
        KEY_CONFIRM,//消抖
        KEY_SHORTPRESS,//短按
        KEY_LONGPRESS,//长按
} ButtonState;

#endif
//key.c文件
#include"key.h"
ButtonState buttonState = KEY_RELEASE;
uint32_t buttonPressTime = 0;
uint8_t Key_Scan(void)
{
        uint64_t curSysTime;
         switch (buttonState) {
        case KEY_RELEASE:
            if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET) {
                buttonState = KEY_CONFIRM;
                buttonPressTime = HAL_GetTick();
            }
                        return 0;
            break;

        case KEY_CONFIRM:
            if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_RESET) {
              //buttonState = KEY_RELEASE;
                                  curSysTime = HAL_GetTick();
                                if(curSysTime -buttonPressTime > CONFIRM_TIME){
                                        buttonState = KEY_SHORTPRESS;
                                }
                               
            } else {
                 buttonState = KEY_RELEASE;

                }
            break;

        case KEY_SHORTPRESS:
            if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_SET) {
                buttonState = KEY_RELEASE;
               return 1;//返回按键码值,短按状态
            } else {
                                curSysTime = HAL_GetTick();
                if(curSysTime - buttonPressTime > LONG_PRESS_TIME  ){
                                        buttonState = KEY_LONGPRESS;
                                }
            }
            break;

        case KEY_LONGPRESS:
            if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_13) == GPIO_PIN_SET) {
                buttonState = KEY_RELEASE;
                                return 2;
            }
            break;
                default :buttonState = KEY_RELEASE;
                        break;       
                       
    }
         return 0;
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 13:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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