OpenEdv-开源电子网

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

鄙人不才,分享一个按键给新手,实现单击、双击、长按的功能

[复制链接]

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
发表于 2017-7-17 17:27:57 | 显示全部楼层 |阅读模式
希望新手们及早放弃用delay延时消抖等等,最好用定时器来实现按键消抖,延时等等~~~下面是我做的简单的按键多功能,程序如下:

uchar S_key = 2,D_key = 1,L_key = 3,N_key = 0;
bit b_key_led;
bit b_key_smg;

uchar key_drive(void)
{
        static uchar key_state;
        static uint key_time = 0;
        uchar key_return;
        key_return = N_key;
       
        switch(key_state)
        {
                case 0:
                {
                        if(!S1)
            {
                                key_state = 1;
                        }
                };break;
                case 1:
                {
                        if(!S1)
                        {
                                key_time = 0;
                                key_state = 2;
                        }
                        else
                        {
                                key_state = 0;
                        }
                };break;
                case 2:
                {
                        if(S1)
                        {
                                key_return = D_key;
                                key_state = 0;
                        }
                        else if(++key_time >= 1500)
                        {
                                key_return = L_key;
                                key_state = 3;
                        }
                };break;
                case 3:
                {
                        if(S1)
                        {
                                key_state = 0;
                        }
                };break;
        }
        return key_return;
}

uchar key_read(void)
{
        static uchar key_state_1,key_time_1 = 0;
        uchar key_return,key_temp;
       
        key_temp = key_drive();
        switch(key_state_1)
        {
                case 0:
                {
                        if(key_temp == D_key)
                        {
                                key_time_1 = 0;
                                key_state_1 = 1;
                        }
                        else
                        {
                                key_return = key_temp;
                        }
                };break;
                case 1:
                {
                        if(key_temp == D_key)
                        {
                                key_return = S_key;
                                key_state_1 = 0;
                        }
                        else if(++key_time_1 >= 250)
                        {
                                key_return = D_key;
                                key_state_1 = 0;
                        }
                };break;
        }
        return key_return;
}
void key_on(void)
{
        uchar state_1;
        state_1 = key_read();
        if(state_1 == S_key)     //双击
        {
                /*双击按键实现呼吸灯功能*/
                state_1 = 0;
                b_key_led = 1;
                b_key_smg = 0;
                seg = 0x00;
                seg_l = 0x00;
        }
        if(state_1 == D_key)     //单按
        {
                /*单击实现数码管走时*/
                state_1 = 0;
                b_key_smg = 1;
                b_key_led = 0;
                PW1D = 0x0000;
        }
        if(state_1 == L_key)     //长按
        {
                /*长按,实现你要实现的功能*/
        }
}

我是小白,很白很白的小白!!!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2017-7-18
在线时间
1 小时
发表于 2017-7-18 14:25:30 | 显示全部楼层
虽然我现在还不能看得懂你发的是啥意思,但是我还是支持你
回复 支持 0 反对 1

使用道具 举报

2

主题

255

帖子

0

精华

高级会员

Rank: 4

积分
821
金钱
821
注册时间
2013-6-5
在线时间
141 小时
发表于 2017-7-18 11:52:31 | 显示全部楼层
本帖最后由 zhxzhx 于 2017-7-18 11:54 编辑

delay 有什么不好?单片机也没有什么事要做,不能为了形式而形式,你这个按键多复杂!除非你上多任务,否则延时不延时没什么意义.
回复 支持 反对

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2017-7-18 13:29:24 | 显示全部楼层
用一个液晶显示屏和按键单次 双击 常按直观操作一下更好。
回复 支持 反对

使用道具 举报

32

主题

300

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1049
金钱
1049
注册时间
2012-3-30
在线时间
321 小时
发表于 2017-7-18 13:32:27 | 显示全部楼层
对于需要设置多项参数的程序,按键操作设计得合理,
软件流程就可以编制得更紧凑,可移植,可靠性,可读性更高。
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-7-18 15:41:23 | 显示全部楼层
zhxzhx 发表于 2017-7-18 11:52
delay 有什么不好?单片机也没有什么事要做,不能为了形式而形式,你这个按键多复杂!除非你上多任务,否则延时 ...

delay你死等啊,反正你就用吧
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-7-18 15:41:54 | 显示全部楼层
czhaii 发表于 2017-7-18 13:29
用一个液晶显示屏和按键单次 双击 常按直观操作一下更好。

没做LCD
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-7-18 15:42:55 | 显示全部楼层
czhaii 发表于 2017-7-18 13:32
对于需要设置多项参数的程序,按键操作设计得合理,
软件流程就可以编制得更紧凑,可移植,可靠性,可读性 ...

我这个是3个任务一起工作,不会影响
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-7-18 15:43:59 | 显示全部楼层
weiwei1990321 发表于 2017-7-18 14:25
虽然我现在还不能看得懂你发的是啥意思,但是我还是支持你

就是一个按键,按一次实现什么功能,连按两次又实现另外功能,长按又实现其他功能
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-7-18 16:05:27 | 显示全部楼层
czhaii 发表于 2017-7-18 13:32
对于需要设置多项参数的程序,按键操作设计得合理,
软件流程就可以编制得更紧凑,可移植,可靠性,可读性 ...

你有没有简单的一个按键实现多键用啊
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-7-18 16:05:42 | 显示全部楼层
czhaii 发表于 2017-7-18 13:32
对于需要设置多项参数的程序,按键操作设计得合理,
软件流程就可以编制得更紧凑,可移植,可靠性,可读性 ...

你有没有简单的一个按键实现多键用啊
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-8-4 14:44:00 | 显示全部楼层
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-8-8 11:02:09 | 显示全部楼层

不才,这个又改进了,可以长按2s,时间到了不松开,也还是会执行任务
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-8-16
在线时间
37 小时
发表于 2017-8-16 11:12:04 | 显示全部楼层
!s1是按键按下 还是 没按下
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-8-17 15:04:12 | 显示全部楼层
liruikun 发表于 2017-8-16 11:12
!s1是按键按下 还是 没按下

!s按下,我的是按键是低电平为按下
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-8-16
在线时间
37 小时
发表于 2017-8-22 10:31:53 | 显示全部楼层
程功之道 发表于 2017-8-17 15:04
!s按下,我的是按键是低电平为按下

但是如果你要一次判断多个键呢 不只是s1 要加s2的话要放在哪里 与S1进行逻辑或吗
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-8-22 10:57:29 | 显示全部楼层
liruikun 发表于 2017-8-22 10:31
但是如果你要一次判断多个键呢 不只是s1 要加s2的话要放在哪里 与S1进行逻辑或吗

还没试过,但是可以在下面加,你多试试
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-8-16
在线时间
37 小时
发表于 2017-8-22 17:54:36 | 显示全部楼层
程功之道 发表于 2017-8-22 10:57
还没试过,但是可以在下面加,你多试试

我试过了 好像不行
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-8-23 14:30:19 | 显示全部楼层
liruikun 发表于 2017-8-22 17:54
我试过了 好像不行

两个按键独立,不要一起
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-8-23 14:33:51 | 显示全部楼层
liruikun 发表于 2017-8-22 17:54
我试过了 好像不行

如果是同一个IO口,例如P0口;你可以这样,两个按键的话分别接P01和P02,然后宏定义一下,key1和key2,if((key1&key2)==0x01),就是按键1按下,你试着想想,应该可以的
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-8-16
在线时间
37 小时
发表于 2017-8-24 09:02:31 | 显示全部楼层
那如果不等于呢  岂不是还要另起一条if 判断?而且你那个是低电平为键按下吧 key1不应该是  宏定义为 GPIO_ReadInputPin(GPIOB, GPIO_PIN_0)之类的吧 如果有键按下 返回的不是0或1么  跟key2 按位与怎么会得到 0x01 不是很懂 新手
回复 支持 反对

使用道具 举报

20

主题

450

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4638
金钱
4638
注册时间
2017-7-6
在线时间
705 小时
 楼主| 发表于 2017-8-24 13:51:22 | 显示全部楼层
liruikun 发表于 2017-8-24 09:02
那如果不等于呢  岂不是还要另起一条if 判断?而且你那个是低电平为键按下吧 key1不应该是  宏定义为 GPIO_ ...

我的是8位的单片机,不是32位的,你自己想,我已经告诉你一个按键的思路了
我是小白,很白很白的小白!!!
回复 支持 反对

使用道具 举报

14

主题

76

帖子

0

精华

初级会员

Rank: 2

积分
77
金钱
77
注册时间
2017-8-16
在线时间
37 小时
发表于 2017-8-24 16:01:37 | 显示全部楼层
程功之道 发表于 2017-8-24 13:51
我的是8位的单片机,不是32位的,你自己想,我已经告诉你一个按键的思路了

O_O.....
回复 支持 反对

使用道具 举报

0

主题

8

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2021-6-28
在线时间
40 小时
发表于 2021-7-13 19:59:29 | 显示全部楼层
醍醐灌顶
回复 支持 反对

使用道具 举报

1

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
114
金钱
114
注册时间
2015-7-27
在线时间
18 小时
发表于 2021-9-13 13:22:10 | 显示全部楼层
学习一下。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2021-9-29
在线时间
1 小时
发表于 2021-9-29 15:01:28 | 显示全部楼层
zhxzhx 发表于 2017-7-18 11:52
delay 有什么不好?单片机也没有什么事要做,不能为了形式而形式,你这个按键多复杂!除非你上多任务,否则延时 ...

我也觉得,什么简单就用什么,有时候CPU没什么事,用延时毫无问题。
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2021-3-8
在线时间
8 小时
发表于 2022-9-10 21:33:20 | 显示全部楼层
注释量有点少
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-25 08:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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