找回密码
 注册
搜索
查看: 2657|回复: 21

[讨论] 提问:八条KEYPAD线最多可以组成多少个按键

[复制链接]
发表于 2006-10-17 14:23:00 | 显示全部楼层 |阅读模式
最近在一家公司面试时的一个问题,我说是十六个,但那个老家伙说是错的,应该是二十八个
发表于 2006-10-17 16:45:00 | 显示全部楼层
老家伙说对了,n条线最多可以组成n(n-1)/2个按键

但很遗憾,我也记不得具体的方法了,只记得起码要加n个分立小器件,好像是开关三极管吧

不知道哪位可以提供具体方法
点评回复

使用道具 举报

发表于 2006-10-17 17:09:00 | 显示全部楼层
老家伙出这种问题,可见还是停留在做单片机的时代

要加二极管的,也不可靠,而且键值不唯一,按键扫描驱动也繁琐,不提倡这样做

要是可以加器件,岂止是28个

C(8,2)仅仅是2线组合逻辑判断,还不包含多键组合逻辑判断呢
点评回复

使用道具 举报

 楼主| 发表于 2006-10-17 17:48:00 | 显示全部楼层
就只有八条矩阵线哦,无其它线路,要么就是4*4,或5*3
点评回复

使用道具 举报

发表于 2006-10-17 19:11:00 | 显示全部楼层
<DIV class=quote><B>以下是引用<I>jamesbond</I>在2006-10-17 17:09:00的发言:</B>
老家伙出这种问题,可见还是停留在做单片机的时代

要加二极管的,也不可靠,而且键值不唯一,按键扫描驱动也繁琐,不提倡这样做

要是可以加器件,岂止是28个

C(8,2)仅仅是2线组合逻辑判断,还不包含多键组合逻辑判断呢</DIV>


呵呵,原理上2的8次方即256个键都是可以的,只不过接起来比较麻烦,电路复杂一些了,但如果只是二维矩阵的话,最多只有4*4=16个了
点评回复

使用道具 举报

发表于 2006-10-17 19:21:00 | 显示全部楼层
如果加个译码器什么的就没完没了了
点评回复

使用道具 举报

发表于 2006-10-18 09:56:00 | 显示全部楼层
不是的,我看到过这个线路,如果加了译码器或其他比如2的8次方,这些译码器或控制电路都需要控制引脚,而n(n-1)/2是真的只需要8根扫描线,不需要其他控制端的

如果有这样的限制条件,甚至不给你接其他电源,比如译码器的供电,那么这个问题还是有意义的
点评回复

使用道具 举报

发表于 2006-10-18 14:24:00 | 显示全部楼层
首先,这八根线即能input,又能output,这样的话,可以实现。
点评回复

使用道具 举报

发表于 2006-10-18 17:07:00 | 显示全部楼层
三角键盘,利用二极管能远远超过16个,不过也会超过28个。[em05][em05][em05][em05][em05][em05][em05]
点评回复

使用道具 举报

发表于 2006-10-19 12:01:00 | 显示全部楼层
我们一般是指4根OUPUT,4根INPUT,即4*4

如果我们8线按顺序OUTPUT,当其中一个OUTPUT时,其余7个做SCAN INPUT。
这样的确实可以做到8*7/2;不用加任何器件。
点评回复

使用道具 举报

发表于 2006-10-19 16:12:00 | 显示全部楼层
各位大哥能不能给个图  说明下28个是怎么实现的?
点评回复

使用道具 举报

 楼主| 发表于 2006-10-19 17:10:00 | 显示全部楼层
同感,给个图吧[em05]
点评回复

使用道具 举报

发表于 2006-10-20 09:04:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
点评回复

使用道具 举报

发表于 2006-10-21 09:22:00 | 显示全部楼层
上半年做了个方案 供参考 软件写起来罗嗦
点评回复

使用道具 举报

发表于 2006-10-21 13:35:00 | 显示全部楼层
[upload=gif]UploadFile/2006-10/061021@52RD_14a.gif[/upload]
1 新型键盘电路
键盘电路是单片机应用系统最常用的人机接口,往往要占用较多的I/O端口,利用本文介绍的电路,可以最大限度地减少键盘电路对I/O端口的点用。本电路特别适合一些引脚少、结构紧凑的单片机,可为其节省宝贵的I/O资源。
这里以3根I/O线为例,普通接法只能接3个键,即使是采用改进后的组合接法[1],最多也只能接7个链,本文介绍的电路是在组合接法的基础上增加了3个二极管,并采用了新的接法。其软件处理使用了端口访问和扫描检测两种方法,从而使按键数可达到16个,同时由于采用了组合逻辑来直接对端口进行读取,因此极大地简经了程序的处理过程,同时也节省了宝贵的存储器和CPU运算资源。图1是该电路的电路原理图。

2 软件过程和程序
该电路在程序处理时,由处理器首先向I/O1~I/O3写高电平,然后读入。如果非全“1”,说明,K0~K6中有键按下,此时可根据读入的端口状态判断键的状态,如果读入的结果为全“1”,则I/O1~I/O3轮流输出低电平,再读入,这样就可根据另外两根I/O线的状态来判别是K7~K15中的哪一个键被按下。重复调用键盘处理子程序可将读取的键值与上次的值进行比较,甚至两次读数相同为止,这样即可消除按键抖动所造成的误读。该电路选用的单片机为AT89C2051,用C51语言编写的按键电路处理程序如下:
#include<c:eg51.h>
#define uchar unsigned char
uchar getkey(void);
uchar keyvol;
void main(void)
{
keyvol=getkey(); /*调用键处理函数,返回的数据等于16表示同有键按下,0至15对应k0至K15*/
}
以下为键盘处理子程序:
uchar getkey(void)
{
uchar x
P1=P1|0x07; /*I/O1至I/O3写“1”*/
xP1&0x07; /*读入I/O1至I/O3并屏蔽其它位*/
if(x= =10)
  {
   P1=P1|0x07;
   P1=P1&0xfd; /*I/O2写“0”*/
   x=P1&0x07;
   x=(x+1)/2+10; /*屏蔽I/O2并转换K10至K12的键值*/
   if(x = =13)
      {
       P1=P1|0x07;
       P1=P1&0xfb; /*I/O3写“0”*/
       x=P1&0x07;
       x=x+13; /*屏蔽I/O3并转换K13至K15的键值*/
     }
  }
return x;
}
 

利用该键盘电路并根据逻辑组合原理可推断开n条I/O线可组合的按键数N为:
N=(2n-1)+(2 n-1 -1)n
表1给出了2至4条I/O线可组合的按键数。

表1 2~4条I/O线可组合的按键数
I/O线可组合按键
25
316
443

3 结束语
这种新型键盘电路在使用时非常稳定可靠,节省大量的I/O端口,而且程序处理也很简洁,速率比4×4的扫描式电路还要快,因此,该电路特别适合一些引脚较少的单片机,如PIC12C508、Z86E03以及AT89C2051等。 [br]<p align=right><font color=red>+5 RD币</font></p>

本帖子中包含更多资源

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

×
点评回复

使用道具 举报

发表于 2007-3-31 14:45:00 | 显示全部楼层
学习了
点评回复

使用道具 举报

发表于 2007-8-27 17:30:00 | 显示全部楼层
牛!真牛!!
点评回复

使用道具 举报

发表于 2007-8-27 19:18:00 | 显示全部楼层
28个键盘电路很简单,但是每根线都要能输入输出,即每两根线之间连一个键盘,即C(2,8)=28个键盘,8根线依次进行扫描其余7根线检测。
点评回复

使用道具 举报

发表于 2007-8-27 22:05:00 | 显示全部楼层
学到了,谢谢15楼的兄弟!
点评回复

使用道具 举报

发表于 2007-9-26 15:57:00 | 显示全部楼层
我以前用过的有8+7+6+5+4+3+2+1=36个,在单片机上才用,扫描很麻烦。
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-11-6 07:03 , Processed in 0.069913 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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