OpenEdv-开源电子网

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

怎样同时识别多个按键

[复制链接]

6

主题

50

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2016-6-29
在线时间
58 小时
发表于 2016-11-17 11:38:04 | 显示全部楼层 |阅读模式
1金钱
现在想不用中断的方式实现多个按键同时触发并且不相互影响。大家有什么好的方法吗?轮询的话如果一个按键不抬起的话另一个识别不了。如果不等待按键抬起的话又不能判断按下几次还是一直在按下。

最佳答案

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

http://www.openedv.com/thread-67273-1-1.html 这个例子可以实现你的要求
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-11-17 11:38:05 | 显示全部楼层
回复

使用道具 举报

7

主题

185

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2729
金钱
2729
注册时间
2015-12-27
在线时间
469 小时
发表于 2016-11-17 12:39:01 | 显示全部楼层
同时检测所有需要检测的按键的电平状态,1ms或者2ms间隔检测一次等,然后对检测到的按键被按下的次数进行判断····,判断是误触发的忽略,如果不是则进行按键判断
回复

使用道具 举报

50

主题

1805

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6662
金钱
6662
注册时间
2016-5-29
在线时间
910 小时
发表于 2016-11-17 12:39:26 | 显示全部楼层
一定有办法
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11975
金钱
11975
注册时间
2013-3-8
在线时间
1276 小时
发表于 2016-11-17 12:53:39 | 显示全部楼层
74LS164 并转串
回复

使用道具 举报

1

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1183
金钱
1183
注册时间
2015-5-28
在线时间
149 小时
发表于 2016-11-17 13:14:46 | 显示全部楼层
本帖最后由 小陀螺爱炒蛋 于 2016-11-17 13:20 编辑

在读取按键的逻辑中,监测所有按键的IO输入就是了~并记录下上一次按键的键值,以前做过这样的设计,通过组合键实现某些功能,有兴趣题主私信我
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-11-17 13:44:29 | 显示全部楼层
按键本来就不用中断。。。。

用状态机查询
或者用AD按键也可以的,一个IO口搞六七个按键没问题
回复

使用道具 举报

58

主题

359

帖子

0

精华

高级会员

Rank: 4

积分
987
金钱
987
注册时间
2014-9-29
在线时间
261 小时
发表于 2016-11-17 13:45:33 | 显示全部楼层
然后这些    按下  抬起  长按  组合  连按  连击等等事件自己处理就是了
回复

使用道具 举报

5

主题

106

帖子

0

精华

高级会员

Rank: 4

积分
757
金钱
757
注册时间
2015-10-27
在线时间
180 小时
发表于 2016-11-21 16:21:04 | 显示全部楼层
你可以试一下这个,我网上找人家的,感觉挺好用的的,初始化,按键事件的识别都很不错[mw_shl_code=applescript,true]struct Button btn1;
struct Button btn2;
struct Button btn3;

void main()
{
        button_init(&btn1, read_K1_pin, 0);
        button_attach(&btn1, PRESSED,          BTN1_PRESSED_Handler);
        button_attach(&btn1, CLICK,            BTN1_Click_Handler);
        button_attach(&btn1, DOUBLE_CLICK,     BTN1_DOUBLE_Click_Handler);
        button_attach(&btn1, LONG_RRESS_START, BTN1_LONG_RRESS_START_Handler);
        button_attach(&btn1, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);
        button_attach(&btn1, LONG_PRESS_STOP,  BTN1_LONG_PRESS_STOP_Handler);
        button_start(&btn1);
       
        button_init(&btn2, read_K2_pin, 0);
        button_attach(&btn2, PRESSED,          BTN2_PRESSED_Handler);
        button_attach(&btn2, CLICK,            BTN2_Click_Handler);
        button_attach(&btn2, DOUBLE_CLICK,     BTN2_DOUBLE_Click_Handler);
        button_attach(&btn2, LONG_RRESS_START, BTN2_LONG_RRESS_START_Handler);
        button_attach(&btn2, LONG_PRESS_HOLD,  BTN2_LONG_PRESS_HOLD_Handler);
        button_attach(&btn2, LONG_PRESS_STOP,  BTN2_LONG_PRESS_STOP_Handler);
        button_start(&btn2);
       
        button_init(&btn3, read_K3_pin, 0);
        button_attach(&btn3, PRESSED,          BTN3_PRESSED_Handler);
        button_attach(&btn3, CLICK,            BTN3_Click_Handler);
        button_attach(&btn3, DOUBLE_CLICK,     BTN3_DOUBLE_Click_Handler);
        button_attach(&btn3, LONG_RRESS_START, BTN3_LONG_RRESS_START_Handler);
        button_attach(&btn3, LONG_PRESS_HOLD,  BTN3_LONG_PRESS_HOLD_Handler);
        button_attach(&btn3, LONG_PRESS_STOP,  BTN3_LONG_PRESS_STOP_Handler);
        button_start(&btn3);

        //make the timer invoking the button_ticks() interval 5ms.
        while(1)
        {
        __timer_start(button_ticks, 0, 5); //This function is implemented by yourself.}
}[/mw_shl_code]

MultiButton-master.zip

4.37 KB, 下载次数: 315

回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-11-21 16:31:26 | 显示全部楼层
轮询也可以  想象系统里面的延时和任务切换就可以了       就是说你把这个挂起,去执行别的
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 13:16

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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