矩阵键盘采用的是矩阵的连接方式,目的是为了减少IO口的使用。
如果每一个按键都像独立按键一样专门使用一个IO口来控制,那么我们需要的IO口数量就是行×列个。
但是如果采用矩阵的连接方式,我们需要的IO口数目就会变成行+列个,矩阵的行列数越多,减小的程度就越明显。
但是按照矩阵形式排列也会出现一些不方便的结果,所以我们采用了类似之前数码管的解决方式——扫描。
但是与数码管的扫描略有不同,数码管是输出元件,所以数码管的扫描是输出扫描,我们不断循环输出不同的值,利用人眼的视觉暂留实现我们需要的操作。
而矩阵键盘是输入元件,所以我们矩阵键盘采用的扫描是输入扫描,以非常快的速度不断循环读取IO口的值,达到与正常按键相同的效果。这里还是利用了扫描速度远大于人操作的速度的原理。
那么如何实现上述操作呢?
与之前的独立按键进行比较,如果我们单独看矩阵键盘的一行或者一列,就会发现它们有着相同的结构,在此用列来进行比较(用行同理)。
首先我们需要知道51单片机的引脚上电之后默认为高电平,所以我们需要对这8个引脚进行一个初始化,即P1 = 0xFF ;这样就和独立按键的操作基本一致了。
可以发现,如果我们此时只给P13低电平,第一列就和独立按键一样了。
接下来需要做的就是判断在P13为低电平时,P14、P15、P16、P17是否为低电平。如果是,则说明此时有按键按下,接通了电路,使原来是高电平的引脚变为了低电平。
第一列扫描完后,重新初始化P1 = 0xFF ;然后给P12低电平,继续检测P14、P15、P16、P17是否为低电平。
以此类推,不断循环读取按键是否按下,就达到了随时按下任意按键都可以检测出来的效果。