当我们的电路有很多按键时,一般会采用矩阵方式与单片机相连来减少对单片机IO的浪费,如下图方式。
这个电路的原理:
1、比如检测S13是否按下,单片机把Line4设为输出,并输出低电平,而Line3、Line2、Line1设为开路输入,或输出高电平,反正只要这三个脚不为低电平就行了。
2、设Row1、Row2、Row3、Row4为输入脚,单片机去读Row1、Row2、Row3、Row4,如果对应管脚为低,那么对应按键就被按下了,比如Row1为低电平,那么说明S13被按下;Row2为高电平,那么S14没有被按下,以此类推,就可以检测该列的按键状态。
3、检测完Line4列的按键,然后检测Line3列的按键,步骤同1。
由于按键存在抖动,一般我们要进行去抖动作,去抖方法有很多,可以自己网上查。
下面说一下这个电路存在的BUG,如果你不需要多个按键同时按下的话这个电路是没有问题的,但是如果单独一个按键按下需要一个功能,几个按键同时按下又要一个功能;比如我们键盘上面的Ctrl + S 为保存功能,Ctrl + Alt + Delet 为任务管理功能一样。
而这个电路如果有3个按键一起按下那么就有可能导致误操作,如下图:
扫描Line4列的按键时,如果S13、S9、S10同时按下时,Line4输出低电平通过S13传输到Row1读到低电平正常。图上可见,由于S9和S10同时按下,会使Row1和Row2短路,所以Row2也是低电平,由于扫描的是Line4列的按键,所以Row1对应S13、Row2对应S14、Row3对应S15、Row4对应S16、此时Row2是低电平所以会认为是S14按下了。其他列的也一样,所以大家要注意这个问题。