同学们,看一下这个原理图,又多了一个按键,而且这个设计挺巧妙,像一个阶梯。这边扫描方式,如果101输出一个低电平,其他IO变为输入模式,那么在101连接的这几个按键,某一个被按下,就能被相应的10口检测出来。同理某一个10口,其他的100,比方103去输出为0,输出为低电平,那么也能被相应的其他的两个口线,把这两个按键检测出来。
这一下,大家思路大开了是吧?5个10口能检测10个按键,老办法,在这个10口上,这5个10口,每一个10口都在独立的串一个按键,对地的按键。这样是不是一下,5个10口就能检测15个按键。这个原理也很简单,还有没有办法,能让检测的按键数量增加?来了,可能有点烧脑。
它利用了二极管的单向导电性,注意以这个二极管组成的这个轴,大家把它看成一个镜像,这边又多出来了10个按键。对于这张原理图来说,5个10口能检测20个按键。
这边简单的说一下,当101输出低电平,因为二极管的单向导电性,按下SW115,这边是低电平,那102只能是这样的通入,它能检测到SW11的变化是吧?但是如果当对称的SW11',按下,行吗?大家注意,这个到这,这个路就不通了是吧?尽管101是低电平,但是检测不出来SW11。
SW11那么能在什么时候检测出来?大家想一下,其实是这样的,当I02变成低电平,如果SW11按下,那这样时候,101就能检测出来是吧?因为差不多是这样走的电流,VCC到这,这是单向导电,所以这边被它拉成地,101能检测出来SW11',以此类推,整个20个按键,都是能用5个100,经过不断的扫描,能扫描出来的。
这是5个100,能检测出来的按键数量的极值吗?大家一定都知道我的这个办法,不是!20个按键还能给每一个I0D再串一个单独的对地的按键。
这样扫描的时候所有的I0D都先变成输入模式,来看看这5个按键最下面这一排有没有按下,如果没有再来逐一的I0D变成低电平来扫描。但这边有一个注意的地方,比方说I0D变成低电平,SW21按下。
大家怎么知道到底是S53被按下了还是SW21被按下了?程序先记录一下,假设是这两个按键不知道哪一个,立刻把I0D变成输入状态,再来马上检测一下SW53,然后就可以区分出来到底是这根线上的两个按键的某一个按键被按下。通过这样的方法,这5个I0D能检测足足25个按键。
小结一下,如果用这种方法,假设有N个I0D,在使用二极管的前提下最多能检测多少个按键?答案是N的平方。如果不使用二极管,能检测按键的数量总数是二分之N减1乘N加N。比方说刚才举的15个就是5减1是4,452除以2是10加5,一共是15个。