下面是书上习惯4X4键盘扫描电路用法
此主题相关图片如下:

上面4X4键盘扫描电路是比较常见的,发表一下个人意见:
1、ABCD组的扫描线上可以不加上拉电阻,可以使用AVR单片机的内部上拉电阻。
2、AVR单片机的I/O口为标准I/O口,可以高低电平驱动输出,键盘扫描线直接与I/O口相连存在一定的风险。
下面为建议使用4X4键盘电路用法:
此主题相关图片如下:

建议使用上面的4X4键盘接法,用电阻缓冲一下,一来可以防止键盘输出高低电平出现短路,对键盘部分过来的干扰也有好处。
上面是说了4X4键盘的硬件部分,下面再说说软件设计部分:
现在就我知道的键盘一般有两种读取方式,循环扫描法、查表法。
循环扫描法:4X4键盘分为4行和4列,CPU对每一条扫描线进行读取,然后计数得到按键值,这种方式用的比较多。
查表法:对行和列读取一次,然后通过查表得到按键值。程序很简单,建议使用这种方式。
循环扫描法在C51上应用很多,可以正常使用。但在AVR单片机上采用这种方式就不大好了,因为AVR单片机输出的高低电平都有相同驱动能力。按照上面图纸,如果S1S4同时按下的话,就会出现短路现象,原理如下图:
此主题相关图片如下:

如果使用第二张图纸的接法可以得到一减经,但错误现象还是存在。最主要的是键盘上不可以同时出现两个不同的电平,这样才不会出现短路。但这要是在循环扫描法上实现起来就话,I/O状态变换就很复杂。
如果要使用查表法的话就完全没有这种问题,如果有不同的见解请提出来一同探讨