OpenEdv-开源电子网

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

按键处理问题

[复制链接]

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
发表于 2016-6-29 15:12:44 | 显示全部楼层 |阅读模式
5金钱
哪位老鸟帮我分析下按键处理问题呀,假如有四个按键,有三个按键同时按下之后,且不释放,然后我再按下最后一个按键,怎么处理这些按键的键值信号呀。不会干扰。??????????????????????????

最佳答案

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

看看我曾经在21ic论坛发的帖子:“STM32 USB键盘定制” 你也可以用 百度,Bing 搜索“STM32 USB键盘定制” STM32 USB键盘定制: 使用STM32F103RBT6,实现了PC USB键盘功能。 可以实现任意6个按键同时按下,同时发送6个按键的键码。例如数字键:7,8,5,6同时按下,可以同时发送:7,8,5,6的键码。 你可以实验一下PC的键盘是不能实现这个功能的。你同时按下PC键盘的数字小键盘的7,8,5,6,看看有什么结果 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

15

主题

172

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1276
金钱
1276
注册时间
2016-5-31
在线时间
499 小时
发表于 2016-6-29 15:12:45 | 显示全部楼层
看看我曾经在21ic论坛发的帖子:“STM32 USB键盘定制”
你也可以用 百度,Bing 搜索“STM32 USB键盘定制”


STM32 USB键盘定制:

  使用STM32F103RBT6,实现了PC  USB键盘功能。

  可以实现任意6个按键同时按下,同时发送6个按键的键码。例如数字键:7,8,5,6同时按下,可以同时发送:7,8,5,6的键码。

  你可以实验一下PC的键盘是不能实现这个功能的。你同时按下PC键盘的数字小键盘的7,8,5,6,看看有什么结果。

  实现了这样的功能后,就可以使用这样的USB键盘,实现一些特殊的功能。例如完全可以代替游戏杆应用于游戏控制。


回复

使用道具 举报

30

主题

1170

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1993
金钱
1993
注册时间
2016-2-16
在线时间
527 小时
发表于 2016-6-29 15:15:27 | 显示全部楼层
会不会干扰,是硬件的问题吧
回复

使用道具 举报

13

主题

611

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1929
金钱
1929
注册时间
2014-10-6
在线时间
625 小时
发表于 2016-6-29 15:37:43 | 显示全部楼层
这软件怎么写和你硬件也有一定的关系!假如这些按键都是互相独立的,你只要逐个读按键状态就可以了,要区别长短按就有点麻烦了,如要区别长短按外部中断资源有的话可以用外部中断来做就比较方便了!如果是矩阵按键那就要看按键之间的关系了!
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-6-29 16:33:56 | 显示全部楼层
你问的是矩阵键盘吧?独立键盘不存在所谓键值干扰问题啊,如果是键盘扫描的话,一般不需要识别多个按键同时按下的,如果需要的话你要特殊处理,即增加shift按键功能以扩展按键码值范围的。
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-29 17:06:42 | 显示全部楼层
365mcu 发表于 2016-6-29 16:33
你问的是矩阵键盘吧?独立键盘不存在所谓键值干扰问题啊,如果是键盘扫描的话,一般不需要识别多个按键同时 ...

独立按键  以下是扫描代码
static u8 buttonScan(void){       
     static u8 BTemp=0;                       
     if(INPUT_X1==0)
                 BTemp=BTemp|BTN_X1;       
       
        else           
                 BTemp=BTemp&(~(BTN_X1));
         
     if(INPUT_X2==0)  
                 BTemp=BTemp|BTN_X2;                   
        else            
                 BTemp=(BTemp&(~(BTN_X2)));
     if(INPUT_X3==0)  
                 BTemp=BTemp|BTN_X3;                   
        else            
                 BTemp=(BTemp&(~(BTN_X3)));
     if(INPUT_X4==0)  
                 BTemp=BTemp|BTN_X4;                   
        else            
                 BTemp=BTemp&(~(BTN_X4));
     if(INPUT_X5==0)  
                 BTemp=BTemp|BTN_X5;                   
        else            
                 BTemp=BTemp&(~(BTN_X5));  
    return BTemp        ;       
}
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-29 17:06:57 | 显示全部楼层
365mcu 发表于 2016-6-29 16:33
你问的是矩阵键盘吧?独立键盘不存在所谓键值干扰问题啊,如果是键盘扫描的话,一般不需要识别多个按键同时 ...

static u8 buttonScan(void){       
     static u8 BTemp=0;                       
     if(INPUT_X1==0)
                 BTemp=BTemp|BTN_X1;       
       
        else           
                 BTemp=BTemp&(~(BTN_X1));
         
     if(INPUT_X2==0)  
                 BTemp=BTemp|BTN_X2;                   
        else            
                 BTemp=(BTemp&(~(BTN_X2)));
     if(INPUT_X3==0)  
                 BTemp=BTemp|BTN_X3;                   
        else            
                 BTemp=(BTemp&(~(BTN_X3)));
     if(INPUT_X4==0)  
                 BTemp=BTemp|BTN_X4;                   
        else            
                 BTemp=BTemp&(~(BTN_X4));
     if(INPUT_X5==0)  
                 BTemp=BTemp|BTN_X5;                   
        else            
                 BTemp=BTemp&(~(BTN_X5));  
    return BTemp        ;       
}
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-29 17:10:40 | 显示全部楼层
365mcu 发表于 2016-6-29 16:33
你问的是矩阵键盘吧?独立键盘不存在所谓键值干扰问题啊,如果是键盘扫描的话,一般不需要识别多个按键同时 ...

我做的项目就是要多个按键同时按下,比如我要在这个按键按下了,一个阀门就打开了,只有这个阀门打开了,按下另一个按键才可以放水。现在是这两个按键都按下了,返回的键值就变了,该怎么处理呀
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-29 17:13:56 | 显示全部楼层
我已经解决了按键短按,长按的情况,但是多个按键同时按的话 ,我就不知道该怎么办了
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-29 17:21:23 | 显示全部楼层
xfcjava3 发表于 2016-6-29 17:17
看看我曾经在21ic论坛发的帖子:“STM32 USB键盘定制”
你也可以用 百度,Bing 搜索“STM32 USB键盘定制” ...

好的。。。。。。。。。谢了
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-29 17:26:19 | 显示全部楼层
憨厚诚实大叔 发表于 2016-6-29 15:15
会不会干扰,是硬件的问题吧

不是。。。。。。。。。。
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-6-30 08:27:24 | 显示全部楼层
zjm0807 发表于 2016-6-29 17:10
我做的项目就是要多个按键同时按下,比如我要在这个按键按下了,一个阀门就打开了,只有这个阀门打开了, ...

那这个应该是你逻辑判断比如阀门是否打开,限制放水按键是否有效的啊,不需要组合按键啊。。。
回复

使用道具 举报

6

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2015-12-28
在线时间
30 小时
 楼主| 发表于 2016-6-30 08:56:34 | 显示全部楼层
365mcu 发表于 2016-6-30 08:27
那这个应该是你逻辑判断比如阀门是否打开,限制放水按键是否有效的啊,不需要组合按键啊。。。

我这只是随便举个例子,主要是问多键按下怎么处理
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2016-6-30 09:23:17 | 显示全部楼层
zjm0807 发表于 2016-6-30 08:56
我这只是随便举个例子,主要是问多键按下怎么处理

好随便!!!多按键你是要知道按键按下的先后顺序还是是否同时按下,序列的话根据按键判断返回值保存在一个buf即可,如果是是否同时按下,那每个按键需要返回当前按下的初始时间值(1号按下初值200ms,2号按下初值200ms,如果几个初始时间都不为0,那么就是相应组合按键的序号12,随便举个例子)
回复

使用道具 举报

15

主题

184

帖子

0

精华

高级会员

Rank: 4

积分
647
金钱
647
注册时间
2014-4-29
在线时间
299 小时
发表于 2016-6-30 15:41:03 | 显示全部楼层
楼主你自己做下需求分析吧,每个按键既支持独自短按,又支持独自长按,还支持与其他按键长按组合,这种情况是物理上不可能的,也不会有人有这种需求。
你得先知道自己到底需要什么样的按键,然后才能去设计电路和程序
回复

使用道具 举报

0

主题

183

帖子

0

精华

高级会员

Rank: 4

积分
684
金钱
684
注册时间
2016-1-27
在线时间
184 小时
发表于 2016-6-30 16:05:24 | 显示全部楼层
首先要保证键值读取正确,可以将键值存到一个buf里,然后剩下的就要看具体需求了
你指的干扰是指什么呢?如果是矩阵键盘的话,键值肯定是会变的,将按键对应的bit取出来就好
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 21:12

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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