amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 133994|回复: 1115

堪称一绝的“IO口扫键”法

  [复制链接]
发表于 2007-11-20 11:06:01 | 显示全部楼层 |阅读模式
在做项目(工程)的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键。一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!
那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?
举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一:

                                        图一

   对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方便描述,我们约定:设置某一IO口输出为“0”――称其为“扫某IO口”)。用行线输出扫键码,列线检测是否有按键的查询方法进行扫键。扫键流程:在行线依次输出011,101,110扫键值,行线每输出一个扫键值,列线检测一次。当列线检测到有按键时,结合输出的扫键值可以判断相应的按键。
但是,5个IO真的只能扫6个键吗?有人说可以扫9个,很聪明!利用行IO与地衍生3个键(要注意上拉电阻),如图二:

                              图二

扫键流程:先检测3个行IO口,对K1’,K2’,K3’进行扫键,之后如上述2*3扫键流程。5个IO口能扫9个键,够厉害吧,足足比6个键多了1/2!
动动脑,还能不能再多扫几个?就几个?一个也行!好,再想一下,硬是被逼出来了!如图三:

                              图三

不多不少,正好10个键!这种扫键方式比较少见吧!漂亮!扫键流程:设IO1输出为“0”,检测IO2…IO5,若判断有相应健按下,则可知有健;若无键,则继续扫键:设IO2输出为“0”,检测IO3,IO4,IO5,判断有无键按下,如此类推。这里应注意:当扫某一IO口(输出为“0”)时,不要去检测已经扫过的IO口。如:此时设置IO2输出为“0”,依次检测IO3,IO4,IO5,但不要去检测IO1,否则会出错(为什么,请思考)。
感觉怎么样?不错吧!让我们再看看图三,好有成就感!看着,看着……又看到了什么?快!见图四:

                              图四

真强!被您看出20个键!多了一个对称的三角形。可是,像这样的排列能正确扫20个键吗?回答是肯定的:不能!上下三角形相互对称,其对称扫出的键无法区别。有没有注意到分析图三时提到的注意点?(à“当扫某IO口时,不要去检测已经扫过的IO口,否则会出错”)
我们分析一下图四:当IO1输出“0”时,按下K11或K11’键都能被IO2检测到,但IO2检测却无法区别K11和K11’键!同理,不管扫哪个IO口,都有两个对称的键不能区分。
我们假想,如果能把对称键区分开来,我们就能正常地去判断按键。我们在思考:有没有单向导通性器件?有!见图五!

                              图五

很巧妙的思路!利用二极管的单向导通性,区别两个对称键。扫键思路:对逐个IO口扫键,其他四个IO口可以分别检测其所在的四个按键。这样,就不会有分析图三时提到的注意点。
够酷吧!等等,大家先别满足现状,我们再看一下图二,是不是有点启发?对,我们再分析一下“用5个IO口对地衍生的5个键”。看图六:

                              图六

25个键!5个IO口扫出25个键!先别激动,我们再分析一下它的可行性,分析通得过才能真正使用。假设扫键流程:先扫对地的5个键,再如图五扫键。先扫对地5个键,判断没有按键,接着对逐一对IO口进行扫键。但当对某一IO口扫键时,如果有对地的键按下,这时有可能会误判按键,因为对地键比其他键有更高的响应优先级。例如:扫IO1,IO1输出“0”,恰好此时K62按下,IO2检测到有按键,那就不能判断是K11还是K62。我们可以在程序上避免这种按键误判:若IO2检测到有按键,那下一步就去判断是否有对地键按下,如果没有,那就可以正确地判断是K11了。
我们小结扫键个数S:
S = (N-1)*N + N ――启用二极管
S = (N-1)*N /2 + N ――省掉二极管
         
经典吗?太经典了!!告诉大家一个小道消息:第一个设计出此电路的人是一个美国大佬,他(她?)还为此申请了专利!
发表于 2007-11-20 11:13:27 | 显示全部楼层
爽,建议置"酷"贴
发表于 2007-11-20 11:17:33 | 显示全部楼层
可以按此思路写个程序出来。
发表于 2007-11-20 11:22:13 | 显示全部楼层
果然绝,建议“酷”了。
 楼主| 发表于 2007-11-20 11:25:05 | 显示全部楼层
大家顶吧!
发表于 2007-11-20 11:25:19 | 显示全部楼层
能检出多键按下么?
发表于 2007-11-20 11:32:51 | 显示全部楼层
果然够酷
发表于 2007-11-20 11:33:26 | 显示全部楼层
非常好的创意,谢谢楼主!
发表于 2007-11-20 11:43:57 | 显示全部楼层
厉害!!!
可惜还没看明白....
似乎这样下去,可以无限个按钮......

不过我想,还是用AD的那种更加好.
发表于 2007-11-20 11:50:20 | 显示全部楼层
不顶不行
发表于 2007-11-20 11:55:46 | 显示全部楼层
厉害。。!!
发表于 2007-11-20 12:10:17 | 显示全部楼层
顶一下!
不过似乎比较复杂!
发表于 2007-11-20 12:13:16 | 显示全部楼层
强!膜拜中……
发表于 2007-11-20 12:21:17 | 显示全部楼层
佩服,自愧弗如!
发表于 2007-11-20 12:26:43 | 显示全部楼层
拜拜!!!
发表于 2007-11-20 12:30:03 | 显示全部楼层
果然好啊
发表于 2007-11-20 12:35:31 | 显示全部楼层
妙啊,妙啊!
发表于 2007-11-20 12:39:30 | 显示全部楼层
不错
发表于 2007-11-20 12:52:22 | 显示全部楼层
厉害。。
发表于 2007-11-20 13:01:56 | 显示全部楼层
巧妙啊...
发表于 2007-11-20 13:02:31 | 显示全部楼层
强!膜拜中……
发表于 2007-11-20 13:36:43 | 显示全部楼层
强啊
 楼主| 发表于 2007-11-20 14:03:15 | 显示全部楼层
我不是凌阳的,这是我在网上找到的,如果有侵犯到你的专利,请来函告诉我,EMAIL:yzlyear@126.com

版本号:V0.99
专利者:某美国大佬
授道者:台湾廖栋才先生(向廖老师敬礼!)
整理者:凌耀科技系统中心数码影音二部之VCD小组

这是我在网上看到的信息
发表于 2007-11-20 14:30:50 | 显示全部楼层
单键是好,好像不能有组合键
发表于 2007-11-20 14:37:01 | 显示全部楼层
妙....
发表于 2007-11-20 14:45:42 | 显示全部楼层
先顶了再看
发表于 2007-11-20 15:08:12 | 显示全部楼层
太牛B了……膜拜中!
发表于 2007-11-20 15:31:19 | 显示全部楼层
先看了再顶。
发表于 2007-11-20 15:56:17 | 显示全部楼层
en  顶了再看
发表于 2007-11-20 16:21:16 | 显示全部楼层
好放法
发表于 2007-11-20 16:38:52 | 显示全部楼层
好,谢谢
发表于 2007-11-20 16:56:35 | 显示全部楼层
不太明白图三“当扫某一IO口(输出为“0”)时,不要去检测已经扫过的IO口”,好像不会出错啊,只是没有意义而已,会出错吗?
如果没有猜错,是为了判别组合键?因为只有组合键按下时,检测已经扫过的IO口才会出错,如果是单键,应该不会出错吧?
如果不检测已经扫过的IO口,是可以检测到组合键的。
发表于 2007-11-20 21:05:26 | 显示全部楼层
厉害啦。老外就是牛。
发表于 2007-11-20 21:10:13 | 显示全部楼层
这个帖子总结得很好,讲键盘扫描的很多,但没有看过这么细致的
发表于 2007-11-20 21:36:56 | 显示全部楼层
一个字:牛;两个字:NB.
发表于 2007-11-20 22:14:35 | 显示全部楼层
专利就是要对全世界人_大声说"我是这么做的,这是我的专利,大家不能这么做".何来泄密??
发表于 2007-11-20 22:20:56 | 显示全部楼层
不错!

值得借鉴!
发表于 2007-11-20 22:29:27 | 显示全部楼层
行!
发表于 2007-11-20 22:35:33 | 显示全部楼层
不错
发表于 2007-11-21 01:03:54 | 显示全部楼层
记号
发表于 2007-11-21 02:25:13 | 显示全部楼层
没什么,那种三角形扫描法我在一种微波炉上就见过,我用单片机仿真过他的键盘。虽然按键是多了,但按键里面的代码特别多。
发表于 2007-11-21 08:58:10 | 显示全部楼层
我也同意"roasn 冰封的心"的说法的,如果对地接电阻了,图三的那种说法才是正确的,要不是没有什么错误的!!
发表于 2007-11-21 09:08:05 | 显示全部楼层
确实不错,但写程序可能比较麻烦些!
发表于 2007-11-21 09:34:11 | 显示全部楼层
不错,顶一下
发表于 2007-11-21 09:46:20 | 显示全部楼层
不错,确实不错,但是对多个键被按下会判断出错的
发表于 2007-11-21 10:11:14 | 显示全部楼层
YYYYYYYYYNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
发表于 2007-11-21 11:08:02 | 显示全部楼层
我顶,真是长见识
发表于 2007-11-21 11:20:08 | 显示全部楼层
强!突然我想,我认为我有可能还能增加。对!一定有的。
发表于 2007-11-21 13:47:23 | 显示全部楼层
真牛!!!顶,如果贴上程序更好!!!
发表于 2007-11-21 14:22:12 | 显示全部楼层
我写过一个类似的程序,就是觉得太复杂了,所以现在很少采用那种方法.
发表于 2007-11-21 14:25:28 | 显示全部楼层
真的太有才了啊~  厉害`
发表于 2007-11-21 14:54:06 | 显示全部楼层
顶,历害,谢谢分享!
发表于 2007-11-21 15:13:24 | 显示全部楼层
号  jihao
发表于 2007-11-21 15:19:27 | 显示全部楼层
没有软件,一切为零。
发表于 2007-11-21 17:22:47 | 显示全部楼层
我有上边所有图的仿真程序,但要通过莫老大同意,否则不敢传上来
发表于 2007-11-21 21:20:55 | 显示全部楼层
历害,谢谢分享!
发表于 2007-11-21 22:05:12 | 显示全部楼层
楼主的这个公式“S = (N-1)*N + N ――启用二极管 ”
好像有点问题

能够用3IO实现4x4键盘的,且看http://www.ic37.com/document/1624.htm
我自己用51和avr测试通过,不过似乎不能识别多按键同时按下的情况
发表于 2007-11-21 22:41:57 | 显示全部楼层
55楼尽管传上来,莫老大最喜欢完善的酷贴,这样对大家都有好处!
发表于 2007-11-21 22:57:46 | 显示全部楼层
留个影,有了图,写程序就不会难了.
发表于 2007-11-21 23:44:55 | 显示全部楼层
谢谢!不过还没有遇到过这种情况。
发表于 2007-11-22 00:25:33 | 显示全部楼层
记号
发表于 2007-11-22 01:14:44 | 显示全部楼层
厉害厉害,真的是开眼界了!
辛苦楼主了!
狂顶!
发表于 2007-11-22 10:04:23 | 显示全部楼层
强烈支持,反对45楼,仔细想一下,看能不能支持复合键操作?
发表于 2007-11-22 12:52:00 | 显示全部楼层
其实3个IO可以实现最多16个键,4个iO可以实现43个键,当然包括二极管、上拉电阻、电源和地线。不能识别组合键。在期刊网中输入“全组合键盘”就可以查询到相关资料。
发表于 2007-11-22 16:49:17 | 显示全部楼层
真能动脑筋!佩服佩服,不要求那么多9键的最实用,又简单
发表于 2007-11-22 17:17:28 | 显示全部楼层
顶一下!
不过似乎比较复杂!
如果贴上程序更好!!!
发表于 2007-11-22 19:27:30 | 显示全部楼层
强,先收下,慢慢体会
发表于 2007-11-22 20:26:43 | 显示全部楼层
顶一下!  
不过似乎比较复杂!
如果贴上程序更好!!!
发表于 2007-11-22 21:05:33 | 显示全部楼层
牛人,佩服!!
发表于 2007-11-22 22:08:04 | 显示全部楼层
记号,谢谢!!!!!!!!!!!!!
发表于 2007-11-23 02:57:42 | 显示全部楼层
楼上兄弟推的"3根16个,4根43个...."            .....................

其实理论上限是2^(N*2)-1个按键.1根线可以接3个,2根15个,3根63个.... 无论怎么排列你都只可以少于这个数而无法多于这个数.
想知道怎么推出来的吗?是这样的:
例如2根线的情况:2根口线,输出组合有4种,输入组合又有4种,乘起来就行了.但"无按键"要占用掉一种组合,所以就是16-1=15了

看1根线的情形:
输出高,取回高,按键1
输出高,取回低,按键2
输出低,取回高,按键3
输出低,取回低,没按键

当然,实际上做不出那么多,因为有些排列组合必须用上编译码电路甚至锁存器,要扔掉约一半的组合.


另外提一下,还有一种简单的低成本扩展方法,电路比加二极管更简单,就是加电容,两态就变成三态了,多了个交流态,电路动动脑筋就能想到.但副作用是软件麻烦些,占用CPU时间.仅作参考.
发表于 2007-11-23 10:24:44 | 显示全部楼层
楼上的太强了!!!
用电容的方法能否说详细点?
其实用电容加电阻充电时间来模拟AD,理论上也可以有无穷多个按键。只是实际情况下,这种方法不可能测得很精确,也就不能检测很多按键了。对于没有AD的单片机或者AD有其他用途的情况下还是很实用的。
发表于 2007-11-23 12:44:19 | 显示全部楼层
呵呵,确实强,不过我还是用扩展IC,呵呵.人懒啊.
发表于 2007-11-23 13:51:20 | 显示全部楼层
真的好厉害
发表于 2007-11-23 14:33:02 | 显示全部楼层
不得不顶啊。
发表于 2007-11-23 16:58:52 | 显示全部楼层
牛 学习学习
发表于 2007-11-23 17:11:15 | 显示全部楼层
感觉比AD转换的键盘扫描法更好!
支持!
发表于 2007-11-24 09:41:42 | 显示全部楼层
感觉占用I/O口太多,在I/O口紧张的情况下还是不可取,一般还是用AD
发表于 2007-11-24 10:23:37 | 显示全部楼层
好!!!
发表于 2007-11-24 12:44:22 | 显示全部楼层
够绝!!!!!!!!!!!
发表于 2007-11-24 12:52:03 | 显示全部楼层
记号。
发表于 2007-11-24 12:52:29 | 显示全部楼层
记号。
发表于 2007-11-24 14:46:44 | 显示全部楼层
路过,强人
发表于 2007-11-24 16:59:59 | 显示全部楼层
我也來傳一個更絕一點的,按鍵可以擴充到八個.數碼管和按鍵共用用74hc164擴充的io口.
发表于 2007-11-26 10:14:37 | 显示全部楼层
够爽的,不过用ad,布线简单
发表于 2007-11-27 00:35:14 | 显示全部楼层
好帖,留名备查
发表于 2007-11-27 11:57:03 | 显示全部楼层
狂人,我顶!
发表于 2008-2-20 11:39:37 | 显示全部楼层
非常厉害,逛顶
发表于 2008-2-21 06:24:49 | 显示全部楼层
确实有点绝!
发表于 2008-2-21 08:40:26 | 显示全部楼层
巧妙啊...
发表于 2008-2-21 10:00:06 | 显示全部楼层
要是能配上相应的程序就好了,期待中。。。。。。。。。。。。。。。
发表于 2008-2-21 10:43:39 | 显示全部楼层
检测不了多键吧
发表于 2008-2-21 11:26:53 | 显示全部楼层
有程序吗?拿来学习学习呀!哈哈
发表于 2008-2-21 12:15:21 | 显示全部楼层
厉害.

居然这么厉害.
发表于 2008-2-21 13:42:59 | 显示全部楼层
不错,但是程序就非常大了!
发表于 2008-3-28 13:41:08 | 显示全部楼层
太酷了!!
发表于 2008-3-28 14:00:00 | 显示全部楼层
不是吧
这不是我们上课讲的矩阵式非编码键盘吗?
扫描键的方法有行扫描法和线反转法两种
微机原理和智能仪器课上都讲过的

思而不学则殆啊
发表于 2008-3-28 14:10:02 | 显示全部楼层
哦  是我看错了
发表于 2008-3-28 14:19:26 | 显示全部楼层
好像不实用吧,去抖怎么去??
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|阿莫电子论坛(原ourAVR/ourDEV) ( 公安备案:44190002001997(交互式论坛) 工信部备案:粤ICP备09047143号 )

GMT+8, 2020-2-24 19:56

阿莫电子论坛, 原"中国电子开发网"

© 2004-2018 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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