‘壹’ 单片机 行列矩阵键盘
这是一种常见的4*4矩阵键盘扫描按键的方法。其原理是先把4条列线设置为低电平,然后扫描行线,如有按键被按下,必定有一条行线为低电平。再把为低电平的行线设置为低电平,然后扫描列线,如有按键被按下,必定有一条列线为低电平。
在倒数第3句,P3=x;这里的x中的值是对应行线为低电平,其他7位为高电平。x是P3和0x0f按位或,也就是高四位(行)不变,低四位(列)全置1。但key_code重新读取P3后,由于前面的操作中把高四位(行)的某一条线置为低电平,按下的键导致与该行线接触的列线必定被拉低为低电平,所以这里key_code的低四位不是1111,而是有一位是0,这样结合高四位的值就可以确定键码了。
在51单片机中需要注意,虽然向单片机的引脚输出1,但接着读回的数据完全受引脚外部电平控制。原则上读取51单片机的I/O之前必须向向对应I/O写1,而读回的数据完全决定于引脚外接电平。这意味着,即使输出信号,如果外部电平未改变,读取的数据可能仍然是之前的值,因此在读取I/O之前应确保输出高电平。
此外,为了确保准确读取按键状态,通常在扫描行线和列线时,需要快速切换电平,以避免读取错误的电平状态。例如,在设置行线为低电平后,应立即扫描对应的列线,然后再快速恢复行线为高电平,继续下一个行线的扫描。
在实际应用中,还需要注意按键的抖动问题,这可能会导致误触发。可以通过软件延时或硬件去抖动电路来解决这个问题。软件延时通常是通过增加读取按键状态之间的延时来实现,而硬件去抖动电路则是在按键两端并联一个电容和电阻,利用RC电路的充放电特性来滤除抖动。
总的来说,4*4矩阵键盘的扫描方法需要精确控制电平切换和读取时机,同时还需要考虑按键抖动的影响,以确保按键检测的准确性。
‘贰’ 单片机的独立键盘或矩阵键盘电路,必须要加电阻和电源吗我试过的,不加电阻和电源,单片机也能识别。
可以不用啊,加电阻主要是用来提高抗干扰能力,要是工作环境比较好的话完全可以不加的,但主要就是怕在单片机引脚在悬空状态下外界的干扰可能会导致单片机的误动作而加上的
‘叁’ 单片机汇编矩阵键盘实验(扫描法)
关于扫描按键的原理,可以看下面这篇文章。
本文以循序渐进的思路,引导大家思考如何用最少的IO驱动更多的按键,并依次给出5种方案原理图提供参考。在实际项目中我们经常会遇到有按键输入的需求,但有的时候为了节省资源成本,我们都会选择在不增加硬件的情况下使用最少的控制器IO驱动更多的按键,那么具体是怎么做的呢,下面我们就以用5个IO引脚为例,讲下怎么设计可以实现更多的按键?共有5种设计思路,下面依次介绍。
首先通常想到的可能是下面这样的设计:
这样我们可以先识别K01、K02、K03、K04、K05,若没有按键按下然后再和思路四的设计一样去识别其他按键。但这样存在一个问题,如果IO1配置为0,IO5读到0,那么怎么知道是K51按下还是K05按下呢,这里只需要在程序里做下判断,先判断下是不是K05按下,若不是就是K51,因为按键K01、K02、K03、K04、K05在5个IO口都为读取的情况下,就可以识别,不需要扫描识别处理,相当于这5个按键优先级高与其他按键。
总结
综合上述,5个IO口最多可以识别25个按键,思路五程序上处理比较麻烦,若实际中只按思路四设计,也可识别20个按键,那么如果有N个IO口可识别多少按键呢?这里给出如下公式:
假设有N个IO口按照思路三可以识别N*(N-1)/2个;
按照思路四可识别N*(N-1)个;
按照思路5可以识别N*(N-1)+N个。
最后再说下,如果实际设计时,还是按思路四设计好,软件也没那么麻烦。如果是你的话你会选择哪种方法呢?你还有没有其他的设计方法呢?
‘肆’ 51单片机P0口接矩阵键盘可以吗
首先说下P0口和P1、P2、P3口的区别,关于LED和键盘的
P0作为输出口,未加负载时有4V电压,但由于芯片内部对P0未接5V+电阻,所以接上负载之后电压会下降。以LED灯负载为例,接上300欧姆电阻+黄色led,P0口的电压只有2.4V,led不会亮,所以必须要加上拉电阻。
P1、P2、P3内部都有电源供电,所以加LED这种小负载时电压不会下降很多。
P0接键盘的时候是作为输入口,这时,P0内部的锁存器发挥功效,可以锁存住数据。
键盘输入电路是这样:
如果是IO——按键——地线,也就是不加上拉电阻的接法,接到P0口后,按键1次,P0口自动锁存住低电平,即使没有上拉电阻,但由于接了mos管电路(如图),松开按键后,VCC的电流不会导通到地线,所以IO口会恢复高电平,可以进行下次逻辑判断。
结论:P0口只有在用于IO驱动时才需要加上拉电阻,键盘不需要
ps:这些你可以下个仿真软件研究,proteus,它可以把keil生成的工程文件虚拟烧录到单片机中,用法很简单,和multisim一样