打印

利用N+1个I/O口实现N×N矩阵式键盘[电路好像有问题,很有趣]

[复制链接]
7883|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
r8421|  楼主 | 2009-9-4 14:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
今天看到一篇**,讲用N个IO口做N*N个按键的电路,看了一下之后觉得有一些
问题,大家帮忙看一下!

关键词 键盘 矩阵 接口电路  
引言
  
  随着微机系统应用领域的扩大,操作人员与微机系统需要交流的信息越来越多,用来交流的手段和途径也更为灵活多样;而键盘输入作为最常用的输入设备仍有其不可替代的作用。因此,探讨一些键盘的特殊结构,用尽可能少的输入输出端口实现较多数量的按键数仍具有重要的应用价值。

  有些特殊情况下,在组成一个最小的单片机系统的过程中,由于通用的I/O口有限,而又需要大量的按键输入,这就要求一种新的键盘结构,即用尽量少的I/O口实现尽可能多的键盘输入。

  本文将从硬件和软件两个方面介绍一种用N+1个I/O口实现N×N矩阵式键盘的方法(为了与传统键盘区分,以下简称新型键盘)。首先,对传统键盘作一个简单的介绍。

一、传统键盘的介绍

  键盘的结构通常有两种形式:线性键盘和矩阵键盘。在不同的场合下,这两种键盘均得到了广泛的应用。

  线性键盘由若干个独立的按键组成,每个按键的一端与微机的一个I/O口相连。有多少个键就要有多少根连线与微机的I/O口相连,因此,只适用于按键少的场合。

  矩阵键盘的按键按N行M列排列,每个按键占据行列的一个交点,需要的I/O口数目是N+M,容许的最大按键数是N×M。显然,矩阵键盘可以减少与微机接口的连线数,简化结构,是一般微机常用的键盘结构。根据矩阵键盘的识键和译键方法的不同,矩阵键盘又可以分为非编码键盘和编码键盘两种。

  ◇ 非编码键盘

  非编码键盘主要用软件的方法识键和译键。根据扫描方法的不同,可以分为行扫描法、列扫描法和反转法三种。

  ◇ 编码键盘

  编码键盘主要用硬件来实现键的扫描和识别,通常使用8279专用接口芯片,在硬件上要求较高。

二、新型键盘的硬件和软件实现原理

  经过分析,实际上用N+1个I/O口,辅以适当的接口电路,是可以实现N×N个按键的。现以6个端口实现5×5的按键为例来叙述。

1. 硬件实现

  图1所示为用6个I/O口来实现25个按键的示意图。具体的物理实现电路如图2所示。

图1  6个I/O口实现5×5按键矩阵的示意图

  由图1和图2可见,硬件部分分为两块:一块是普通键盘矩阵,另外一块是中断和接口电路,主要由相应数目的二极管和电阻组成。具体对6个I/O口的情况,实现5×5的按键矩阵的中断和接口电路(图2)共需要10只二极管、12只电阻和1只三极管。10只二极管按其在电路中所起的作用可分为两组:第一组包括D6、D7、D8、D9和D10,用于保证按键信息的单一流向;第二组包括D1、D2、D3、D4和D5,它们在电路上对NPN三极管的基极构成"或"的逻辑关系,对单片机进行初始化。除了PORT6(其要求具有中断功能)以外,其余的I/O口均被置成高电平,这样当有键按下时,三极管的基极由低变高,三极管导通;集电极由高电平跳变成低电平,向单片机发出中断信号,从而启动键盘扫描程序。


图2  用6个I/O口实现5×5按键矩阵的原理图

2. 软件实现

  按键的识别主要靠软件来实现,需要编写键盘扫描程序。

(1)  键盘扫描原理

  为了更好地说明键盘扫描的过程,假设编号为S12的键(见图2)被按下,扫描程序已经启动,扫描的具体过程如表1所列。

表1


(2)  键盘扫描程序的流程

  在启动键盘扫描程序以前首先要对CPU进行初始化(主要是对所使用的中断进行初始化)。假设已经有键按下,并引发了相应的中断服务程序(即键盘扫描程序),其流程图如图3所示。


图3  键盘扫描程序流程图


仔细看了一下原理图,有些问题,当S1和S2同时按下时,扫描PORT1的时候,得到的代码是110010,扫描PORT2时得到的代码还是110010;当S1和S16同时按下时,扫描PORT1时得到的代码还是110010;问题出来了,如果有两个按键同时按下时,键值会混乱,除非把PORT1,PORT2,PORT3,PORT4,PORT5扫描的5个代码组合起来,查表,才能识别两个按键同时按下!  

相关帖子

沙发
r8421|  楼主 | 2009-9-4 14:46 | 只看该作者
大家帮忙看一下!
看了一下原理图,有些问题,当S1和S2同时按下时,扫描PORT1的时候,得到的代码是110010,扫描PORT2时得到的代码还是110010;当S1和S16同时按下时,扫描PORT1时得到的代码还是110010;问题出来了,如果有两个按键同时按下时,键值会混乱,除非把PORT1,PORT2,PORT3,PORT4,PORT5扫描的5个代码组合起来,查表,才能识别两个按键同时按下!  

使用特权

评论回复
板凳
r8421|  楼主 | 2009-9-4 15:10 | 只看该作者
大家发表一下看法吧

使用特权

评论回复
地板
xwj| | 2009-9-4 15:19 | 只看该作者
这种节约IO的方法本来就不支持多键同时按下或者某个按键一直接通
如果非要支持,则每个按键均需串一个二极管。

使用特权

评论回复
5
r8421|  楼主 | 2009-9-4 15:28 | 只看该作者
4# xwj

但检测的时候,如果两个按键同时按下的话,代码跟一个键按下的不一样,表中也查不到啊,那怎么处理呢,难道就当没有按键按下么?

使用特权

评论回复
6
xwj| | 2009-9-4 15:41 | 只看该作者
多键按下当然是无效键。

使用特权

评论回复
7
r8421|  楼主 | 2009-9-4 16:04 | 只看该作者
有得必有失啊

使用特权

评论回复
8
程序匠人| | 2009-9-4 16:38 | 只看该作者
xwj说的对

使用特权

评论回复
9
yangtse| | 2009-9-27 17:21 | 只看该作者
硬件电路定了后,如果加软件能够识别,就没有问题。

使用特权

评论回复
10
cjr82123| | 2009-11-2 16:57 | 只看该作者
:lol MARK

使用特权

评论回复
11
caoyannay| | 2009-11-5 21:18 | 只看该作者
mark

使用特权

评论回复
12
wanglihang1| | 2010-1-10 02:32 | 只看该作者
了解

使用特权

评论回复
13
wangoo1| | 2010-3-10 11:08 | 只看该作者
这种节约IO的方法本来就不支持多键同时按下或者某个按键一直接通

使用特权

评论回复
14
kele2008| | 2010-3-20 13:26 | 只看该作者
本帖最后由 kele2008 于 2010-3-20 13:28 编辑

工作电压过低时,也会造成按键不能识别,二极管导通有压降。如果5V供电就没啥问题!

使用特权

评论回复
15
DM_man| | 2010-4-16 17:28 | 只看该作者
标记

使用特权

评论回复
16
cliffboy| | 2010-4-20 11:18 | 只看该作者
感觉键盘识别也不会太理想,必须在键盘弹起前完成扫描,不然实现不了识别

使用特权

评论回复
17
xuhm| | 2010-5-28 09:26 | 只看该作者
这种做法太累,成本不见得省

使用特权

评论回复
18
yuanmeng22| | 2010-5-31 21:57 | 只看该作者
要扩键盘,哪用这等复杂,我用6口扩21个按键,支持复合键,带中断!:)

使用特权

评论回复
19
yylfcxpx168| | 2013-8-2 23:44 | 只看该作者
yuanmeng22 发表于 2010-5-31 21:57
要扩键盘,哪用这等复杂,我用6口扩21个按键,支持复合键,带中断!

有源码吗?参考下

使用特权

评论回复
20
mmuuss586| | 2014-5-17 19:19 | 只看该作者
好贴啊,谢谢分享

使用特权

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

本版积分规则

1

主题

5

帖子

1

粉丝