OpenEdv-开源电子网

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

按键消抖 状态机方式 有没有人懂的

[复制链接]

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
发表于 2015-1-7 11:22:56 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]#define KEY_STATE_0 0 #define KEY_STATE_1 1 #define KEY_STATE_2 2 #define KEY_NONE 0 #define KEY_FILTER_TIME 500 //消抖时间 #define KEY_LONGPRESS_TIME 500000 //长按时间 /*********************************************************************//** * @brief 按键处理--消抖,长按 * @param[in] 键值 * @return 短按时,返回传入的键值。长按时,传入键值的最高位被置1 注意:如果传入键值的最高位为1,返回值将出错 **********************************************************************/ uint32_t key_driver(uint32_t code) { static uint32_t key_state = KEY_STATE_0, key_time = 0, code_last = 0; uint32_t key_return = KEY_NONE; switch (key_state) { case KEY_STATE_0: //初始状态 if (code != 0) { code_last = code; key_time = 0; key_state = KEY_STATE_1; //如果有键被按下,记录键值,并进入消抖及长按确认状态 } break; case KEY_STATE_1: //消抖及长按确认 if (code != code_last) if (key_time > KEY_FILTER_TIME) //如果键值改变,且经过的时间大于消抖时间,认为是一次短按 key_return = code_last; //返回键值 key_state = KEY_STATE_0; //回到初始状态 } else if (++key_time >= KEY_LONGPRESS_TIME) //如果时间大于长按时间 { key_return = (1<<(sizeof(uint32_t)*8-1))|code_last; //最高位置1 key_state = KEY_STATE_2; //转到等待按键释放状态 } break; case KEY_STATE_2: if (code != code_last) //等到按键释放,返回初始状态 key_state = KEY_STATE_0; break; } return key_return; } [/mw_shl_code]
这个是网上 下载的装机方式消抖 法,把按键扫描整合进去还是去不了短按消抖和长按消抖,有没有人懂的,谢谢!

最佳答案

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

看来很多同仁用到状态机啊,谢谢大家,问题已解决!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
 楼主| 发表于 2015-1-7 11:22:57 | 显示全部楼层
看来很多同仁用到状态机啊,谢谢大家,问题已解决!
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-1-7 12:42:14 | 显示全部楼层
扫描按键间隔时间20ms或者40ms
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
 楼主| 发表于 2015-1-7 13:03:54 | 显示全部楼层
回复【2楼】八度空间:
---------------------------------
我现在是10MS,你那是怎么做能具体点吗
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2015-1-7 13:31:01 | 显示全部楼层
我每隔40ms扫描一次按键,也是状态机思想
[mw_shl_code=c,true]u16 KEY_Scan(void) { u16 KeyReturn; //按键返回值 static u8 Key_mode=0; //按键模式 static u16 HarKeyPress=0; //获取硬件值 HarKeyPress = Key_Pin & Key_Reset; //读取按键 switch(Key_mode) { case 0: //初始状态 if(HarKeyPress != Key_Reset) Key_mode = 1; //有按键按下 break; case 1: //确认按键按下 if(HarKeyPress == (Key_Pin & Key_Reset)) { KeyReturn = HarKeyPress; //返回按下按键 Key_mode = 2; } else Key_mode = 0; //按键已经弹起 break; case 2: //连按确认 if(HarKeyPress == Key_Reset) Key_mode = 0; //按键已经弹起,回到初始状态 else //允许连按按键 { KeyReturn &= Key_Cnt; //连按按键 Key_mode = 0; //回到初始状态 } break; } return KeyReturn; //返回按键值 }[/mw_shl_code]

现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

52

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-12-21
在线时间
0 小时
发表于 2015-1-7 22:35:25 | 显示全部楼层
以前写verilog状态机用的多,现在写单片机也流行状态机啦?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1831
金钱
1831
注册时间
2014-6-27
在线时间
980 小时
发表于 2015-1-7 23:00:58 | 显示全部楼层
回复【3楼】zhanghao:
---------------------------------
写个按键扫描有这么难吗?
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-1-8 08:54:19 | 显示全部楼层
回复【5楼】sakuya:
---------------------------------
STM32检测外部中断时间不久好了么,几句搞定还稳定
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
 楼主| 发表于 2015-1-8 09:33:44 | 显示全部楼层
回复【6楼】TinyBoy:
---------------------------------
按键扫描是可以,就是这个短按消抖和 长按消抖需要用状态机的形式来,你要弄个状态机的吗,不过现在已经弄好了,谢谢!
回复

使用道具 举报

12

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2014-9-1
在线时间
0 小时
 楼主| 发表于 2015-1-8 09:35:41 | 显示全部楼层
回复【7楼】cornrn:
---------------------------------
我是开启个定时器,10ms进入中断服务函数扫一次,进行短按和长按消抖检测,我现在可以了,你那外部中断做是什么意思,谢谢!
回复

使用道具 举报

164

主题

1230

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1477
金钱
1477
注册时间
2014-5-21
在线时间
342 小时
发表于 2015-1-8 10:37:20 | 显示全部楼层
回复【9楼】zhanghao:
---------------------------------
就原子例程里面外部中断按键检测
彼高丽者,边夷贱类,不足待以仁义,不可责以常礼。古来以鱼鳖畜之,宜从阔略。若必欲绝其种类,恐兽穷则搏。
回复

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-1-8 10:59:55 | 显示全部楼层
回复【5楼】sakuya:
---------------------------------
状态机无处不在
回复

使用道具 举报

3

主题

138

帖子

0

精华

初级会员

Rank: 2

积分
195
金钱
195
注册时间
2014-5-12
在线时间
4 小时
发表于 2015-1-8 11:16:03 | 显示全部楼层
一看状态机,我还以为楼主发错地方了呢,思想还是比较nice的,记得特权视频里面的按键消抖就是通过D触发器消的,转到单片机还是不错的
回复

使用道具 举报

108

主题

1433

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2234
金钱
2234
注册时间
2012-4-30
在线时间
7 小时
发表于 2015-1-8 18:39:01 | 显示全部楼层
单片机里面早在用状态机了哒
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-10-20 10:40:15 | 显示全部楼层
mark!!!!!!!!
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

32

主题

286

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2014-3-27
在线时间
358 小时
发表于 2015-12-2 18:59:17 | 显示全部楼层
状态机是很好的东西。
回复

使用道具 举报

14

主题

115

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
358
金钱
358
注册时间
2015-12-19
在线时间
307 小时
发表于 2016-6-20 21:42:20 | 显示全部楼层
八度空间 发表于 2015-1-7 13:31
我每隔40ms扫描一次按键,也是状态机思想

[mw_shl_code=c,true]u16 KEY_Scan(void)

这个每隔40ms扫描一次键盘,是不是开一个定时器,40ms中断一次,然后在定时器的中断里面调用KEY_Scan()啊
回复

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2016-6-23 11:58:09 | 显示全部楼层
shiqinghai 发表于 2016-6-20 21:42
这个每隔40ms扫描一次键盘,是不是开一个定时器,40ms中断一次,然后在定时器的中断里面调用KEY_Scan() ...

可以这么做
现在,程序把烂铜烂铁变得智能化了,人呢,一旦离开了这烂铜烂铁就不知道干啥了
回复

使用道具 举报

0

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-9-26
在线时间
22 小时
发表于 2016-11-2 13:54:48 | 显示全部楼层
谢谢分享。mark
回复

使用道具 举报

12

主题

61

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-6
在线时间
29 小时
发表于 2017-1-6 12:53:53 | 显示全部楼层
请问哪个我们要输入的code代表什么
回复

使用道具 举报

12

主题

61

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2017-1-6
在线时间
29 小时
发表于 2017-1-6 13:37:32 | 显示全部楼层
你这个key_time都没变化啊
回复

使用道具 举报

5

主题

54

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2016-11-7
在线时间
63 小时
发表于 2017-1-6 20:39:28 | 显示全部楼层
怎么解决的分享下
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2018-1-21
在线时间
7 小时
发表于 2018-4-19 20:54:33 | 显示全部楼层
大佬,能不能详细的介绍一下这个程序啊?  有点看不懂。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 09:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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