amoBBS 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
查看: 11171|回复: 48

4个IO口控制4*4矩阵按键,新颖,拿出来大家学习下

  [复制链接]
发表于 2012-5-3 15:46:27 | 显示全部楼层 |阅读模式
4×4  矩阵式键盘电路的改进本文向大家推荐一个精简 IO 接口的4×4 键盘电路,该键盘电路仅仅使用 4 条IO 接口引线,即可完成一般需要 8
位接口才能完成的功能。
在51单片机系统中,经常使用 4×4 键盘,一般情况下,都是使用一个 8 位的接口,外接16个按键。
下图就是一个常规的 4×4 键盘电路图。

这种常规的矩阵键盘电路,相信大家都司空见惯了,好多人都会编写它的驱动程序。
图中使用了 P0口的8 个引脚( P0.0~P0.7 ),分别驱动键盘的行和列。按键的编号,在图中分别标注了
0~F 。
检测按键的一般的思路是在四个列线,分别输出一个低电平,然后输入行线,逐行检测是否存在低电平。
如果在某行有低电平出现,就说明该行、列的交叉点上的按键,被按下了。
其实,这些行、列引线,是 “ 分时” 工作的,当在某一列输出低电平的时候,其它的列,输出的就是高电平。
如果利用这些输出高电平的列,进行输入,那么就可以极大的节省 IO 接口的引线数量。
基于这个道理,在上图中,下面的四个列驱动引线( P0.4~P0.7 ),就完全可以省去,只是使用行驱动的引
脚( P0.0~P0.3 )来分时输出低电平即可。
电路见下图。

为了对引脚之间进行隔离,图中加上了四个二极管,确保只有在引脚输出低电平的时候,方可把键盘中相
应的列置为 0 。
针对这个电路,对按键的检测方法,和常规的 4×4 键盘检测思路是相同的,例如:
当在 P0.0输出低电平,即最左边的列为0 ,这时检测P0.1、P0.2及P0.3是否为0 ,可以判断最左边的三个按
键是否按下;
当在 P0.1输出低电平,即左边第二列为0 ,这时检测P0.0、P0.2及P0.3是否为0 ,可以判断左边第二列的三
个按键是否按下;
………… ;
这个检测按键是否按下的思路非常简单,会编写常规 4×4 键盘驱动程序的网友,肯定都会编写出来这种电路
的驱动程序。
因为行和列使用了相同的 IO 引线,实际上,连接在同一个引线的行、列交叉点处的按键,就已经失效了,
那么就把把原来的按键,移动出来,把二极管画在交叉点,电路如下所示。

再把移出来四个按键连接在 IO 引线,另一端直接接地;把其它按键的编号,再整理一下,就成了下图电
路。

这个电路比常规的4×4 键盘电路仅仅多用了四个二极管,但是却节省了四条 IO 接口引线,这个意义是十分巨
大的。
按照这个电路的设计思路,使用  n 条IO 接口引线,就可以驱动  n×n  个按键。
那么用 5 个IO 引脚,就可以驱动5×5 的键盘,这就足以满足各种应用了。
网上也有一些其它类型的节省接口的键盘电路,但是都有不足,不是电路过于复杂,就是驱动的按键个数
较少,远远不及本电路简单实用。
做而论道已经按照这个电路制作了 PCB板,外形和常规4×4 键盘电路板相差无几。二极管体积很小,布线并
没有障碍。
实践证明,这是个完美的精简接口的 4×4 键盘电路,不仅可以用在51单片机系统,在使用其它 MCU组建的
电路中同样适用。
针对这个电路,做而论道已经用汇编语言和C语言编写出了驱动程序,因为汇编语言可以使用 “ 位操作” 指
令,所以程序的比较简单;C语言的程序,就显得累赘一些。
程序暂时就不公布了,有兴趣的网友可以来讨论。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2012-5-3 15:54:31 | 显示全部楼层
不错,很新颖的想法,记下来晚上回去细细研究下。                                                                 
发表于 2012-5-3 15:57:05 | 显示全部楼层
很不错   收藏了
要找个时间研究一下代码
发表于 2012-5-3 15:59:24 | 显示全部楼层
坛子里以前有人提过。
发表于 2012-5-3 16:01:24 | 显示全部楼层
加上负极,就5根线了,
 楼主| 发表于 2012-5-3 16:03:12 | 显示全部楼层
我刚进坛子,不清楚,之前设计电路时,IO口不够用,在网上挖出来的,大家一起学习嘛。
一个人不能光想获取不去奉献啊,大家说是不是啊。
发表于 2012-5-3 16:23:01 | 显示全部楼层
楼主很有创新,这样可以大量节省了IO口!!
发表于 2012-7-1 12:12:15 | 显示全部楼层
求程序0.0
发表于 2012-7-1 17:46:19 | 显示全部楼层
很好的想法啊
发表于 2012-7-1 17:57:16 | 显示全部楼层
确实很新颖啊,受教了~
发表于 2012-7-1 18:16:48 | 显示全部楼层
不错,可以使用在IO紧缺的时候~
发表于 2012-7-1 19:25:46 | 显示全部楼层
阅读了一下,的确不错。mark
发表于 2012-7-1 20:23:47 | 显示全部楼层
之前发过的,还说是老外发明的,称作IO口扫键法还是什么的记不清了,我也实验过,可以支持部分按键的组合使用,但是如果使用薄膜开关,二极管没地方放啊
发表于 2012-7-1 20:24:12 | 显示全部楼层
之前发过的,还说是老外发明的,称作IO口扫键法还是什么的记不清了,我也实验过,可以支持部分按键的组合使用,但是如果使用薄膜开关,二极管没地方放啊
发表于 2012-7-1 20:29:00 | 显示全部楼层
有空研究下
发表于 2012-7-1 21:45:27 | 显示全部楼层
本帖最后由 machao 于 2012-7-1 21:55 编辑

当I/O紧张,可以考虑采用。
存在的不足:
1.按键扫描编程稍微麻烦,一般所谓单片机“精通的”人,还真设计不好这个扫描程序。另外,现在新型的单片机与51不同,I/O需要定义输入或输出方式,编写代码中,如果I/O工作方式设定错误,就不能正确扫描键盘。

2.使用单键情况下,基本没有问题,但是如果2个按键同时按下,扫描按键就会发生错误,以下图说明:


假定F00输出0,正常情况下,F01/F02/F03为输入,检测按键4、5、6。但如果此时同时按下按键是7和8,那么程序认为是5键。

作为一个系统,你不知道用户会如何的操作按键,如果用户胡乱按键盘,你的系统就出问题了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
发表于 2012-7-2 13:12:24 | 显示全部楼层
收藏 回家研究
发表于 2012-7-2 13:55:33 | 显示全部楼层
pjh 发表于 2012-7-2 13:05
牛得不行呀!

如果我分析的对,就是真“牛”,如果不对,就是“假牛”,或“吹牛”。

朋友也可以参与讨论,比如给个对应的参考扫描代码,那也是“牛”。

西班牙斗牛士获得2012年欧锦赛的冠军,4年中连续获得3次世界级大赛的冠军,牛不牛?牛!

靠的是什么?技术!

有了真正的技术垫底,怎么“牛”都可以。说风量话的,妒忌人的,恐怕连“吹牛”都不敢。

哈哈,牛,牛,牛!
发表于 2012-7-3 00:46:16 | 显示全部楼层
pjh 发表于 2012-7-2 14:33
老师:我是褒义,就是牛得不得了的意思,别误会

朋友,这个怎么也算不上“牛”的,只是一个基本的电路,稍微具备一点基础,就可以分析出来的。

从这个例子可以看出,现在我们的教育是“应试教育”,学生越学越“傻”,越“笨”,一点分析问题的能力也没有。
发表于 2012-7-3 02:09:54 | 显示全部楼层
十七楼很有道理
发表于 2012-7-17 17:32:18 | 显示全部楼层
machao 发表于 2012-7-2 13:55
如果我分析的对,就是真“牛”,如果不对,就是“假牛”,或“吹牛”。

朋友也可以参与讨论,比如给个对 ...

马老师:
这个按键扫描.0\1\2\3这四个键没明白是要怎么扫到的呢??
发表于 2012-7-26 15:39:10 | 显示全部楼层
tomy 发表于 2012-7-17 17:32
马老师:
这个按键扫描.0\1\2\3这四个键没明白是要怎么扫到的呢??

把4个IO置为高电平    如果0,1,2,3其中一个键被按下   这4个IO其中一个就会变成低电平,这样MCU就可以确定是哪一个按键了
发表于 2012-8-2 16:16:20 | 显示全部楼层
不错,,,好想法
发表于 2013-1-8 23:27:26 | 显示全部楼层
接地那一列按键扫描不对,总会误为旁边的键,能提供参考下吗或者指点下!用C的
发表于 2013-1-9 11:23:21 来自手机 | 显示全部楼层
嗯嗯,学习了!回家电脑上细看!
发表于 2013-6-2 19:52:35 | 显示全部楼层
很不错
发表于 2013-7-20 17:55:08 | 显示全部楼层
看见新盈,于是研究了下,我想楼主还没写出程序把,因为写了程序会发现,并不能实现最后4个接地的按键。不过可以实现N=N²-N个键盘,N为IO数。即:4个IO口可以实现4²-4=12个键盘。以此类推,5个可以实现20个。
发表于 2013-7-20 18:00:45 | 显示全部楼层
huangwei198996 发表于 2012-7-26 15:39
把4个IO置为高电平    如果0,1,2,3其中一个键被按下   这4个IO其中一个就会变成低电平,这样MCU就可以确 ...

如果P0.0为低电平,P0.1、P0.2、P0.3为高电平,这时扫描4、5、6键吧。这时候1、2、3键按下会怎样?这时候按下1键会误认为第四键,所以接地的4个按键不能实现。不过这种方法可以实现 键盘数=N²-N (N为IO口数),即:4²-4=12个键盘鼠
发表于 2013-7-20 18:12:11 | 显示全部楼层
mark
发表于 2013-7-21 16:22:16 | 显示全部楼层
不错,可以好好研究,从没有仔细思考过还有这样的接法
发表于 2013-7-27 10:49:19 | 显示全部楼层
Timecy 发表于 2013-7-20 17:55
看见新盈,于是研究了下,我想楼主还没写出程序把,因为写了程序会发现,并不能实现最后4个接地的按键。不 ...

可以实现最后接地按键的,比如P0.0先输出低电平,检测P0.1,P0.2,P0.3这就3个按键了。再把P0.0设置为输入上拉,不就检测到最后接地按键了?
就是写程序会比较费事些
发表于 2013-7-27 13:08:02 | 显示全部楼层
cowboy以前发过了
发表于 2013-8-26 01:35:30 | 显示全部楼层
马老师说的话深有体会···
发表于 2013-8-26 07:17:36 来自手机 | 显示全部楼层
收藏了,谢谢
发表于 2013-8-26 08:00:54 | 显示全部楼层
思路挺不错的,就是存在编程麻烦的问题,同时对于不同平台的移植并不是很好。
4个I/O口要不停的切换输入输出状态。有些单片机可以设置为输出1,同时可以检测输入状态,但是有些单片机是不行的。有些单片机输入输出切换时,会有一定的操作不同。
发表于 2013-8-26 09:25:12 | 显示全部楼层
呵呵,又见到这个IO扫描了,还有个是20多键版本
发表于 2013-8-26 14:16:23 | 显示全部楼层
精简,不错,好方法
发表于 2013-8-27 17:36:47 | 显示全部楼层
记得有个很强大的IO键盘扫描的帖子。
发表于 2013-8-28 08:22:31 | 显示全部楼层
WGJ5767351 发表于 2012-5-3 16:01
加上负极,就5根线了,

老兄,人家说是用四个IO口, 不是说只用四条线...
发表于 2013-8-28 08:55:13 | 显示全部楼层
很有创意,这个就收了。
发表于 2013-8-28 15:19:31 | 显示全部楼层
这个很不错
切换IO不是什么问题
核心就是扫描法
应该代替传统的扫描法
节省1半的引脚
但是要注意,每根线要都加上拉电阻
另外,二极管也是可以省略的
发表于 2013-9-7 21:18:16 | 显示全部楼层
这个就是双交互式按键。很久以前就有了。。。
发表于 2013-12-7 09:37:36 | 显示全部楼层
思路不错,值得试试。..
发表于 2014-3-4 15:25:32 | 显示全部楼层
最后一列有问题
最后一列单独按时没问题,当按下最后一列中的某个同时按前面那些会出现问题
最后一个按下,相应那行拉低了,可判断的是当前IO口为低的数,但此时只有1/4可能性正好为那个口,所以出错机会是75%,又因为扫描是循环的,所以肯定读出的按键有问题
发表于 2014-3-5 11:18:17 | 显示全部楼层
厉害,回去研究下!!
发表于 2014-3-18 22:06:07 | 显示全部楼层
学习了              
发表于 2014-5-4 22:01:41 | 显示全部楼层
值得收藏,看一下
发表于 2015-1-15 00:30:31 | 显示全部楼层
我也自己焊了个试过了,接地的那一条按键扫描程序不同于其他三行,16个按键都能用,但发现怎么会有干扰?
当接上4个IO口,有时用手碰一下导线(锡),有的按键就被检测到了.
发表于 2015-1-15 10:27:53 | 显示全部楼层
非常不错,收藏
友情提示:标题不合格、重复发帖,将会被封锁ID。详情请参考:论坛通告:封锁ID、获得注册邀请码、恢复被封ID、投诉必读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2019-11-14 02:36

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

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

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