老来疯 发表于 2016-2-20 03:18:19

键盘输入新方法,突发奇想

本帖最后由 老来疯 于 2016-2-20 04:23 编辑

想学习键盘输入,看了很多帖子,都不中意,原因有 四:

1. 简单的,需要引脚太多,如:每个按键需要一个 引脚。

2. 能减少引脚占用的,电路太复杂,如:用移位寄存器扩展。

3. 矩阵电路虽好,也免不了程序太复杂。

4. 监测键盘不能及时,因为使用中断麻烦。

    苦恼很长时间,突发灵感,想到了 二进制 代码,自认为不错。电路简单明了,编程方便简单,只是随着按键的增多,使用的二极管太多。下面简述原理,与大家共享。

   先从 二进制 代码 说起,如: 1 0 1 0,共 4 位,每一位两个状态,4 位 有 16 个状态,做键盘输入时,需要一个常态,剩下 15 个状态就是有 15 个键值。但是他只用 4 位,也就是说用 4 个 引脚就能得到 15 个键值。

为了说明方便,先从 2 个引脚 3 个按键说起。 见图:







如果这两个引脚处于一个端口,比如 PB 端口,我们使用最低两位,位 0 和 位1 ,对应 arduino 的 D8. D9 两个引脚。

当 按键没有按下时,两个引脚都被下拉电阻接地,这是常态,输入寄存器的值是 B 00,

当 按键 S1按下时,接到了引脚 8 ,直接将输入寄存器的位 0 拉高。值是 B 01,

当 按键 S2按下时,接到了引脚 9 ,直接将输入寄存器的位 1 拉高。值是 B 10,

当 按键 S3 按下时,按键通过两个二极管同时接通了引脚 8 和 9 ,对应输入寄存器的位 1 和 位0 ,二进制码是 B 11 。


我们只需要简单的读取 PB 端口的 输入寄存器 的值就行了,简单方便。并且可以同时使用 引脚电平变化 中断 。


那么同理,三个引脚就可以处理 7 个按键。见图:






当按键 4 按下时,接到了引脚 10 ,对应输入寄存器的值是 B100 ,

当按键 5 按下时,通过 两个 二极管 接到了引脚 8 和 10。对应输入寄存器的位 2 和 位0 ,值是 B101,

当按键 6 按下时, 通过 两个 二极管 接到了引脚 9 和 10 ,对应输入寄存器的位 2 和 位1,值是 B110,

当按键 7按下时,通过 三个 二极管 接到了引脚 8 和 9 和 10 ,对应输入寄存器的 位2 和 位1 和 位0,值是 B111,


三个引脚就可以有 7    个按键,

以此以此类推:

四个引脚就可以有 15个按键,
五个引脚就可以有 31个按键,
六个引脚就可以有 63个按键,
七个引脚就可以有 127 个按键,
八个引脚就可以有 255 个按键,

是不是很多,而且编程都一样,跟两三个按键的程序一样。按键响应快。程序占用空间少,

只是 二极管 数量增加的太多,PCB 电路板稍显复杂,但是由于没有集成电路,就是手工也能刻出来。

下回再讲程序部分。





老胖熊 发表于 2016-2-20 09:07:10

我用一个引脚就可以有256个键,是不是很多?^_^楼主可以看下键盘矩阵,拆个pc键盘,看看里面怎么联的就明白了。

xinhoujue 发表于 2016-2-20 09:31:35

楼主辛苦了,半夜发帖~~~~~~不得不说思路很奇特、描述清晰,佩服、佩服!期待程序。。。

Be1ieve 发表于 2016-2-20 10:32:15

BCD encoder 74147或74148
现成芯片可以更偷懒

maxims 发表于 2016-2-20 11:02:30

嘿,不错的方法。

胡来猫 发表于 2016-2-20 14:24:43

多个按键按下就不好了

老来疯 发表于 2016-2-20 18:19:56

老胖熊 发表于 2016-2-20 09:07 static/image/common/back.gif
我用一个引脚就可以有256个键,是不是很多?^_^楼主可以看下键盘矩阵,拆个pc键盘,看看里面怎么联的就明白 ...

使用 PC 键盘,我有现成程序,只是程序比较大,在单片机这种小制作上好像不太方便

老来疯 发表于 2016-2-20 18:30:06

Be1ieve 发表于 2016-2-20 10:32 static/image/common/back.gif
BCD encoder 74147或74148
现成芯片可以更偷懒

在单片机上使用键盘,方法很多,我是初学,了解的还不是太多,但是总感觉使用集成电路要么需要购买现成的板,要么自己制作电路板,实现起来比较麻烦,

我这里提出来的方法,只是学习中的突发奇想,只是一种方案,没有排他性。

老来疯 发表于 2016-2-20 18:39:38

胡来猫 发表于 2016-2-20 14:24 static/image/common/back.gif
多个按键按下就不好了

是的,如果多个按键在非常少的几个时钟周期里同时按下,那就乱了,而且在使用比较多的按键时,使用的二极管太多了,显得不太实用,所以,31 个按键之内较好,最好是 7个或 15 个按键较好。

Ansifa 发表于 2016-2-20 23:34:34

本帖最后由 Ansifa 于 2016-2-20 23:36 编辑

你不想做的方法都是最佳的解决方法。最难的方法做一次下次就直接调用函数了

PC键盘就是你不想做的矩阵键盘,加上你不想做的移位寄存器

一片74HC595+一片74HC138就可以搞64个键了,占用6个IO口。可以合并IO

老来疯 发表于 2016-2-21 01:21:28

Ansifa 发表于 2016-2-20 23:34 static/image/common/back.gif
你不想做的方法都是最佳的解决方法。最难的方法做一次下次就直接调用函数了

PC键盘就是你不想做的矩阵键 ...

回答:

1. 玩单片机其实没有 “最”

2. PC 键盘好像比较好,他是一个完整的键盘,占用端口少,只需一个 库文件 就行,但是很难想象一个单片机作品拖着一个大键盘。

3. 移位寄存器也不错,占用端口少,只是编程稍微麻烦点,缺点还有占用 CPU 时间,另外需要耗电,

我的方法不一定是最好的,但是多了一条思路,也许你什么时候就用上了。

164335413 发表于 2016-2-21 11:46:08

不错的想法,可能实用性差一些。部分老家电中和以前的MP3播放器用的AD转换,(电阻值的配合结合AD转换)。所以老家电会出现按键“串了”的情况,原因是按钮年数太长,受潮氧化,按键本身的电阻变大导致。
现在的电器中,按键少的直接用IO,或者AD。按键多的有专用芯片(毕竟主控芯片还要干别的或者引脚有限)

老来疯 发表于 2016-2-21 23:28:50

164335413 发表于 2016-2-21 11:46 static/image/common/back.gif
不错的想法,可能实用性差一些。部分老家电中和以前的MP3播放器用的AD转换,(电阻值的配合结合AD转换)。所 ...

arduino 的 D8 D9 D10引脚是 AD 口吗?我一直把他当 I/O 口用的。

164335413 发表于 2016-2-22 09:07:23

老来疯 发表于 2016-2-21 23:28 static/image/common/back.gif
arduino 的 D8 D9 D10引脚是 AD 口吗?我一直把他当 I/O 口用的。

你可以使用A0~A5口,analog-digital。

老来疯 发表于 2016-2-22 18:25:40

164335413 发表于 2016-2-22 09:07 static/image/common/back.gif
你可以使用A0~A5口,analog-digital。

你看文章不仔细,我的帖子说的是用 I/O 口连接键盘的一种新的思路,仅仅是新的思路,至于使用 AD 口做键盘输入,我有另一篇文章,你有兴趣的话,不妨看看,
页: [1]
查看完整版本: 键盘输入新方法,突发奇想