用四行代码编码几十个按钮

文章:吉姆布兰南

使用Charlieplexing的表兄弟,在4个IOs系统下编码一个了不起的74个开关。添加在LCD界面上,节省更多。

在这方面设计理念,基于二极管的16对4个编码的旧技术与新设计相结合,扫描按钮的记录数 - 74 - 只有四个I / O引脚!

二极管编码器:背景

首先以古代技术使用一系列二极管开始,图1,构建一个16到4个二进制编码器。每个二极管的阴极连接到具有下拉电阻器(或阳极和上拉)的输出。一个正面输入,剩下的左打开,通过二极管并以二进制模式提高输出。在此示例中,从按下按钮,零可以无法区分,并且用于指示该条件。


图1经典二极管16至4编码器。小点是直接连接,大型二极管。奇偶校验后来解释。

因为我们的输入要么是正的,要么是开放的,我们可以直接连接输入1,2,4,和8,其中只有一个二极管将显示。

我们可以将输出看作是一个4位的数字,或者只使用一半的输入,并将输出定义为一个具有奇偶校验的3位数字,可以是偶数,也可以是奇数。这是相同的二极管排列,只是观察输出的方式不同。

通过多路复用更多按钮

如果我们将一个输入引脚切换到输出模式以驱动一行,我们可以使用三个剩余的引脚作为输入来检测七个按钮。我们可以选择任何可检测的编码。

现在是聪明的一点。由于输出行选择的数据路径与输入列结果的数据路径相同,因此我们最终损坏列值。但在图2如果我们想象,我们想象用奇偶校验位保护的值读取。我们不仅知道最多一点被损坏,我们知道哪一个。这是我们如何使用所有行共享编码二极管的列。请注意,每行中的一个位置表示“按下按钮”。甚至奇偶校验,他们都落在一列;对于奇数奇偶校验,在不同的列中。


图2多路复用和奇偶校验编码更多按钮。正方形是切换。

图3.4.具有真实和互补的二极管编码器的完整阵列,共有四个银行共有74个可用按钮位置。


图3.将其全部拉动:四个银行的74个按钮位置。动画是在文章后面解释的。



图4.使用奇偶校验来重新排列右上银行。

读取数组

  1. 左下:设置端口为关闭上拉输入。下拉列表为0,任何按下的按钮都会创建列号。
  2. 右下方:将端口设置为使用拉升板输入。读取端口并反转结果列数。
  3. 左上角:一个引脚上的ONE输出选择一行,而其余的位,带上拉OFF,读取列。读取端口后,检查是否有按钮按下,并使用奇偶校验来纠正列值中的行位。
  4. 右上角:一个引脚上的零输出在剩余位时选择一行,其中返回窗口,读取列。在反转值并检查按钮后,使用奇偶校验纠正行位。

下拉必须足够大,以允许上拉允许微型接受的电压为一个:通常比内置上拉电阻大的四到五倍。

端口引脚和左下组V +具有电流限制电阻,以防止在按下多个按钮时损坏,或者在当前未扫描的银行中按下一个。 该值并不重要,但应相对于上拉和下拉 - 下拉 - 较小 - 通常在1kΩ和10kΩ之间。

那里有很多电容:按钮,电线,二极管和IC引脚。因此,在读取其值之前更改端口配置后等待多个微秒,允许上拉/缩小以获得它们应该的电压。

可以读取多个按钮按下作为其他一些位置,并且不受支持。扫描上部银行时,请忽略在多行中检测按钮的银行中看到的任何东西。在下部存储器中检测到的按钮压力机覆盖了上部中看到的任何内容。

在所有的情况下,按钮弹跳时按下和释放,所以重复以上的答案,直到至少50毫秒没有变化[ed:或者,每50毫秒左右扫描一次。[m]

发生冲突

虽然基于奇偶校验的阵列可以与真实或互补的编码器一起使用,但是当两者同时使用时都会产生问题,如图3所示。想象我们正在尝试扫描左上端,并在行中输出一个。我们打算(绿色亮点)将其“Travel”到按钮,交叉到列,激活一些二极管组合,并返回输入。啊,但它相反(蓝色突出显示)它到达互补二极管,绕过一列,在右上角阵列中找到一个按钮,并通过行返回到输入。这可以读取为左上银行的多行中的按钮并被拒绝。但是如果列中有两个或更少的二极管,我们将在与二极管中将一个按钮按下一个按钮,它将被误读为左上银行的一行中的按钮。因此,右上组有十二个位置,这是不可用的。

请记住,三位读取可以使用任何编码,因此通过将右上组切换到奇数奇偶校验(图4),良好的位置转移到完整列。

是时候缰绳了一点

虽然这是一个有趣的练习,但毕竟有更好的方法将大键盘与微控制器连接起来。一个I²C I/O扩展器(PCF8575, TCA9555, MCP23017等)有16个双向引脚和内置的上拉可以扫描240个按键-超过3倍的按钮-减少50%的引脚,可能更少的PCB面积。

关键不在于可以连接的按钮数量多,而在于连接任意数量的按钮时所拥有的选择多。我们不需要把它们都实现。

例如,如果没有按钮在左边使用,一个完整的编码器和下拉电阻是不需要的。如果需要更少的按钮,首先选择有较少二极管的列。


图5.一个极简的示例4×4键盘

通常不支持多个触点封闭物,但如果没有使用锯齿位置,则不会产生混淆结果。考虑一个数字操纵杆,图6.:钻石图案中的四个按钮,带有允许在每个方向上移动的手柄,以及对角线,加上全部。DISTONALS和AMOLLED一次按下多个按钮,但刚刚显示为不同的列。并且该银行仍有六个按钮组合可用于进一步扩展。


图6.连接右下角银行的数字操纵杆

测试

我没有在图4中构建完整的数组。相反,我制作了大部分二极管编码器。我将两个4×4键盘连接到右上岸和第三个4×4键盘到右上银行。我将操纵杆连接到右下银行,并在底部银行的不同位置添加了更多的按钮。

用于按钮按下的固件扫描,等待去抖动结果,然后在终端上绘制图表以指示哪个按钮似乎被按下,以及由行和列号组成的最终按钮代码(特别注意操纵杆)。


图7.按下各种按钮的屏幕截图

现在是最后一个奢侈品

典型的微控制器接口到字符LCD模块(图8.)通常仅使用四条数据位和三条控制线。什么时候E.高时,模块响应,但当低时,剩余的六位可以用于其他事情。可以向该模块写入数据,也可以从该模块读取数据——最有用的读取操作是检查busy标志。如果我们将该位(D7)从其他位中分离出来,那么剩余5位中的4位可以用于扫描按钮数组。我们可以用第五项来实现第四项转移键(例如,控制,换档,alt,其他),可以与自己和任何其他按钮同时按下。我们通过将第五个引脚设置为带有上拉上的输入,另一个四个是输出的。我们在一个零的时间选择一个班次按钮,并读取第五个引脚。我们最终结束了几乎完整的键盘,没有超越LCD所必需的额外引脚。


图8.与LCD模块共享I/O引脚

电流限制电阻的按钮阵列防止它干扰任何数据发送到LCD,尽管按钮按下将破坏任何读取从LCD上共享引脚。在LCD的数据线的电流限制电阻不是严格必要的,但如果你意外输出时,你应该输入,这是远远更好的加热电阻比油炸芯片。

要知道的关键是,这6个I/O引脚在每次用于特定目的时都要重新配置。LCD E引脚始终是一个输出。

知道你的微控制器

由于这种设计仅使用二极管和电阻来实现,因此考虑微控制器的I / O规范至关重要。图9.显示我所遇到的各种微控制器的阈值和负载输出级别。红线表示二极管电压从5v和3.3 V下降,从0v上升。


图9.用于多个微控制器的输入阈值(绿色)和输出电平(橙色)

通常会使细节复杂化。例如,PIC主要具有Schmitt触发输入,但有些是TTL,而其他人则是唯一的,因此由于同一引脚上的多路复用功能的要求是唯一的。STMS具有CMOS或TTL(5V耐受)销,每个销具有不同的规格。

数据表很少给出输出细节,通常列出一个或两个特定电源电压和(通常是中档)电流的情况。在这种应用中,电压降通常很小,但是输出不会到达轨对轨,所以一定要留有尽可能多的余量。周围到处都是噪音,所以要注意你离这些界限有多近。肖特基二极管可能必须在某些情况下使用,以满足特定的单片机和电源电压的特殊要求。

下载汇编代码实现

相关文章

-吉姆布兰南是一个系统程序员,他也喜欢设计硬件和摆弄微控制器。

发表评论