打印

探讨:后键优先的按键处理程序

[复制链接]
4665|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
icmap|  楼主 | 2008-9-21 21:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当有多个按键处于按下状态的时候,电脑键盘用“后键优先”的方法进行处理。

我模仿电脑键盘的这个“后键优先”的功能,做了一个后键优先的按键处理程序。
感兴趣的人可以自己试试,对分析、解决问题是一次很有意义的练习,
而且练习产生的成果也很实用(当作自己的通用按键处理程序)。

当有多个按键按住不放的时候,一般有一下几种处理方式。
方法1:不对多按键进行任何处理。
      优点:方法最简单。
      缺点:会有多个按键同时有效,在功能上会有冲突。

方法2:将多个按键按下视为无按键(对按键释放后的处理还可以细分)。
      优点:方法简单。
      缺点1:不支持按键快速交替按下。例如,当第一个键还未放开,第二个
             按键却已经按下时,只有第一个按键有效,或某个按键反复有效。
      缺点2:如果一个按键出现异常(长期导通),所有按键失效。

方法3:前键优先(指先按下的键有效,后按下的键无效)
      本方法与方法2基本上是相同的。

方法4:后键优先(指后按下的键有效,先按下的键无效)
       优点:功能上更实用,支持按键快速交替按下。电脑键盘用的就是后
       键优先的方法。用电脑键盘可以把字打得飞快,就得益于“后键优先”。
       缺点:软件相对复杂。

相关帖子

沙发
icmap|  楼主 | 2008-9-21 21:13 | 只看该作者

做过后键优先的朋友请来此谈谈看法。

使用特权

评论回复
板凳
hq_y| | 2008-9-21 21:49 | 只看该作者

组合按,呵呵

使用特权

评论回复
地板
taoest| | 2008-9-21 22:52 | 只看该作者

后键优先

根本就没有什么后键优先,lz自己瞎搞出来的概念。
按键就两个状态,从松开到按下的变换,产生一个事件或者消息。
相反的过程则不产生动作。
一个键的动作,不受其他按键状态的影响。
如果采用行列扫描,则不能避免在电路上,引起不同按键同时按下的时候的冲突。电脑键盘也没有解决这个问题。所以一个键盘上两人玩极品飞车,经常会有键不起作用。

使用特权

评论回复
5
xwj| | 2008-9-22 07:47 | 只看该作者

3楼正解,只取决于你响应那些事件和怎么响应罢了

5楼说的是丁字键问题,
这个除非每个按键加个二极管,否则没法避免长按键对同一行列的影响

使用特权

评论回复
6
icmap|  楼主 | 2008-9-22 20:09 | 只看该作者

也许我没说明白...

也许我没说明白。
我说的“后键优先”是指,当有多个键同时处于按下状态时,
最后按下的键是当前的有效按键,之前按下的按键在目前无效。

举一个例子:

系统有A、B两个按键和一个显示屏。显示屏用于显示当前按下的按
键。显示屏在任何时候最多只显示一个按键,不会同时显示多个按键。

现在开始实验,先按住A键不放,此时显示屏一直显示A键。在不放开A键的
情况下,又按住B键不放(这时A键、B键都被按住不放),此时显示屏应该
显示什么内容?
显示结果1:不显示任何按键。(不显示A键,也不显示B键)
显示结果2:显示A键。
显示结果3:显示B键。(我所说的“后键优先”就是这个结果)

请问各位的按键处理程序属于上面3种的哪一种?还是其它的方式?

我知道的是,电脑键盘在打字时(玩游戏除外)用的是上面说的第3个方法。

使用特权

评论回复
7
taoest| | 2008-9-23 01:40 | 只看该作者

重发

按键重发是软件实现的。重发的通常都是最后一个有效的按键,并且需要是在该键按住不放的状态。
电脑键盘,只要有新按键按下,就会产生一个信息。之后重发的信息,都是针对这个最后按键的。
也就是你所说的“后键优先”。但是你如果用“后键优先”的概念来写程序,估计会很麻烦。

使用特权

评论回复
8
xhtxzxw| | 2008-9-23 02:35 | 只看该作者

嘿嘿

同意taoest。

使用特权

评论回复
9
古道热肠| | 2008-9-26 10:40 | 只看该作者

提出电脑键盘是"后键优先"论点,论据何在?

电脑键盘接口是专用CPU处理,内有缓冲,主机BIOS也有键盘缓冲,用中断触发主CPU取键值,来得太快时,主机的小喇叭就会鸣叫,此时会丢数据,只是由于现代电脑的CPU处理速度很快,已很难出现上述的情况了.

使用特权

评论回复
10
HWM| | 2008-9-26 11:00 | 只看该作者

“后键优先”提法就有商榷之处。

若要细分按钮状态(含动态)有四种:

1)按下
2)维持按下状态
3)释放
4)维持释放状态

作为事件触发源,一般只考虑1,3状态。当一个按钮按下后(1态)已经产生触发信号(处理机是否处理是另外的事情),这样的话后按之键何以优先之?
其实问题的关键是如何及时且正确的获得按钮的状态。

使用特权

评论回复
11
John_Lee| | 2008-9-26 13:09 | 只看该作者

也许我明白了lz的意思

键盘的扫描都有一定的顺序(取决于布线和软件)。假设在键盘的按下数个键,最后按下的不一定是最后扫描到的。为了实现lz的“后键优先”,软件上必须记住最后一个按键的键码,下次扫描到这个键如果仍然是按下的状态,就可以按设定的规则向计算机重发此键码。

其实,“后键优先”只对重发键码有用,对lz所说的快速交替按键的作用(如快速打字等),是没有意义的。键盘的程序中,只要扫描到某个键发生了按下动作(可能经过了消抖),就会向计算机发出这个键码,而扫描到释放动作,就会发出释放键码(早忘了,好像是键码+0x80,错了别拍砖)。

就现代的计算机程序设计来说,除了需要输入文字程序(word, notepad等),基本上都用不着键码重发的功能了,主要是靠键盘的重发机制限制太大:重发的速率只能在4-30个/秒之间选择,并且还有一个首键延时的特性,至少1/4秒,会给很多应用程序造成麻烦,比如驾驶类的游戏(用键盘控制方向),在这些程序中都是忽略重发的键码的,只需要接收释放键码的消息,就可以了。

使用特权

评论回复
12
icecut| | 2008-9-26 16:23 | 只看该作者

simple

1.键盘重发KEYDOWN消息是发最后一个.直到抬起.
2.键盘KEYUP消息未发,可以判断key一直处按下状态.
3.多键同时按下,会有冲突.7个键同时按下才能比较明显表现.例如:劲乐团可借用来测试.0

并不复杂.只要电路不冲突能检查到,你就可以检查一个按下发一个down,检查到一个up发一个up.

软件用一个byte1记录键扫描码,有down,则更新之.有up则清空.(中断处理)

输入软件轮询,byte1有效则一直认为有输入.
这就做到后键优先了

还有,一般程序是可以不处理keyup的.如果用buf保存已按下的键,也不复杂.一个和键盘数相同位的结构即可.


使用特权

评论回复
13
john_light| | 2008-9-26 16:49 | 只看该作者

什么“前键优先”“后键优先”的区别就在于:
若扫描到不同的键按下,是否更新之前暂存的键值。
不更新,就是前键优先;
 更新,就是后键优先。

使用特权

评论回复
14
dengm| | 2008-9-26 19:21 | 只看该作者

PC 的bios有32bytes的buffer, 可存15个scan codes

如 应用软件 没读掉, 新的 scan code 就丢掉, 并beep提示.

使用特权

评论回复
15
icmap|  楼主 | 2008-9-26 19:53 | 只看该作者

同意12楼的观点,“后键优先”确实只对按键重发有用。

同意12楼的观点,“后键优先”确实只对按键重发有用,对快速交替按键的作用(如快速打字等),是没有意义的。
用电脑键盘可以把字打得飞快,与“后键优先”没有关系。

使用特权

评论回复
16
icmap|  楼主 | 2008-9-26 20:03 | 只看该作者

回复10楼

我是从“记事本”上判断出电脑在实现按键重发时使用的是“后键优先”的方法的。
打开电脑上的“记事本”应用程序,先按住“a”键不放,记事本被输入一连串的字符“a”,在不放开“a”键的情况下,
又按下“b”键(此时“a”键和“b”键都被按下),记事本又被输入一连串的字符“b”(而不是继续输入“a”)。我说的“后键优先”就是指这个效果。
此时松开“b”键,但仍保持“a”键按下不放,此时记事本停止输入“b”,但也停止了输入“a”。

我在一楼说的“用电脑键盘可以把字打得飞快,就得益于后键优先”是错误的。12楼说的对,“后键优先”只对按键重发有用。

使用特权

评论回复
17
yjpnew8888| | 2008-9-28 07:48 | 只看该作者

后键优先

其实实现应该不算太复杂,只要把每次扫瞄到的键值与前次的键值进行异或下,就能得到后来按键的键值,如此键值连续得到,则判定为有键按下,再按些键值转处理就行了,注意需根据电路设计特点比较前后键值的变化,如按下键为高电平,则键值增加为有键按下,减小为有键松开,此时需分别处理.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

180

帖子

0

粉丝