打印

STM32按键的另一种实现——状态机

[复制链接]
676|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
张さん|  楼主 | 2019-11-1 15:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#ifndef _KEY_H_
#define _KEY_H_

#include "HAL_gpio.h" // 换成STM32F103对应的GPIO库
#include "type.h"     // type.h主要是一些类型的重命名

#define KEY_UP_GRP         GPIOA
#define KEY_UP_IDX         GPIO_Pin_9
#define KEY_UP_IS_DOWN()   GPIO_ReadInputDataBit(KEY_UP_GRP, KEY_UP_IDX)
#define KEY_UP_CONFIG()    GPIOConfig(KEY_UP_GRP, KEY_UP_IDX, GPIO_Mode_IPU) // 这个函数我在之前帖子里面写过

#define KEY_DOWN_GRP       GPIOA
#define KEY_DOWN_IDX       GPIO_Pin_10
#define KEY_DOWN_IS_DOWN() GPIO_ReadInputDataBit(KEY_DOWN_GRP, KEY_DOWN_IDX)
#define KEY_DOWN_CONFIG()  GPIOConfig(KEY_DOWN_GRP, KEY_DOWN_IDX, GPIO_Mode_IPU)

#define KEY_FUNC_GRP       GPIOA
#define KEY_FUNC_IDX       GPIO_Pin_11
#define KEY_FUNC_IS_DOWN() GPIO_ReadInputDataBit(KEY_FUNC_GRP, KEY_FUNC_IDX)
#define KEY_FUNC_CONFIG()  GPIOConfig(KEY_FUNC_GRP, KEY_FUNC_IDX, GPIO_Mode_IPU)

#define KEY_TURN_GRP       GPIOA
#define KEY_TURN_IDX       GPIO_Pin_12 | GPIO_Pin_13
#define KEY_TURN_IS_DOWN() GPIO_ReadInputDataBit(KEY_TURN_GRP, KEY_TURN_IDX)
#define KEY_TURN_CONFIG()  GPIOConfig(KEY_TURN_GRP, KEY_TURN_IDX, GPIO_Mode_IPU)

//====================================================================================
typedef enum
{
    CONFIRM_KEY = 1,
    FUNC_KEY,
    UP_KEY,
    DOWN_KEY
} key_event_t;

#define state_keyUp      0       //初始状态,未按键
#define state_keyDown       1       //键被按下
#define state_keyLong  2       //长按
#define state_keyTime   3       //按键计时态

#define return_keyUp         0x00    //初始状态
#define return_keyPressed   0x01    //键被按过,普通按键
#define return_keyLong     0x02    //长按
#define return_keyAuto     0x04    //自动连发

#define key_down              0       //按下
#define key_up                  0xf0    //未按时的key有效位键值
#define key_longTimes      100     //10ms一次,200次即2秒,定义长按的判定时间
#define key_autoTimes      20      //连发时间定义,20*10=200,200毫秒发一次


#define KEYS1_VALUE          0xe0    //keyS1 按下
#define KEYS2_VALUE          0xd0    //keyS2 按下
#define KEYS3_VALUE          0xb0    //keyS3 按下
#define KEYS4_5_VALUE      0x70    //keyS4_5 按下

//====================================================================================
void KeyProcess(void);  //T0定时器调用的工作函数
void KeyTimerInit(void);

#endif /* _KEY_H_ */

使用特权

评论回复

相关帖子

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

本版积分规则

448

主题

464

帖子

1

粉丝