单片机入门-C51语言实现矩阵键盘按键检测和数码管显示
单片机入门-C51语言实现矩阵键盘按键检测和数码管显示视频教程:
视频加载中...
按键是一种常开型按钮开关,平时键的二个触点处于断开状态,按下键时它们才闭合。按键控制电路就是用来实时监视按键,当有键接下时,电路监控中的输入引脚电平发生变化,检测到这种变化后,控制电路进行按键扫描,定位按键的位置,并把相关的按键信息反馈回上一层应用中。
单片机系统在需要按键较多的场合中普遍使用这种行列式非编码键盘,或者叫矩阵键盘。矩阵按键相当于 4 组每组各 4 个独立按键,一共是 16 个按键。在使用这类键盘时主要解决以下几个问题:
①键的识别。有很多种方法,一般采用逐行扫描和逐列扫描的方式,得到行号和列号,根据键号=列号+4*行号,得到键值。
②键的抖动。按键通常有按下、松手、长按这几个状态,需要支持按下检测、松手检测、长按、连击的功能,并且需要对按键进行去抖滤波,这些方法相对复杂,一般采用延时的方法比较简单。
代码如下:
自学单片机第二十二篇:延时消抖
按键的延时消抖是初学单片机的必经之路,因为只要是机械开关所传递的信号,都会存在波动,有时这些波动是"致命"的,所以消除其影响就是一门手艺了。硬件消抖有其优点,同样的也有不方便的地方,开发成本高,操作难度大,可移植性差。软件消抖就相对较好些,新手即可操作,延时消抖,并非消抖的最终最优方法,但好在简单易懂,我们先认识消抖的方法和目的。
按键在按下和抬起时,都会出现短暂的抖动,称之为前沿抖动和后沿抖动,他们持续的时间大致在5-10毫秒,键稳定时间会在100毫秒以上,就人的操作速度来看,键稳定的时间不会低于100毫秒,因为,1秒十次的操作,估计手都受不了。除非科幻世界或武侠世界的人。
既然抖动时间基本不变,那么,我们就有这样一种方法,当按键出现第一个电位变化,假设是高电位转变成低电位,那么我们就延时一段时间,设置10毫秒,10毫秒以后,我们再次判断此时的电位状态,是否是低电位,如果是低电位,那么就认为按键按下了,如果是高电位,就认为按键是抖动。从低电位变成高电位也是一样。
我们就是用延时来,把抖动的时间空过去了,这样就不用担心抖动产生的电位频繁变化了。接下来,我们看下程序如何写。
按流程来,基本上就能写出来,程序分为两大块,一个是主函数,处理开关状态,一个是延时函数。
我们先定义一个开关,然后我又声明了一个位变量,其实这个位变量在这里可以不用,不过习惯如此,对采集来的数据我习惯让其保存在特定的变量中,这样方便后期使用,以防自己改变变量值,造成端口的电位随之改变。
主函数中,先把开关采集端口置1,这是读取数据的前提条件,然后把需要采集的io的状态转移给中间变量,接着判断此时中间变量是否为零,也就是按键是否按下,如果没有按下,那就跳出,继续赋值,接着判断,直到判断为零,进入语句中,先延时一段时间,让抖动空过去,延时结束,再判断一次,由于此时程序还没走出去,所以中间变量的值也没有实时切换,我们此时要判断按键实时状态是否为零,就需要判断端口的实际值,当key10为零,就说明按键确实处于按下状态,这就可以执行,移位指令。
需要说明,如果使用函数,在调用时,只需写出函数名即可。但是在程序最开始位置,需要声明函数,声明时,要写全,尤其是返回值的类型和变量名,不能省略。可以把函数直接复制到前方,然后加一个冒号即可。
程序看完,我们仿真一下测试下程序是否执行。
这是之前我们使用的仿真电路,直接使用就好。我没有改变工程文件,所以无需重新导入可执行文件,程序会直接读取我保存好的新的可执行文件,文件名没有改变。
这是软件的初始状态,所有端口都是高电位,我们按下P10.
按键随着按下,可以稳定的响应,我们再通过实际电路测试一下。
测试发现,我按下按键,还没松手,就已经流水般的熄灭了5个灯了,什么情况?
我们可以看程序的这里
keybuff=key10; //赋值
if(keybuff==0) //判断开关是否按下
{
delay(50); //延时一段时间
if(key10==0) //再次判断开关是否按下
{
P3=P3>>1; //P3左移一位
}
}
从这一段可以看出,只要我能满足keybuff为零,key10为零,那么程序就会在延时结束再次进入程序,如此循环,就造成了,按键按下,P3被连续执行动作。我们怎么才能让这种情况不发生呢?这就需要我们不仅检测按键按下,还需要检测按键弹起,只有按键弹起我们才允许它执行下一步,这样就能按下一次,抬起手,才会停止,保证了操作的准确。
执行流程如下:
判断按键按下》按键按下》延时》判断按键按下》按键按下》执行动作》判断按键抬起》按键抬起》结束。
我们再次测试,此时发现,按下后,不松开,按键不再连续动作,但是松开按键后,原本熄灭的小灯又点亮了,我们梳理程序,可以发现,是不存在错误的,流程也没有问题。其实这就涉及我们的硬件了,我们使用软件仿真时,这些问题都是没有的,但硬件跟仿真的区别就在这里,在单片机中,如果我们没有规定执行下一步的位置,单片机就会在流程走完后,随机进入我们无法控制的流程,这在专业中称之为跑飞。为了防止跑飞,我们一般会在结束添加循环语句,让程序停止在我们设定的位置,这样就不会有问题了。
此处我们需要连续监测按键状态,所以就让程序不断的循环判断按键即可。
再次测试,一切就按照程序执行了,动作也正常了。
这就是为什么我们之前的测试程序,都会在主函数中添加循环的作用。通过这个示例,也是告诉大家,仿真只是学习的方法,最终目的还是要在实际的硬件上进行。不然你永远不知道自己的程序能不能完成真正的功能,设计不能光纸上谈兵哦。
相关问答
能否说明独立式键盘的特点及适用场合,是如何用软件法消除按键的?朋友们好,我是电子及工控技术,我来回答这个问题。键盘作为一种输入设备,它是人机交换的重要入口。通过键盘的机械按键的断开与闭合可以向单片机输入各种命令和...