4个IO口控制4*4矩阵按键,新颖,拿出来大家学习下
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语言的程序,就显得累赘一些。
程序暂时就不公布了,有兴趣的网友可以来讨论。 不错,很新颖的想法,记下来晚上回去细细研究下。{:smile:} 很不错 收藏了
要找个时间研究一下代码 坛子里以前有人提过。 加上负极,就5根线了, 我刚进坛子,不清楚,之前设计电路时,IO口不够用,在网上挖出来的,大家一起学习嘛。
一个人不能光想获取不去奉献啊,大家说是不是啊。 楼主很有创新,这样可以大量节省了IO口!!{:lol:} 求程序0.0 很好的想法啊
确实很新颖啊,受教了~ 不错,可以使用在IO紧缺的时候~ 阅读了一下,的确不错。mark 之前发过的,还说是老外发明的,称作IO口扫键法还是什么的记不清了,我也实验过,可以支持部分按键的组合使用,但是如果使用薄膜开关,二极管没地方放啊 之前发过的,还说是老外发明的,称作IO口扫键法还是什么的记不清了,我也实验过,可以支持部分按键的组合使用,但是如果使用薄膜开关,二极管没地方放啊 有空研究下
本帖最后由 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键。
作为一个系统,你不知道用户会如何的操作按键,如果用户胡乱按键盘,你的系统就出问题了。
收藏 回家研究 pjh 发表于 2012-7-2 13:05 static/image/common/back.gif
牛得不行呀!
如果我分析的对,就是真“牛”,如果不对,就是“假牛”,或“吹牛”。
朋友也可以参与讨论,比如给个对应的参考扫描代码,那也是“牛”。
西班牙斗牛士获得2012年欧锦赛的冠军,4年中连续获得3次世界级大赛的冠军,牛不牛?牛!
靠的是什么?技术!
有了真正的技术垫底,怎么“牛”都可以。说风量话的,妒忌人的,恐怕连“吹牛”都不敢。
哈哈,牛,牛,牛! pjh 发表于 2012-7-2 14:33 static/image/common/back.gif
老师:我是褒义,就是牛得不得了的意思,别误会
朋友,这个怎么也算不上“牛”的,只是一个基本的电路,稍微具备一点基础,就可以分析出来的。
从这个例子可以看出,现在我们的教育是“应试教育”,学生越学越“傻”,越“笨”,一点分析问题的能力也没有。 十七楼很有道理 machao 发表于 2012-7-2 13:55 static/image/common/back.gif
如果我分析的对,就是真“牛”,如果不对,就是“假牛”,或“吹牛”。
朋友也可以参与讨论,比如给个对 ...
马老师:
这个按键扫描.0\1\2\3这四个键没明白是要怎么扫到的呢?? tomy 发表于 2012-7-17 17:32 static/image/common/back.gif
马老师:
这个按键扫描.0\1\2\3这四个键没明白是要怎么扫到的呢??
把4个IO置为高电平 如果0,1,2,3其中一个键被按下 这4个IO其中一个就会变成低电平,这样MCU就可以确定是哪一个按键了 不错,,,好想法 接地那一列按键扫描不对,总会误为旁边的键,能提供参考下吗或者指点下!用C的 嗯嗯,学习了!回家电脑上细看! {:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}很不错 看见新盈,于是研究了下,我想楼主还没写出程序把,因为写了程序会发现,并不能实现最后4个接地的按键。不过可以实现N=N²-N个键盘,N为IO数。即:4个IO口可以实现4²-4=12个键盘。以此类推,5个可以实现20个。 huangwei198996 发表于 2012-7-26 15:39 static/image/common/back.gif
把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个键盘鼠 {:smile:} mark 不错,可以好好研究,从没有仔细思考过还有这样的接法 Timecy 发表于 2013-7-20 17:55 static/image/common/back.gif
看见新盈,于是研究了下,我想楼主还没写出程序把,因为写了程序会发现,并不能实现最后4个接地的按键。不 ...
可以实现最后接地按键的,比如P0.0先输出低电平,检测P0.1,P0.2,P0.3这就3个按键了。再把P0.0设置为输入上拉,不就检测到最后接地按键了?
就是写程序会比较费事些 cowboy以前发过了 马老师说的话深有体会··· 收藏了,谢谢 呵呵,又见到这个IO扫描了,还有个是20多键版本 精简,不错,好方法 记得有个很强大的IO键盘扫描的帖子。 WGJ5767351 发表于 2012-5-3 16:01 static/image/common/back.gif
加上负极,就5根线了,
老兄,人家说是用四个IO口, 不是说只用四条线... 很有创意,这个就收了。 这个很不错
切换IO不是什么问题
核心就是扫描法
应该代替传统的扫描法
节省1半的引脚
但是要注意,每根线要都加上拉电阻
另外,二极管也是可以省略的 这个就是双交互式按键。很久以前就有了。。。 思路不错,值得试试。.. 最后一列有问题
最后一列单独按时没问题,当按下最后一列中的某个同时按前面那些会出现问题
最后一个按下,相应那行拉低了,可判断的是当前IO口为低的数,但此时只有1/4可能性正好为那个口,所以出错机会是75%,又因为扫描是循环的,所以肯定读出的按键有问题 厉害,回去研究下!! 学习了 值得收藏,看一下{:smile:} 我也自己焊了个试过了,接地的那一条按键扫描程序不同于其他三行,16个按键都能用,但发现怎么会有干扰?
当接上4个IO口,有时用手碰一下导线(锡),有的按键就被检测到了. 非常不错,收藏
页:
[1]