使用51单片机的矩阵键盘和LCD1602做一个密码锁

这篇具有很好参考价值的文章主要介绍了使用51单片机的矩阵键盘和LCD1602做一个密码锁。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录

前言

一、工具准备

工具一:51单片机

工具二:LCD1602液晶显示屏

工具三:Keil软件

二、开始操作

1.LCD1602的程序调试

2.矩阵键盘的程序调试

3.密码锁程序设计

总结


前言

51单片机是一种8位的可编程控制元件,广泛应用于各种工业生产、家电中。51单片机的厂家有很多,如Inter(英特尔)、Atmel(艾特梅尔)等公司,本次实验所使用的是宏晶公司的STC89C52RC型号的单片机,此公司的其它型号单片机还有STC90C51、STC11系列、STC15系列、STC8系列等。  

LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。更多详细介绍在此不多言,请移步百度百科:LCD1602详情

一、工具准备

工具一:51单片机

我使用的是 STC89C52型号的,其它类型的单片机都行,但是要注意其引脚的分布、I/O口类型,还有在烧录程序时注意更改单片机的型号。

使用51单片机的矩阵键盘和LCD1602做一个密码锁

工具二:LCD1602液晶显示屏

使用51单片机的矩阵键盘和LCD1602做一个密码锁

 购买单片机时,这个模块应该是赠送的,也可以单买。这里提一下LCD1602的控制指令,后面显示屏的初始化、写/读操作等需要用到。

LCD1602控制指令 

使用51单片机的矩阵键盘和LCD1602做一个密码锁

 常用的指令码有:

   0x38:设置16×2显示,5×7点阵,8位数据接口

   0x0C:设置开显示,不显示光标

   0x06:写一个字符后地址指针加1

   0x01:显示清0,数据指针清0

   0x80:LCD第一行的起始地址

   0x80+0x40:LCD第二行的起始地址

工具三:Keil软件

使用51单片机的矩阵键盘和LCD1602做一个密码锁

 Keil是一款专业实用的c语言软件开发系统,提供编译器、编译器、安装包和调试跟踪等功能。我使用的是Keil5,文末有网盘链接,也可以去官网下载:Keil5软件

使用51单片机的矩阵键盘和LCD1602做一个密码锁

二、开始操作

1.LCD1602的程序调试

 调试前先找到单片机开发板的原理图,查看显示屏的引脚。
使用51单片机的矩阵键盘和LCD1602做一个密码锁
使用51单片机的矩阵键盘和LCD1602做一个密码锁

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

函数介绍

ShowChar();

显示一个字符

ShowString( );

显示字符串

ShowNum( );

显示十进制数字

ShowSignedNum( );

显示有符号十进制数字

ShowHexNum( );

显示十六进制数字

ShowBinNum( );

显示二进制数字

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

使用51单片机的矩阵键盘和LCD1602做一个密码锁

2.矩阵键盘的程序调试

我们先来了解一下矩阵键盘的接线原理。

为了减少I/O口的占用,通常将按键排列成矩阵形式,如51单片机的4X4的矩阵键盘,用8个引脚控制16个开关按键。这样连接后可采用逐行或逐列的“扫描”方式,就可以读出任何位置按键的状态。 

例如,如果我们将引脚P1.3置为0(低电位),其他引脚置为1(高电位),当按下按键S1时,引脚P1.7就会变为0(低电位);反之亦然,如果P1.6引脚变为了0,那么我们就知道按键S5被按下了。又由于51的I/O口属于“弱提强拉”型,故这样的电位设置是可靠的。

使用51单片机的矩阵键盘和LCD1602做一个密码锁

 了解矩阵键盘的工作原理后,使用编程来实现,代码如下:

#include <reg51.h>
#include "Delay.h"
/*引脚配置*/
sbit FirLine = P1^3;
sbit ScoLine = P1^2;
sbit ThrLine = P1^1;
sbit ForLine = P1^0;
sbit FirRow = P1^7;
sbit ScoRow = P1^6;
sbit ThrRow = P1^5;
sbit ForRow = P1^4;

/**
  * @brief  矩阵键盘按键码读取
  * @param  无
  * @retval KeyNum 按下按键的键码值
	如果按下不松手,不会跳出此函数
  */
unsigned char MatrixKey()
{
	unsigned char KeyNum = 0;
	/*按列扫描矩阵键盘*/
	P1 = 0xFF;
	FirLine = 0;
	if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 1;}
	if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 5;}
	if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 9;}
	if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 13;}
	
	P1 = 0xFF;
	ScoLine = 0;
	if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 2;}
	if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 6;}
	if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 10;}
	if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 14;}
	
	P1 = 0xFF;
	ThrLine = 0;
	if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 3;}
	if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 7;}
	if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 11;}
	if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 15;}
	
	P1 = 0xFF;
	ForLine = 0;
	if(FirRow == 0){Delay(20); while(FirRow == 0); Delay(20); KeyNum = 4;}
	if(ScoRow == 0){Delay(20); while(ScoRow == 0); Delay(20); KeyNum = 8;}
	if(ThrRow == 0){Delay(20); while(ThrRow == 0); Delay(20); KeyNum = 12;}
	if(ForRow == 0){Delay(20); while(ForRow == 0); Delay(20); KeyNum = 16;}
	
	return KeyNum;
}

 其中的延时函数Delay()为:

void Delay(unsigned int xms)
{
	unsigned char i, j;
	while(xms--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

3.密码锁程序设计

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

话不多说,言归正传,进入咱们的主题。

按键功能描述: 

有效按键范围:S1~S12

S10~S9:对应数字1~9

S11:删除当前输入的数字,并向前移一位

S12:确认键

#include <string.h>
#include <regx51.h>
#include "LCD1602.h"
#include "MatrixKey.h"
#include "Delay.h"

unsigned char KeyNum = 0;
unsigned char password[] = {5,2,0,1,3,1,4}; //正确密码
void main()
{

	unsigned int i = 1, j = 0, sigl = 0;
  unsigned int In_password[6] = {0};
Outset:
	init_lcd();                   //LCD初始化
	ShowString(1,1,"PassWord");
	
	while(1)
	{
		KeyNum = MatrixKey();
		
		while(KeyNum && i <= 6)
		{
			if(KeyNum > 10) goto Other_Operation;
			else
			{
				In_password[i-1] = KeyNum % 10;
				ShowNum(2,i,In_password[i-1],1);
			}
			i++;
			KeyNum = 0;
		}
Other_Operation:
		/*每按下一次11键,删除最后一个数字*/
		if(KeyNum == 11)
		{
			ShowNum(2,i-1,0);
			In_password[i-2] = 0;
			i--;
		}
								
		/*按下确认键12,并且输入满6个数字,判断输入密码正确性*/
	  else if(KeyNum == 12)
			{
				for(j = 0; j < 6; j++)
				{
					if(In_password[i] == password[i]) sigl = 0;
					else 
					{
						sigl = 1; break;
					}
				}
				if(sigl == 1) 
				{
					ShowString(2,1,"error!");
					i = 1;goto Outset;
				}
				else ShowString(2,1,"congratualtion");
			}
	}
}

 密码正确效果图:

使用51单片机的矩阵键盘和LCD1602做一个密码锁


总结

单片机的学习是枯燥的,也是深动有趣的,愿每一位未来的嵌入工程师们都能步步攀登,学有所成!

更新网盘链接:链接:https://pan.baidu.com/s/1z1799sJuVa56NPQCYWHjAA 
提取码:kq3o文章来源地址https://www.toymoban.com/news/detail-408542.html

到了这里,关于使用51单片机的矩阵键盘和LCD1602做一个密码锁的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 51单片机入门——LCD1602

    LCD ( Liquid Crystal Display 的简称) 液晶显示器 。 LCD 的构造是在两片平行的玻璃基板当中放置液晶盒,下基板玻璃上设置TFT(薄膜晶体管),上基板玻璃上设置彩色滤光片,通过TFT上的信号与电压改变来控制液晶分子的转动方向,从而达到控制每个像素点偏振光出射与否而达

    2024年02月09日
    浏览(41)
  • 【【51单片机LCD1602模块介绍】】

    显示容量16x2 每个字符是5x7的点阵 VDD 是电源正极 4.5-5.5v VO 是对比度调节电压 RS 数据/指令 选择 1为数据0为指令 RW 读写选择1是读 0为写 E 使能 1为数据有效 下降沿执行命令 D0-D7 数据输入输出 A 背光电源正极 K 背光电源负极 LCD1602的操作流程 1.初始化: 发送0x38//八位数据接口,

    2024年02月15日
    浏览(35)
  • 51单片机LCD1602调试工具

    参考视频:江协科技51单片机 LCD1602头文件代码 LCD1602 C语言文件 LCD1602主函数文件

    2024年01月24日
    浏览(54)
  • 51单片机(五)LCD1602调试工具

    ❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。 ☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋

    2023年04月27日
    浏览(57)
  • MCU-51:单片机LCD1602详解

    LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字符,还可以有8个自定义字符 显示容量:16×2个字符,每个字符为5*7点阵 点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应

    2023年04月09日
    浏览(85)
  • 51单片机 | LCD1602 液晶显示实验

      在前面章节,我们已经学习过几种显示装置,例如静态数码管、动态数码管、 8*8LED 点阵、串口通信。使用它们可以直观显示一些字符数据,但是它们也有各种局限性,比如显示字符数据太少,硬件设计复杂、代码编写难度大等。这一章就来介绍一种非常简单且常用的显

    2023年04月11日
    浏览(60)
  • 51单片机外设系列:LCD1602 的详细编程

    前言,LCD1602是一个比较常用的单片机显示外设,下面我们从它的显示原理,来分析用51单片机编程的思路。另外结尾还提供了完成的程序代码参考。 一、LCD1602的外观、结构和基本参数 引脚功能解析: 第1引脚:GND为电源地脚。 第2引脚:VCC接5V电源正极。 第3引脚:VL为液晶显

    2024年02月05日
    浏览(43)
  • 51单片机LCD1602液晶屏显示方法

    以显示hello,world!    2022.10.17  为例。 首先把LCD1602的模块化程序添加到项目目录中,模块化方法在51单片机之程序模块化_学习笔记吧的博客-CSDN博客这里可以学习。 实验程序: LCD1602.c文件代码: LCD1602.h文件代码: 把这两个代码,分别添加到LCD1602.c 和 LCD1602.h 文件,然后添加

    2023年04月08日
    浏览(50)
  • 51单片机学习笔记-12LCD1602液晶屏

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 LCD1602(Liquid Crystal Display)液晶显示屏是一种字符型液晶显示模块,可以显示ASCII码的标准字符和其它的一些内置特殊字

    2024年02月11日
    浏览(49)
  • 【51单片机】LCD1602 液晶显示实验指导书

             来介绍一种非常简单且常用的显示装置——LCD1602 液晶显示器,使用它可以显示更多的字符数字。这将有助于我们清晰的观察程序的运行结果,更加方便我们的后续调试和开发。         我们的开发板上集成了一个 LCD1602 液晶显示器接口,将LCD1602 液晶对应插

    2024年02月01日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包