打印
[技术问答]

按键定时器检测:短按、长按

[复制链接]
4416|59
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hudi008|  楼主 | 2023-5-19 14:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

 通过使用定时器计数的方法来分辨按键的:短按、长按
检测到引脚被拉低:按键按下为低电平,没有按下为高电平
延时10毫秒:滤波
引脚还是被拉低:确定按键被按下
设置按键按下标志
开启定时器,开始计数:定时器中有一个全局变量用于记录计数值
直到引脚被拉高:按键被释放将为高电平
关闭定时器
检测按键按下标志
检测定时器按键检测时间全局变量是否大于某个值,一般为200ms
大于则为长按,否则为短按

typedef enum
{
        KEY_SINGLE_PRESSED,
        KEY_LONG_PRESSED,
        KEY_DEFAULT_STATUS,
} key_state_e;

uint8_t ylf_key_scan(void)
{
        static uint8_t press_flag;

        if(!KEY_PIN)
        {
                delay_ms(10);
                if (!KEY_PIN)
                {
                        press_flag = 1;
                        TR0 = 1;           // 定时器0开始计数
                        while(!KEY_PIN);
                        TR0 = 0;           // 定时器0计数结束
                }
        }
        if (press_flag)
        {
                if (KEY_COUNT >= 200)
                {       
                        KEY_COUNT = 0;
                        press_flag = 0;                       
                        return KEY_LONG_PRESSED;

                } else {               
                        KEY_COUNT = 0;
                        press_flag = 0;       
                        return KEY_SINGLE_PRESSED;
                }
        }
        return KEY_DEFAULT_STATUS;
}


int main(void)
{
       
        while(1)
        {
                switch(ylf_key_scan())
                {
                case KEY_SINGLE_PRESSED:
                        // TO DO
                        break;
                case KEY_LONG_PRESSED:
                        // TO DO
                        break;
                default:
                        break;
                }
        }
}


使用特权

评论回复
沙发
lmn2005| | 2023-5-24 08:05 | 只看该作者
这个设计思路好。

使用特权

评论回复
板凳
tpgf| | 2023-6-5 12:09 | 只看该作者
这个定时检测的定时时长如何确定呢

使用特权

评论回复
地板
qcliu| | 2023-6-5 13:34 | 只看该作者
如果只是通过硬件滤波 还需要软件进行延时吗

使用特权

评论回复
5
drer| | 2023-6-5 13:56 | 只看该作者
是不是可以改变一下方式 就是检测一下跳变沿 然后看过去了多长时间

使用特权

评论回复
6
coshi| | 2023-6-5 14:07 | 只看该作者
条理非常清晰 只不过感觉对cpu的占用率比较高

使用特权

评论回复
7
kxsi| | 2023-6-5 14:43 | 只看该作者
扫描函数的执行没有任何时间间隔吗?

使用特权

评论回复
8
wiba| | 2023-6-5 15:06 | 只看该作者
kxsi 发表于 2023-6-5 14:43
扫描函数的执行没有任何时间间隔吗?

看楼主的代码应该是没有 如果是没有其他功能的话还是可以接受的

使用特权

评论回复
9
1988020566| | 2023-6-6 15:17 | 只看该作者
如何检测一个按键是否被按下多次              

使用特权

评论回复
10
yorkbarney| | 2023-6-7 13:48 | 只看该作者
去抖处理可以通过软件延时或硬件滤波器等方式进行,长按检测则需要通过定时器的计数值来判断。

使用特权

评论回复
11
updownq| | 2023-6-7 21:22 | 只看该作者
在主循环处理函数中,检测是否有按键事件发生,并进行相应的处理。

使用特权

评论回复
12
caigang13| | 2023-6-8 20:26 | 只看该作者
用定时器检测方便

使用特权

评论回复
13
febgxu| | 2023-6-8 22:35 | 只看该作者
在检测按键状态时,需要进行去抖和长按检测等处理。

使用特权

评论回复
14
earlmax| | 2023-6-8 22:41 | 只看该作者
需要注意按键的硬件连接、IO口的配置和防止按键误触等细节,以避免不必要的错误和干扰。

使用特权

评论回复
15
maudlu| | 2023-6-10 10:11 | 只看该作者
定时器的计数时间需要根据实际需求进行设置,一般可以选择10ms或20ms左右的时间间隔。

使用特权

评论回复
16
bartonalfred| | 2023-6-10 10:20 | 只看该作者
在定时器中断处理函数中,读取按键IO口的状态,并进行相应的判断。如果检测到按键被按下,则产生相应的事件标志或消息,并进行相应的处理。

使用特权

评论回复
17
lzbf| | 2023-6-10 10:39 | 只看该作者
基本原理是使用一个定时器来定期扫描按键的状态,检测到按键按下后,再进行相应的处理和响应。

使用特权

评论回复
18
averyleigh| | 2023-6-10 11:16 | 只看该作者
一般可以使用状态机或事件驱动等方式来管理按键事件,以便快速响应用户的操作。

使用特权

评论回复
19
51xlf| | 2023-6-10 12:05 | 只看该作者
单片机按键检测时间差。              

使用特权

评论回复
20
10299823| | 2023-6-10 12:10 | 只看该作者
用于检测按键是否被按下,并产生相应的响应。

使用特权

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

本版积分规则

251

主题

9584

帖子

11

粉丝