整体考虑法实现 2 的显示
虽然通过自定义逻辑可以快速地实现译码, 但毕竟是一种取巧的过程, 特别是我们还不知道底层到底应该怎么去实现的时候, 这会让我们有种不踏实的感觉.
因此, 本篇中将探讨一种具体的电路实现, 所谓的整体考虑法.
其整体思路是先根据两路输出划分为四种情况, 然后每种情况对应一组 LED 译码.
分组
在只要区分 0 和 1 的时候, 因为情况比较简单, 用一个继电器做一次区分即可. 现在有四种情况, 但也同时有两个输出, 那么首先根据高位 C 的输出即可将四种情况分为两组:
下面组是 2 和 3, 上面组是 0 和 1, 四种情况如下:
因为一旦 C 输出高电平, 说明结果一定是大于或等于 2 的.
分成两组后, 两组分别按照低位 S 的输出又可各自再分为两组, 最终分出四路输出, 从上到下分别对应 0, 1, 2, 3:
现在, 如果这四路各自对应一个 LED 数码管, 每个管分别按照 0, 1, 2, 3 的方式接好, 那么问题直接就解决了:
注: 上图中忽略了加法器部件, 直接以开关模拟输出的值.
可以看到, 四种情况下各自只有一根输出线是高亮的.
另: 为解决输出电压悬空的问题, 使用了电阻及接地.
因为输出暂时不可能为 3, 也可以忽略为 3 的情况.
0,1,2,3 四种情况的显示, 四个 LED 数码管 在线可互动操作示例
整合
但上述输出方式有点浪费数码管, 所以还是跟之前类似, 看能否把它们整合到一起.
不考虑输出为 3 情况, 只考虑 0, 1, 2, 就只剩三条线, 正好三条输出线都是分离的, 一个初步的方案如下, 有些线会共同输出到数码管的输入端上:
但这样一来, 因为共线的原因, 又会引发类似前面的电流倒灌问题, 将导致无论是哪种情况下所有的灯都会点亮.
甚至更为严重的是引发模拟器的异常, 模拟器会抱怨 检测到循环回路(wire loop detected) 等问题.
关于 circuitjs 异常及其处理, 参考 模拟器异常处理
当然, 最终的解决方式也跟之前类似, 引入 二极管 并利用它的 单向导电性 即可:
如此一来, 即可防止电流倒流到其它输出线上并再度输入到 LED 数码管的问题.
如上图, 点亮的是 0 线, 但因为二极管的存在, 电流不会回流到 1 线及 2 线.
整合的 LED 数码管, 使用二极管及接地 在线可互动操作示例
最终, 四种输入情况下的输出均能被正确解码并显示:
注: 右下角第四种情况, 因为我们没有处理显示 3 的问题, 输出被丢弃了, 所以没有任何显示.
如果需要的话, 你也可以自行加上.
拓展
显然, 上述的方式也可以进一步拓展到三根输出线的情况, 就可以输出 0~7 这 8 个不同数字了.
假如三根输出线, 从高到低分别为 S2, S1, S0, 无非也是先根据 S2 划分为 0123
和 4567
.
然后下一步, 这两组根据 S1 又可再度各自再划分两组, 就有 01
, 23
, 45
, 67
四组;
最后, 根据 S0 就可以最终划分为 8 组, 这 8 组线再根据所要显示的数字连上 LED 数码管的不同输入端即可显示出对应数字.
读者可以自行尝试去实现, 这里不再给出具体示例.
以上便是整体考虑法. 在下一篇, 再谈谈最后一种方式, 也即是分而治之法.