使用Charlieplexing的表兄弟,在4个IOs系统下编码一个了不起的74个开关。添加在LCD界面上,节省更多。
在这方面设计理念,基于二极管的16对4个编码的旧技术与新设计相结合,扫描按钮的记录数 - 74 - 只有四个I / O引脚!
二极管编码器:背景
首先以古代技术使用一系列二极管开始,图1,构建一个16到4个二进制编码器。每个二极管的阴极连接到具有下拉电阻器(或阳极和上拉)的输出。一个正面输入,剩下的左打开,通过二极管并以二进制模式提高输出。在此示例中,从按下按钮,零可以无法区分,并且用于指示该条件。
因为我们的输入要么是正的,要么是开放的,我们可以直接连接输入1,2,4,和8,其中只有一个二极管将显示。
我们可以将输出看作是一个4位的数字,或者只使用一半的输入,并将输出定义为一个具有奇偶校验的3位数字,可以是偶数,也可以是奇数。这是相同的二极管排列,只是观察输出的方式不同。
通过多路复用更多按钮
如果我们将一个输入引脚切换到输出模式以驱动一行,我们可以使用三个剩余的引脚作为输入来检测七个按钮。我们可以选择任何可检测的编码。
现在是聪明的一点。由于输出行选择的数据路径与输入列结果的数据路径相同,因此我们最终损坏列值。但在图2如果我们想象,我们想象用奇偶校验位保护的值读取。我们不仅知道最多一点被损坏,我们知道哪一个。这是我们如何使用所有行共享编码二极管的列。请注意,每行中的一个位置表示“按下按钮”。甚至奇偶校验,他们都落在一列;对于奇数奇偶校验,在不同的列中。
图3.和4.具有真实和互补的二极管编码器的完整阵列,共有四个银行共有74个可用按钮位置。
图3.将其全部拉动:四个银行的74个按钮位置。动画是在文章后面解释的。
图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一次按下多个按钮,但刚刚显示为不同的列。并且该银行仍有六个按钮组合可用于进一步扩展。
测试
我没有在图4中构建完整的数组。相反,我制作了大部分二极管编码器。我将两个4×4键盘连接到右上岸和第三个4×4键盘到右上银行。我将操纵杆连接到右下银行,并在底部银行的不同位置添加了更多的按钮。
用于按钮按下的固件扫描,等待去抖动结果,然后在终端上绘制图表以指示哪个按钮似乎被按下,以及由行和列号组成的最终按钮代码(特别注意操纵杆)。
现在是最后一个奢侈品
典型的微控制器接口到字符LCD模块(图8.)通常仅使用四条数据位和三条控制线。什么时候E.高时,模块响应,但当低时,剩余的六位可以用于其他事情。可以向该模块写入数据,也可以从该模块读取数据——最有用的读取操作是检查busy标志。如果我们将该位(D7)从其他位中分离出来,那么剩余5位中的4位可以用于扫描按钮数组。我们可以用第五项来实现第四项转移键(例如,控制,换档,alt,其他),可以与自己和任何其他按钮同时按下。我们通过将第五个引脚设置为带有上拉上的输入,另一个四个是输出的。我们在一个零的时间选择一个班次按钮,并读取第五个引脚。我们最终结束了几乎完整的键盘,没有超越LCD所必需的额外引脚。
电流限制电阻的按钮阵列防止它干扰任何数据发送到LCD,尽管按钮按下将破坏任何读取从LCD上共享引脚。在LCD的数据线的电流限制电阻不是严格必要的,但如果你意外输出时,你应该输入,这是远远更好的加热电阻比油炸芯片。
要知道的关键是,这6个I/O引脚在每次用于特定目的时都要重新配置。LCD E引脚始终是一个输出。
知道你的微控制器
由于这种设计仅使用二极管和电阻来实现,因此考虑微控制器的I / O规范至关重要。图9.显示我所遇到的各种微控制器的阈值和负载输出级别。红线表示二极管电压从5v和3.3 V下降,从0v上升。
通常会使细节复杂化。例如,PIC主要具有Schmitt触发输入,但有些是TTL,而其他人则是唯一的,因此由于同一引脚上的多路复用功能的要求是唯一的。STMS具有CMOS或TTL(5V耐受)销,每个销具有不同的规格。
数据表很少给出输出细节,通常列出一个或两个特定电源电压和(通常是中档)电流的情况。在这种应用中,电压降通常很小,但是输出不会到达轨对轨,所以一定要留有尽可能多的余量。周围到处都是噪音,所以要注意你离这些界限有多近。肖特基二极管可能必须在某些情况下使用,以满足特定的单片机和电源电压的特殊要求。
下载汇编代码实现。
相关文章:
-吉姆布兰南是一个系统程序员,他也喜欢设计硬件和摆弄微控制器。