打印

51中端口复用,4*5矩阵键盘的程序如何实现?

[复制链接]
4835|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanse51|  楼主 | 2012-5-28 13:23 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yanse51 于 2012-5-28 13:34 编辑

这是本人用PROTEUS中画的图。其中端口D7,D1既用于行线也用于列线。
因为列线电路中是高电平,所以我想应采用行扫描法。但是程序究竟如何写呢?


另:图中74ls32的RD端,连接的是DS12C887的DS端。当RD与CS_KEY1同时为0,此时,74ls244才选通。
其余连接,都是照搬原图。

相关帖子

沙发
xyz769| | 2012-5-28 17:58 | 只看该作者
光用244不行,输出要锁存才能读出(244+573)。建议用专用键盘芯片吧,便宜还好用。。

使用特权

评论回复
板凳
airwill| | 2012-5-28 19:44 | 只看该作者
我比较喜欢用 74HC595 来做这样的事情.

使用特权

评论回复
地板
yanse51|  楼主 | 2012-5-28 22:49 | 只看该作者
是必须配合锁存。所以,图中用了74ls377。
从图中看,51端p20,p21,p22三端输出个信号,然后通过74ls138输出8种状态。其中就有CS_KEY1,CS_KEYO.这种条件量。
通常4*4键盘,取一个端口的低4位和高4位。然后进行逐行扫描。但是在本图这个4*5的键盘中,当244有效时,kin1,kin2,kin3,kin4列线端,输入给51芯片的端口是D7,D4,D3,D1.
当377有效时,kout1,kout2,kout3,kout4,kout5,对应于51的输出端口是:D1,D7,D5,D2,D0.
也就是说,有2个端口复用了。(D0....D7对应于51的P0口)。
那么这种情况,程序中是如何实现键盘扫描的呢?
还请高手详细指教。

使用特权

评论回复
5
yanse51|  楼主 | 2012-5-29 00:09 | 只看该作者
这个电路是个成品。我进公司的时候就已经有了。今日仔细看了下,才发现不同于一般的矩阵键盘。想了几天没想通,所以上来请教二姨家的高手

使用特权

评论回复
6
yanse51|  楼主 | 2012-5-29 19:53 | 只看该作者
高手进来指点一下啊。静等。

使用特权

评论回复
7
xyz769| | 2012-5-30 09:16 | 只看该作者
没看清图,原来有片锁存芯片。那就简单了。。

138是地址译码用的,首先选中377输出,再选中244读相应端口就行了。。网上大把这类程序,搜一下就明白。

注意此图行列扫描方式有些不同,仔细看看管脚排列吧。。

使用特权

评论回复
8
hotyong| | 2012-5-30 13:21 | 只看该作者
在总线扩展的情况下算是很正常了..

使用特权

评论回复
9
yanse51|  楼主 | 2012-5-31 20:24 | 只看该作者
管脚排列,P0.1,P0.7两个端口涉及到了复用的问题。很多时候看书,都是看的4*4键盘。这个有点蒙。头疼好几天了。不知道该怎么用程序表达。

使用特权

评论回复
10
yanse51|  楼主 | 2012-6-1 16:28 | 只看该作者
8# xyz769

在网上搜了,没搜到相关例程。还请高手指点迷津。

使用特权

评论回复
11
joyme| | 2012-6-1 16:56 | 只看该作者
这种接法不能很好的处理同时按键,忽略
循环拉低Kout,依次检测与之相连的Kin,如果某个为低说明有键按下,至于怎么赋键值,自己定,下面是检测的例子,实际上还要加防抖等
for(i=0;i<5;i++)
{
      clr Kout[i];
      for(j=0;j<4;j++)
      {
            if(get Kin[j] == 0)
            {
                   keypress = (i<<4 + j);
                   break;                     
            }
      }
}

使用特权

评论回复
12
yanse51|  楼主 | 2012-6-1 23:16 | 只看该作者
多谢楼上高手指点。 不过,键盘扫描有个问题:列线: P0.7  P0.4  P0.3  P0.1
                                                                行线: P0.7  P0.5  P0.2 P0.1  P0.0
           其中,如何循环调用,因为端口不是挨着的。另外,端口的复用问题,程序中如何解决?

使用特权

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

本版积分规则

39

主题

88

帖子

0

粉丝