极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 26252|回复: 14

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

[复制链接]
发表于 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 电路板稍显复杂,但是由于没有集成电路,就是手工也能刻出来。

下回再讲程序部分。





本帖子中包含更多资源

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

x
回复

使用道具 举报

发表于 2016-2-20 09:07:10 来自手机 | 显示全部楼层
我用一个引脚就可以有256个键,是不是很多?^_^楼主可以看下键盘矩阵,拆个pc键盘,看看里面怎么联的就明白了。
回复 支持 反对

使用道具 举报

发表于 2016-2-20 09:31:35 | 显示全部楼层
楼主辛苦了,半夜发帖~~~~~~不得不说思路很奇特、描述清晰,佩服、佩服!期待程序。。。
回复 支持 反对

使用道具 举报

发表于 2016-2-20 10:32:15 | 显示全部楼层
BCD encoder 74147或74148
现成芯片可以更偷懒

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

发表于 2016-2-20 11:02:30 | 显示全部楼层
嘿,不错的方法。
回复 支持 反对

使用道具 举报

发表于 2016-2-20 14:24:43 | 显示全部楼层
多个按键按下就不好了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-20 18:19:56 | 显示全部楼层
老胖熊 发表于 2016-2-20 09:07
我用一个引脚就可以有256个键,是不是很多?^_^楼主可以看下键盘矩阵,拆个pc键盘,看看里面怎么联的就明白 ...

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

使用道具 举报

 楼主| 发表于 2016-2-20 18:30:06 | 显示全部楼层
Be1ieve 发表于 2016-2-20 10:32
BCD encoder 74147或74148
现成芯片可以更偷懒

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

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

使用道具 举报

 楼主| 发表于 2016-2-20 18:39:38 | 显示全部楼层
胡来猫 发表于 2016-2-20 14:24
多个按键按下就不好了

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

使用道具 举报

发表于 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
你不想做的方法都是最佳的解决方法。最难的方法做一次下次就直接调用函数了

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

回答:

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

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

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

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

使用道具 举报

发表于 2016-2-21 11:46:08 | 显示全部楼层
不错的想法,可能实用性差一些。部分老家电中和以前的MP3播放器用的AD转换,(电阻值的配合结合AD转换)。所以老家电会出现按键“串了”的情况,原因是按钮年数太长,受潮氧化,按键本身的电阻变大导致。
现在的电器中,按键少的直接用IO,或者AD。按键多的有专用芯片(毕竟主控芯片还要干别的或者引脚有限)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-21 23:28:50 | 显示全部楼层
164335413 发表于 2016-2-21 11:46
不错的想法,可能实用性差一些。部分老家电中和以前的MP3播放器用的AD转换,(电阻值的配合结合AD转换)。所 ...

arduino 的 D8 D9 D10  引脚是 AD 口吗?我一直把他当 I/O 口用的。
回复 支持 反对

使用道具 举报

发表于 2016-2-22 09:07:23 | 显示全部楼层
老来疯 发表于 2016-2-21 23:28
arduino 的 D8 D9 D10  引脚是 AD 口吗?我一直把他当 I/O 口用的。

你可以使用A0~A5口,analog-digital。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-22 18:25:40 | 显示全部楼层
164335413 发表于 2016-2-22 09:07
你可以使用A0~A5口,analog-digital。

你看文章不仔细,我的帖子说的是用 I/O 口连接键盘的一种新的思路,仅仅是新的思路,至于使用 AD 口做键盘输入,我有另一篇文章,你有兴趣的话,不妨看看,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-14 11:14 , Processed in 0.037413 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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