OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...

查看: 2954|回复: 14

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

[复制链接]

  离线 

2

主题

29

帖子

0

精华

初级会员

Rank: 2

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

最佳答案

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

思路,定时器中断测定按压时长,从而执行特定动作。
回复

使用道具 举报

  离线 

5

主题

441

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

16

主题

345

帖子

0

精华

高级会员

Rank: 4

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

使用道具 举报

  离线 

2

主题

29

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

49

主题

739

帖子

0

精华

金牌会员

Rank: 6Rank: 6

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

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

使用道具 举报

  离线 

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
900
金钱
900
注册时间
2013-8-2
在线时间
277 小时
发表于 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);
回复

使用道具 举报

  离线 

8

主题

526

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1009
金钱
1009
注册时间
2014-6-27
在线时间
392 小时
发表于 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

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

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

使用道具 举报

  离线 

2

主题

29

帖子

0

精华

初级会员

Rank: 2

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

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

使用道具 举报

  离线 

2

主题

29

帖子

0

精华

初级会员

Rank: 2

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

谢谢分享
回复

使用道具 举报

  离线 

8

主题

526

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1009
金钱
1009
注册时间
2014-6-27
在线时间
392 小时
发表于 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

积分
66
金钱
66
注册时间
2017-11-6
在线时间
14 小时
 楼主| 发表于 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;
主要是这些函数的定义
回复

使用道具 举报

  离线 

0

主题

406

帖子

0

精华

高级会员

Rank: 4

积分
998
金钱
998
注册时间
2018-2-7
在线时间
110 小时
发表于 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

积分
66
金钱
66
注册时间
2017-11-6
在线时间
14 小时
 楼主| 发表于 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

主题

125

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

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

本版积分规则




关闭

必看:"原子哥”力荐上一条 /1 下一条

QQ|联系我们|手机版|官方淘宝店|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-8-21 02:59

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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