易冰 发表于 2012-5-3 15:46:27

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语言的程序,就显得累赘一些。
程序暂时就不公布了,有兴趣的网友可以来讨论。

.titrwh 发表于 2012-5-3 15:54:31

不错,很新颖的想法,记下来晚上回去细细研究下。{:smile:}                                                               

z421868436 发表于 2012-5-3 15:57:05

很不错   收藏了
要找个时间研究一下代码

LCRPN 发表于 2012-5-3 15:59:24

坛子里以前有人提过。

WGJ5767351 发表于 2012-5-3 16:01:24

加上负极,就5根线了,

易冰 发表于 2012-5-3 16:03:12

我刚进坛子,不清楚,之前设计电路时,IO口不够用,在网上挖出来的,大家一起学习嘛。
一个人不能光想获取不去奉献啊,大家说是不是啊。

a276841134 发表于 2012-5-3 16:23:01

楼主很有创新,这样可以大量节省了IO口!!{:lol:}

amalone 发表于 2012-7-1 12:12:15

求程序0.0

aifang 发表于 2012-7-1 17:46:19

很好的想法啊

gxhchhkd 发表于 2012-7-1 17:57:16

确实很新颖啊,受教了~

nongxiaoming 发表于 2012-7-1 18:16:48

不错,可以使用在IO紧缺的时候~

cjr82123 发表于 2012-7-1 19:25:46

阅读了一下,的确不错。mark

xiaobendan001 发表于 2012-7-1 20:23:47

之前发过的,还说是老外发明的,称作IO口扫键法还是什么的记不清了,我也实验过,可以支持部分按键的组合使用,但是如果使用薄膜开关,二极管没地方放啊

xiaobendan001 发表于 2012-7-1 20:24:12

之前发过的,还说是老外发明的,称作IO口扫键法还是什么的记不清了,我也实验过,可以支持部分按键的组合使用,但是如果使用薄膜开关,二极管没地方放啊

wjt1227 发表于 2012-7-1 20:29:00

有空研究下

machao 发表于 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键。

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

xiaoyigechaos 发表于 2012-7-2 13:12:24

收藏 回家研究

machao 发表于 2012-7-2 13:55:33

pjh 发表于 2012-7-2 13:05 static/image/common/back.gif
牛得不行呀!

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

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

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

靠的是什么?技术!

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

哈哈,牛,牛,牛!

machao 发表于 2012-7-3 00:46:16

pjh 发表于 2012-7-2 14:33 static/image/common/back.gif
老师:我是褒义,就是牛得不得了的意思,别误会

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

从这个例子可以看出,现在我们的教育是“应试教育”,学生越学越“傻”,越“笨”,一点分析问题的能力也没有。

zhikai_wu 发表于 2012-7-3 02:09:54

十七楼很有道理

tomy 发表于 2012-7-17 17:32:18

machao 发表于 2012-7-2 13:55 static/image/common/back.gif
如果我分析的对,就是真“牛”,如果不对,就是“假牛”,或“吹牛”。

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

马老师:
这个按键扫描.0\1\2\3这四个键没明白是要怎么扫到的呢??

huangwei198996 发表于 2012-7-26 15:39:10

tomy 发表于 2012-7-17 17:32 static/image/common/back.gif
马老师:
这个按键扫描.0\1\2\3这四个键没明白是要怎么扫到的呢??

把4个IO置为高电平    如果0,1,2,3其中一个键被按下   这4个IO其中一个就会变成低电平,这样MCU就可以确定是哪一个按键了

l769109884 发表于 2012-8-2 16:16:20

不错,,,好想法

l769109884 发表于 2013-1-8 23:27:26

接地那一列按键扫描不对,总会误为旁边的键,能提供参考下吗或者指点下!用C的

maxims 发表于 2013-1-9 11:23:21

嗯嗯,学习了!回家电脑上细看!

lpandadp 发表于 2013-6-2 19:52:35

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}很不错

Timecy 发表于 2013-7-20 17:55:08

看见新盈,于是研究了下,我想楼主还没写出程序把,因为写了程序会发现,并不能实现最后4个接地的按键。不过可以实现N=N²-N个键盘,N为IO数。即:4个IO口可以实现4²-4=12个键盘。以此类推,5个可以实现20个。

Timecy 发表于 2013-7-20 18:00:45

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个键盘鼠

cole333 发表于 2013-7-20 18:12:11

{:smile:} mark

zwf9969 发表于 2013-7-21 16:22:16

不错,可以好好研究,从没有仔细思考过还有这样的接法

68336016 发表于 2013-7-27 10:49:19

Timecy 发表于 2013-7-20 17:55 static/image/common/back.gif
看见新盈,于是研究了下,我想楼主还没写出程序把,因为写了程序会发现,并不能实现最后4个接地的按键。不 ...

可以实现最后接地按键的,比如P0.0先输出低电平,检测P0.1,P0.2,P0.3这就3个按键了。再把P0.0设置为输入上拉,不就检测到最后接地按键了?
就是写程序会比较费事些

sonyericsson 发表于 2013-7-27 13:08:02

cowboy以前发过了

skylsk 发表于 2013-8-26 01:35:30

马老师说的话深有体会···

943941946 发表于 2013-8-26 07:17:36

收藏了,谢谢

camtime 发表于 2013-8-26 09:25:12

呵呵,又见到这个IO扫描了,还有个是20多键版本

benqme 发表于 2013-8-26 14:16:23

精简,不错,好方法

wxty 发表于 2013-8-27 17:36:47

记得有个很强大的IO键盘扫描的帖子。

lmt50211 发表于 2013-8-28 08:22:31

WGJ5767351 发表于 2012-5-3 16:01 static/image/common/back.gif
加上负极,就5根线了,

老兄,人家说是用四个IO口, 不是说只用四条线...

wtliu 发表于 2013-8-28 08:55:13

很有创意,这个就收了。

minier 发表于 2013-8-28 15:19:31

这个很不错
切换IO不是什么问题
核心就是扫描法
应该代替传统的扫描法
节省1半的引脚
但是要注意,每根线要都加上拉电阻
另外,二极管也是可以省略的

czg1411 发表于 2013-9-7 21:18:16

这个就是双交互式按键。很久以前就有了。。。

lmt50211 发表于 2013-12-7 09:37:36

思路不错,值得试试。..

AllEle 发表于 2014-3-4 15:25:32

最后一列有问题
最后一列单独按时没问题,当按下最后一列中的某个同时按前面那些会出现问题
最后一个按下,相应那行拉低了,可判断的是当前IO口为低的数,但此时只有1/4可能性正好为那个口,所以出错机会是75%,又因为扫描是循环的,所以肯定读出的按键有问题

940605857 发表于 2014-3-5 11:18:17

厉害,回去研究下!!

cld795 发表于 2014-3-18 22:06:07

学习了            

chen7055909 发表于 2014-5-4 22:01:41

值得收藏,看一下{:smile:}

945595199 发表于 2015-1-15 00:30:31

我也自己焊了个试过了,接地的那一条按键扫描程序不同于其他三行,16个按键都能用,但发现怎么会有干扰?
当接上4个IO口,有时用手碰一下导线(锡),有的按键就被检测到了.

vivi_cq1982 发表于 2015-1-15 10:27:53

非常不错,收藏
页: [1]
查看完整版本: 4个IO口控制4*4矩阵按键,新颖,拿出来大家学习下