对于LED而言,显而易见的方法是为棋盘的每一行和每一列提供一个输出:总共8 + 8 = 16个引脚。阳极将连接到行线,阴极将连接到列线。对于要点亮的LED,您可以使其阳极线为正(逻辑1),使其阴极线为负(逻辑0),同时使其他LED保持反向状态(这样,其余的LED具有中性或反向偏置)。
我在这里假设微控制器可以提供足够高/低的电压,使您能够将一个LED桥接到另一个LED。如果不是这种情况,则每条线都需要一个晶体管或缓冲器。使用5V电源时,考虑到LED的压降约为2V,并且您想要在限流电阻上施加合理的压降(请注意,您只需要将它们安装在行线或列线中,而不必同时安装在这两个行中),这是很紧的。
如果您的输出为三态(即,除了逻辑0和逻辑1之外,还可以将它们设置为高阻抗状态,也许可以通过将它们临时配置为输入),那么您可以变得更聪明,并使用带有LED的4x8网格以反平行线对连接。在此设置中,将未使用的输出设置为高阻抗很重要,否则不需要的LED将会点亮。
在这两种情况下,您都必须考虑电流消耗,以及是否有可能冒着软件错误同时点亮所有LED的风险(如果不考虑这可能会使微控制器的该行过电流) )
传感器的情况更为复杂。我将假设您使用电阻传感器,尽管不一定要保证光电晶体管只能在一个方向上导电。
您可以使用与点亮LED相同的8行输出,但将需要专用于传感的8列输入。毫无疑问,您会看到这样的键盘电路。请记住,这些按钮只能一次按下一个键。如果用户同时按下1,3,7和9,则键盘将无法检测到用户是否释放了这四个键中的任何一个,因为仍然存在通过其他三个开关的电流路径。
音乐键盘上使用的解决方案(设计为一次导通多个矩阵元素)是在每个开关上串联一个二极管。
另一个解决方案是购买四个具有集电极开路输出(如果使用MOSFET IC,则开路漏极)的4至16解码器IC,例如:http : //www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf集电极开路意味着IC的输出将仅吸收电流,而不提供电流。因此,您可以将16个传感器连接到芯片的16个输出,并且公共端的另一端与上拉电阻一起(您也可以在此处连接ADC)。您将一个输出拉低(导通),将另一个输出拉高(不导通)。这与标准逻辑输出相反,在标准逻辑输出中,其他15个输出将向公共点注入电流。
这些IC的输入为4位二进制,以选择16个输出之一,但它们也有一个额外的输入来启用/禁用芯片。因此,您可能具有64个集电极开路接收器阵列,它们连接到64个传感器,而传感器的另一端都共用一个上拉电阻和模数转换器。为此,您的微控制器上总共需要8个输出:四个用于获取4至16选择信号(对于所有四个芯片都是通用的),四个用于使能信号(每个芯片一个)。
编辑:3到8个解码器(也称为8中的1 = 8中的1行)似乎比4到16更可用,但是8个IC比4更杂乱。另一种可能有用的IC是八进制计数器(及其更常见的十进制计数器,可以通过将其第九个输出连接到复位线来配置为八进制计数器。)这些计数器需要一个串行脉冲才能从一个输出前进到下一个输出,因此需要的脉冲数更少微控制器上的I / O引脚比解码器IC的I / O引脚大。它们通常具有用于复位和启用的附加输入。IC也有所谓的移位寄存器,有两种类型:一种用于将串行转换为并行,另一种用于并行转换为串行。最后,有缓冲区,您可以将其放置在Rasberry Pi和棋between之间,以免Pi在过电流情况下不会被破坏。所有这些都可以在多路复用电路中使用。