51矩阵键盘密码锁


木易
原创
发布时间: 2025-06-13 15:19:53 | 阅读数 0收藏数 0评论数 0
封面
51单片机是一种8位的可编程控制元件,广泛应用于各种工业生产、家电中。 LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。

准备工作:

材料:

材料名称
数量
备注
adf
asdf
asdf
1

工具准备

  1. 51单片机
  2. 我使用的是 STC89C52型号的,其它类型的单片机都行,但是要注意其引脚的分布、I/O口类型,还有在烧录程序时注意更改单片机的型号。
  3. LCD1602液晶显示屏
  4. 购买单片机时,这个模块应该是赠送的,也可以单买。这里提一下LCD1602的控制指令,后面显示屏的初始化、写/读操作等需要用到。
2

LCD1602的使用代码

由于调试的代码过长,所以放入附件里了,有需要的可参考。这里面的几个调试函数说明一下:

函数介绍


ShowSignedNum();

显示有符号十进制数字


ShowHexNum();

显示十六进制数字


ShowBinNum();

显示二进制数字


ShowChar();

显示字符


ShowString();

显示字符串


ShowNum();

显示数字


调试完后可以验证一下程序,调试中LED和数码管可能会乱闪,这是由于引脚冲突造成的。

H
LCD1602.h
655B
C
LCD1602.c
4.95KB
3

矩阵键盘原理及实现

当我们设计一个矩阵键盘以减少对微控制器输入/输出(I/O)端口的需求时,可以使用一种有效的方法来管理多个按键。以51系列单片机为例,如果我们想要连接一个4x4的矩阵键盘,只需要使用8个I/O端口来控制16个按键。这是通过创建一个由行和列组成的网格实现的,在这个网格中,每个按键位于行线和列线的交叉点上。

具体来说,矩阵键盘的工作原理如下:

- 行线和列线分别连接到单片机的I/O端口上,形成一个网格。

- 当没有按键被按下时,行线和列线之间是相互隔离的。

- 当一个按键被按下时,它会短接一个行线和一个列线,从而改变该行和列之间的电气状态。

例如,如果我们把行线之一(比如P1.3)设为低电平(0),而其他的行线设为高电平(1),那么当位于P1.3行上的任何一个按键被按下时,与之相连的列线电平将会从高电平变成低电平。通过检测哪一行被设为了低电平以及哪一列的电平发生了变化,可以确定哪个按键被按下了。

例如:

- 如果我们把行线P1.3设置为低电平(0),其他行线保持高电平(1),并且检测到列线P1.7也变成了低电平(0),则说明位于P1.3行和P1.7列交叉点处的按键S1被按下了。

- 同样地,如果发现列线P1.6变成了低电平(0),那么我们可以判断位于P1.6列对应的行(假设此时行被设置为低电平的那一行为P1.0)上的按键S5被按下了。

因为51系列单片机的I/O端口具有内部上拉电阻特性(或称为“弱上拉强下拉”),即在未被设置为输出时,默认为高阻态,当作为输入时,内部有一个较弱的上拉电阻拉高电平。因此,在这种配置下,当没有按键被按下时,所有的列线都会保持高电平状态。当按键被按下时,相应的行线和列线之间的连接会使该列线变为低电平,这种电位的变化是可以被可靠检测的。

4

代码实现

完成LCD1602液晶显示屏和矩阵键盘的调试之后,就可以将这两个模块合在一起开发新的内容了,密码锁只是其中的一个小应用而已,你还可以使用这两个工具做更多好玩的内容,做一个简易的计算器?做一个实时日历放在实验室?还可以用来显示其他模块的数据。

#include <REGX52.H>
#include "LCD1602.h" // 封装LCD1602显示功能
#include "MatrixKey.h" // 封装矩阵键盘按键功能

unsigned char KeyNum;
unsigned int Password,Count;

void main()
{
// 初始化LCD1602
LCD_Init();
// 第一行展示内容
LCD_ShowString(1,1,"Password:");
while(1)
{
// 矩阵键盘按下返回按键位置数字
KeyNum=MatrixKey();
if(KeyNum)
{
if(KeyNum<=10) //如果S1~S10按键按下,输入密码
{
if(Count<4) //如果输入次数小于4
{
Password*=10; //密码左移一位
Password+=KeyNum%10; //获取一位密码
Count++; //计次加一
}
LCD_ShowNum(2,1,Password,4); //更新显示
}
if(KeyNum==11) //如果S11按键按下,确认
{
//如果密码等于正确密码
if(Password==2345) LCD_ShowString(1,14,"OK "); //显示OK
else LCD_ShowString(1,14,"ERR"); //显示ERR
Password=0; //密码清零
Count=0; //计次清零
LCD_ShowNum(2,1,Password,4); //更新显示
}
if(KeyNum==12) //如果S12按键按下,取消
{
Password=0; //密码清零
Count=0; //计次清零
LCD_ShowNum(2,1,Password,4); //更新显示
}
}
}
}

H
LCD1602.h
655B
C
LCD1602.c
4.95KB
H
MatrixKey.h
90B
C
MatrixKey.c
1.46KB
H
Delay.h
85B
C
Delay.c
153B
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载