五、玩51单片机之矩阵按键

一、矩阵键盘

1、矩阵键盘的介绍

如果我们像独立按键那种接法,一端连GND,另一端连接IO口,那么我们至少需要十六个IO口,但是如果我们如下图这种接法,那么我们只需要用八个IO口,减少了IO口的使用数量。

2、扫描的概念

扫描是非常好用的,因为我们的数码管在同一时刻不能显示同一数字。而用了扫描就减少了弊端(使我们在数码管上可以看到不同数字);使用的IO口更少。

例如我们的显示屏是1902*1080 的,这时我们需要2073600个像素点,如果还要显示彩色的话,那每一个像素点还需要三个RGB变量。这时还需要乘以三。

但是但我们用矩阵的方式进行扫描,这时我们只需要1902+1080个IO口,尽管还需要乘以三,但我们只需要九百个IO口,与之前相比,大大减少了IO口的使用。

3、我们来看看如何来操作矩阵键盘,在操作前我们先了解他的电路图以及如何通过矩阵的方式进行扫描的。

我们可以将矩阵键盘的第一行看成独立按键,公共端接GND,然后通过P1_3、P1_2、P1_1、P1_0口来判断S1、S2、S3、S4的是否被按下,第二、三、四行一样。

我们将想要判断的那行IO口置为0,其他口置为1(单片机IO口默认为1)。比如当我们将P1_6置0,这样我们就可以通过下面的四个IO口判断S5、S6、S7、S8是否被按下。我们通过这种方式就能逐行逐行的对矩阵按键进行扫描。

因为单片机内部线路连接的问题,我们的P1_5口又连接的步进电机(增大输出电流能力),步进电机另一端又连接了BZ口,而BZ口连接了蜂鸣器,当BZ口以一定频率高低变化,那我们的蜂鸣器就会响。所以为了避免这种情况,我们采用逐列扫描。

逐列扫描就是将我们所要扫描列的IO口置于0,然后进行扫描;如下,将P1_3置于0,来判断S1,S5、S9、S13IO口是否被按下。

补充:弱上拉,强下拉,后面有时间补充,博主我也没听懂。

4、接下来我们便来写代码来实现我们的矩阵按键了。

后面的代码我们都会进行模块化编程。

当我们写好了函数模块化后,我们想转到定义去看看如何使用,这时我们可能会出现下面的情况,这是一个软件的小BUG。

尽管点了确定但依旧没啥用,这时我们只需要点编译,保存,然后给软件关了,再打开这个程序便可以了。如下:

5、这里我们有一个便捷的方法来编写一些重复性的代码,我们只要找到模版,然后右键配置模版,将我们需要经常用到的代码放进去便行了。

接下来就开是编写代码了。

如果我们将主函数里面的if判断语句去掉又会发生什么,如果你动手试一试会发现,当我们在按下按键时,屏幕显示的却是00。那么为什么呢?

这是因为单片机一直在循环扫描,即使我们按下按键松开,屏幕显示的速度太快以至于我们看不见。所以有if语句的判断是及其重要的。

二、矩阵键盘密码锁

接下来我们实现用矩阵键盘来实现密码的输入以及判断是否正确。

先在第一行显示Password: 接着我们需要显示0~9的数。

下面的代码是实现密码的左移。

随着我们要输入密码,密码左移,但我们输入的位数超过四位后可能会出现随机数字,因为无符号整形最多存储65535个数字。所以我们用count来限制输入的位数。

接着便是我们的确认按钮了,这里我要补充一小点,我们最好是边写代码边测试,这样能更高效的找出我们是否有错误的地方。

上面的代码已经完成了确认按键,但我们想在输入4位密码且确认后可以从新输入。代码如下:

这里还有一个小细节,就是如果我们密码输入错误后,之后又输入对了,这时第一行最后会显示OKR,如果我们想要去掉R,只需在OK后面加一个空格即可。(用空格替代R即可)

最后我们完成取消键即可。

总结:从上面矩阵按键密码的实现我们可以看出在主函数中最主要的就是实现我们代码的逻辑,而一些工具类的代码我们只需要将他模块化,需要时引头文件即可。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值