OpenEdv-开源电子网

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

有没有哪位大佬写过一个按键有短按,长按,连按多次功能的程序

[复制链接]

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
发表于 2018-1-27 17:27:11 | 显示全部楼层 |阅读模式
10金钱
如题,如果哪位大佬写过类似的程序,可否指点小弟一下,给小弟一点思路。程序最好有一定的实用性

最佳答案

查看完整内容[请看2#楼]

思路,定时器中断测定按压时长,从而执行特定动作。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

462

帖子

0

精华

高级会员

Rank: 4

积分
904
金钱
904
注册时间
2017-12-15
在线时间
111 小时
发表于 2018-1-27 17:27:12 | 显示全部楼层
思路,定时器中断测定按压时长,从而执行特定动作。
回复

使用道具 举报

17

主题

354

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2017-5-21
在线时间
340 小时
发表于 2018-1-29 05:25:00 来自手机 | 显示全部楼层
你看看这个方案,说得很详细
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
 楼主| 发表于 2018-1-29 08:14:44 | 显示全部楼层
a496298685 发表于 2018-1-27 17:27
思路,定时器中断测定按压时长,从而执行特定动作。

这个我知道,我主要想知道连按是怎么实现的
回复

使用道具 举报

62

主题

902

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3555
金钱
3555
注册时间
2016-1-8
在线时间
543 小时
发表于 2018-1-29 09:45:58 | 显示全部楼层
东方三毒 发表于 2018-1-29 08:14
这个我知道,我主要想知道连按是怎么实现的

1S内检测到两次低电平
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2018-1-29 11:03:16 | 显示全部楼层
《STM8L之自定义长短按键》:http://blog.csdn.net/feilusia/article/details/53154346
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2014-6-27
在线时间
961 小时
发表于 2018-1-30 10:27:11 | 显示全部楼层
给你一个模板,可以实现你要的功能
void scan_key( u8 *key_val)
{
    static u8                   keyValue;
    static u8                   tmp_keyValue;
    static u8                   keyTrigger;
    static u8                   keyKeep;
    static u16                     keyDelayNum;
    static u16                     keyDelayNumValue;
    u8 x;
    keyValue = getKeyState(); // 得到按键的物理状态
    while(1)
    {
        if(keyValue != tmp_keyValue)
        {
            tmp_keyValue = keyValue;
            keyDelayNumValue = 10; //设置去抖节拍数
            keyDelayNum = 0;
            keyTrigger = 0;
            keyKeep = 0;
            break;
        }
        else
        {
            if(keyDelayNum < keyDelayNumValue)
            {
                keyDelayNum++;
                break;
            }

        }
        keyTrigger = keyValue & (keyValue ^ keyKeep);
        keyKeep = keyValue;
               
        if(keyValue)
        {

                                                    if(keyTrigger)
                                                    {

                                                            keyDelayNum = 0;
                                                            keyDelayNumValue = 400;//设置长按键节拍数

                                                            //处理短按,得到键值*key_val = x;


                                                            



                                                    }
                                                    else
                                                    {
                                                               //处理长按键和连按键,如果不需要,这里不添加代码
                                                            
                                                    }


        }
        else
        {
            //处理释放后要的键值,如同鼠标单击功能,多击也在这里处理,不需要,直接清键值
             *key_val = NULL;


        }

        break;
    }

}
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
 楼主| 发表于 2018-1-31 14:53:07 | 显示全部楼层
TinyBoy 发表于 2018-1-30 10:27
给你一个模板,可以实现你要的功能
void scan_key( u8 *key_val)
{

谢谢大佬分享,不过小弟现在能力有限,暂时还没看懂
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
 楼主| 发表于 2018-1-31 15:02:44 | 显示全部楼层
Sun_Fly 发表于 2018-1-29 09:45
1S内检测到两次低电平

这个可以考虑,不过感觉好像比较复杂
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
 楼主| 发表于 2018-1-31 15:03:59 | 显示全部楼层
feilusia 发表于 2018-1-29 11:03
《STM8L之自定义长短按键》:http://blog.csdn.net/feilusia/article/details/53154346

谢谢分享
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1770
金钱
1770
注册时间
2014-6-27
在线时间
961 小时
发表于 2018-1-31 15:42:24 | 显示全部楼层
东方三毒 发表于 2018-1-31 14:53
谢谢大佬分享,不过小弟现在能力有限,暂时还没看懂

假设5MS扫描此函数一次

                      void scan_key( u8 *key_val)
{
    static uchar                   keyValue;
    static uchar                   tmp_keyValue;
    static uchar                   keyTrigger;
    static uchar                   keyKeep;
    static u16                     keyDelayNum;
    static u16                     keyDelayNumValue;
    keyValue = ((GPIO_ReadInputData(GPIOC) >> 1) & 0x01) ^ 0x01; //只有一个按键,得到按键状态
    while(1)
    {
        if(keyValue != tmp_keyValue)
        {
            tmp_keyValue = keyValue;
            keyDelayNumValue = 10; //去抖50MS
            keyDelayNum = 0;
            keyTrigger = 0;
            keyKeep = 0;
            break;
        }
        else
        {
            if(keyDelayNum < keyDelayNumValue)
            {
                keyDelayNum++;
                break;
            }

        }
        keyTrigger = keyValue & (keyValue ^ keyKeep);
        keyKeep = keyValue;
        if(keyValue)
        {

            if(keyTrigger)
            {

                keyDelayNum = 0;
                keyDelayNumValue = 200; //设置得到长按键的时间,1S
                *key_val = 0x01 ;   //这里得到短按键值



            }
            else
            {

                keyDelayNum = 0;
                keyDelayNumValue = 40; //如果需要连按,不要释放按键
                //这里200MS就得到一次键值,实现连按,连按键是周期性的得到长按键
                *key_val = 0x02; //如果5MS节拍,1S后得到长按键
            }


        }
        else
        {

             *key_val = NULL;

        }

        break;
    }

}
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
 楼主| 发表于 2018-1-31 17:28:08 | 显示全部楼层
TinyBoy 发表于 2018-1-31 15:42
假设5MS扫描此函数一次

                      void scan_key( u8 *key_val)

static uchar                   keyValue;
    static uchar                   tmp_keyValue;
    static uchar                   keyTrigger;
    static uchar                   keyKeep;
    static u16                     keyDelayNum;
    static u16                     keyDelayNumValue;
主要是这些函数的定义
回复

使用道具 举报

1

主题

882

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3071
金钱
3071
注册时间
2018-2-7
在线时间
285 小时
发表于 2018-2-7 15:27:46 | 显示全部楼层
//mode: 0 不支持连续按 1:支持连续按
//0 没有任何按键按下  1 KEY1按下 2 KEY2按下
u8 KEY_Scan(u8 mode)
{
        static u8 key_up = 1; //按键松开标志
        if(mode) key_up = 1;  //支持连按
        if(key_up && (KEY1 == RESET || KEY2 == RESET))
        {
                delay_ms(10);   //去抖
                key_up = 0;
                if(KEY1 == RESET)
                        return 1;
                if(KEY2 == RESET)
                        return 2;
        }
        if(KEY1 != RESET && KEY2 != RESET)
        {
                key_up = 1;
        }
        return 0;
}
回复

使用道具 举报

2

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2017-11-6
在线时间
15 小时
 楼主| 发表于 2018-2-24 14:33:30 | 显示全部楼层
HXYDJ 发表于 2018-2-7 15:27
//mode: 0 不支持连续按 1:支持连续按
//0 没有任何按键按下  1 KEY1按下 2 KEY2按下
u8 KEY_Scan(u8 mod ...

谢谢
回复

使用道具 举报

10

主题

271

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1236
金钱
1236
注册时间
2015-5-14
在线时间
352 小时
发表于 2018-2-26 06:39:19 来自手机 | 显示全部楼层
http://blog.csdn.net/wuhenyouyuyouyu/article/details/77622340
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-1 11:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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