51单片机(六)矩阵键盘和矩阵键盘密码锁

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

❤️ 专栏简介:本专栏记录了从零学习单片机的过程,其中包括51单片机和STM32单片机两部分;建议先学习51单片机,其是STM32等高级单片机的基础;这样再学习STM32时才能融会贯通。
☀️ 专栏适用人群 :适用于想要从零基础开始学习入门单片机,且有一定C语言基础的的童鞋。
🌙专栏目标:实现从零基础入门51单片机和STM32单片机,力求在玩好单片机的同时,能够了解一些计算机的基本概念,了解电路及其元器件的基本理论等。

⭐️ 专栏主要内容: 主要学习51单片机的功能、各个模块、单片机的外设、驱动等,最终玩好单片机和单片机的外设,全程手敲代码,实现我们所要实现的功能。
🌴 专栏说明 :如果文章知识点有错误的地方,欢迎大家随时在文章下面评论,我会第一时间改正。让我们一起学习,一起进步。
💑专栏主页:http://t.csdn.cn/HCD8v

本学习过程参考:https://space.bilibili.com/383400717

单片机安装软件、各种资料以及源码的路径:
https://pan.baidu.com/s/1vDTN2o8ffvczzNQGfyjHng
提取码:gdzf

本节主要介绍LCD1602调试工具,用于对调试代码进行输出显示,方便我们对开发过程中代码的调试工作。本文会提供LCD1602的使用方法、驱动代码、以及演示LCD1602调试过程。

一、矩阵键盘介绍和本节目标

1.1 矩阵键盘介绍

1.1.1 矩阵键盘概念

矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵

相较于独立按键,矩阵键盘可以减少i/o口的占用。

独立按键是每个按键都占用一个i/o口;而矩阵键盘是利用四行四列达到16个键盘占用8个i/o口的目的;减少了i/o口的占用。有点类似于利用坐标系,用行号和列号来定位具体的键盘。即采用逐行或逐列的“扫描”,就可以独处任何位置按键的状态。

什么是扫描呢?

矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵

1.1.2 矩阵键盘原理

矩阵键盘的原理图有下图所示,左边是独立按键的原理图,右边是矩阵键盘的原理图,放在一起比较更容易理解。
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵

1.1.2.1扫描过程:

独立按键是将四个按键公共的一端都接在GND即低电平上,另一端连接在i/o口上;而独立按键呢,是每一行连接到一个公共的i/o上,每一列也连接到一个公共的i/o口上;
我们可以假设,矩阵按键第一行的一端都接在GND上,另一端接四列的i/o口,那么此时就变成和独立按键一模一样,如下图所示:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
此时就成了按行扫描的过程,因为一端已经接了GND即低电平,那么此时如果检测到P13=0,说明是S1按下了;如果是P12=0,说明是S2按下了;如果是P11=0,说明是S3按下了;如果是P10=0,说明是S4按下了;此时第一行就扫描结束了,同时也得到了S1-S4 4个按键的状态。

如果想知道为什么公共端设置为0,然后检测另一端是否为0,来判断是否按下按键,请看第1.1.2.2节的介绍。

然后就可以判断第二行了,判断第二行时,将第一行的公共端(也就是P17口)设置为1;第二行的公共端(也就是P16口)设置为0;第三行的公共端(也就是P15)设置为1;第四行的公共端(也就是P14)设置为1;总结一下就是扫描哪一行,哪一行的公共端给0,其他行的公共端给1;然后判断P13-P10的值,如果P13=0,说明是S5按下了;如果是P12=0,说明是S6按下了;如果是P11=0,说明是S7按下了;如果是P10=0,说明是S8按下了;此时第二行就扫描结束了,同时也得到了S5-S8 4个按键的状态。如下图:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
同理,如果扫描第三行时,将第一行的公共端(也就是P17口)设置为1;第二行的公共端(也就是P16口)设置为1;第三行的公共端(也就是P15)设置为0;第四行的公共端(也就是P14)设置为1;总结一下就是扫描哪一行,哪一行的公共端给0,其他行的公共端给1;然后判断P13-P10的值,如果P13=0,说明是S9按下了;如果是P12=0,说明是S10按下了;如果是P11=0,说明是S11按下了;如果是P10=0,说明是S12按下了;此时第三行就扫描结束了,同时也得到了S9-S11 4个按键的状态。如下图:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵

第四行同理,这四行全都扫描完一遍后,16个按键的状态也就都得到了。

按列扫描也是同样的道理,即将P13-P12口赋值0和1,然后分别读取P17-P14,从而获得16个按键的状态。

由于按行扫描时,P15口会反复的给0和给1,而P15口又连接着蜂鸣器,所以如果按行扫描,就会导致蜂鸣器一直响,且无法关掉,这是由引脚和外设的冲突引起的,无法避免;所以建议使用按列臊面来获得矩阵键盘的状态。

补充一个知识点,为什么在扫描具体的某一行时,要使其公共端赋值为低电平0,另外的三个行的公共端赋值为高电平1呢?这就涉及到了单片机i/o口的弱上拉模式。

1.1.2.2 单片机i/o口弱上拉模式

i/o口的弱上拉模式又叫准双向口(可以去看51单片机入门教程资料\课件及程序源码\相关资料\STC89C52.pdf中的第4.1.1节:准双向口输出配置);i/o口即iniput/output,既可以输入又可以输出。那i/o是如何达到输出和输入呢?

举个例子,如果现在有两个i/o口,A口是高电平1,B口是低电平0,将A和B直接连接在一起,有同学说这不就短路了嘛,确实像是短路,但是没有问题;就是因为单片机是弱上拉模式,即单片机的上拉能力是弱的;也就是说高电平的驱动能力是有限的,而低电平0的驱动能力是很强的,也可以称为弱上拉,强下拉

更加详细的原理解释,请参考视频(https://www.bilibili.com/video/BV1Mb411e7re?p=15&vd_source=e2638d12685eef84cda913d9d67be0a9)的17分30秒

总结下来一句话,弱上拉强下拉就是1弱0强;也就是当低电平0和高电平1同时出现时,表现的是低电平0

矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
所以这里再解释一遍扫描的原理:
当第一行的公共端(P17)接了低电平0,那么S1的另一端(P13)在上电时默认是高电平1,所以当S1按键未按下时,读取P13的状态得到的是高电平1
;当S1按下时,P17和P13连接在了一起,P17是低电平,而P13在连接的一瞬间,由于弱上拉强下拉原理(1弱0强),P13也就瞬间从高电平1变成了低电平0;所以,当检测到P13是0时,也就说明S1按下了(因为S1不按下,P13检测到的值会是1)。

1.2 本节目标

目标1:读取矩阵键盘每次按下的数值,并将该数值显示在LCD1602上;
例如,当按下第一个矩阵按键S1时,LCD1602显示01;当按下第二个矩阵按键S2时,LCD1602显示02;依次类推,如下图所示:
当按下S1时:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
当按下S2时:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
依次类推。

目标2:利用矩阵键盘实现密码锁

密码锁具体的过程如下,当上电后,该密码锁在LCD1602上显示初始值Password:0000,
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵

然后当我们按下S1按键时,显示数字1,如下:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
接着我们按下S2时,显示数字2,如下:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
接着我们按下S3,显示数字3,如下:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
最后我们按下S4,显示数字4,如下:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
最终的结果是我们输入了密码1234,(说明:S1-S9对应着数字1-9,S10表示数字0,S11表示“确认”,S12表示取消),然后按下S11确认,结果显示ERR,表示密码错误,并将数字清零,如下:
矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵
因为我们设置的正确密码是2345,所以输入2345后,结果显示OK,表示密码正确,如下:

矩阵键盘密码锁,51单片机和STM32单片机入门,单片机,51单片机,矩阵

二、读取并显示矩阵键盘按键

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\6-1 矩阵键盘
具体代码:

#include <REGX52.H>
#include "Delay.h"		//包含Delay头文件
#include "LCD1602.h"	//包含LCD1602头文件
#include "MatrixKey.h"	//包含矩阵键盘头文件

unsigned char KeyNum;

void main()
{
	LCD_Init();							//LCD初始化
	LCD_ShowString(1,1,"MatrixKey:");	//LCD显示字符串
	while(1)
	{
		KeyNum=MatrixKey();				//获取矩阵键盘键码
		if(KeyNum)						//如果有按键按下
		{
			LCD_ShowNum(2,1,KeyNum,2);	//LCD显示键码
		}
	}
}

代码解释:

该代码中包含的Delay.hLCD1602.h分别用于延时以及LCD1602的显示,在前面已经进行详细的介绍。

MatrixKey.h是矩阵键盘头文件,里面包含了MatrixKey接口,具体代码如下:

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__

unsigned char MatrixKey();

#endif

MatrixKey接口的实现在MatrixKey.c文件中,如下:

#include <REGX52.H>
#include "Delay.h"

/**
  * @brief  矩阵键盘读取按键键码
  * @param  无
  * @retval KeyNumber 按下按键的键码值
			如果按键按下不放,程序会停留在此函数,松手的一瞬间,返回按键键码,没有按键按下时,返回0
			整个函数实现的过程就是对16个矩阵按键扫描了一遍
  */
unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;
	P1_3=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}
	
	P1=0xFF;
	P1_2=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=2;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=6;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=10;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=14;}
	
	P1=0xFF;
	P1_1=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=3;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=7;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=11;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=15;}
	
	P1=0xFF;
	P1_0=0;
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=4;}
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=8;}
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=12;}
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}

该接口其实现的功能就是将矩阵键盘的16个按键扫描了一遍,返回按下的按键的键码;

最终实现的结果就是按下某个按键,其表示的键码会显示在LCD1602上,即本节的目标1.

三、矩阵键盘密码锁

代码路径:51单片机入门教程资料\课件及程序源码\程序源码\KeilProject\6-2 矩阵键盘密码锁

具体代码:

#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "MatrixKey.h"

unsigned char KeyNum;
unsigned int Password,Count;

void main()
{
	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
					Password=0;		//密码清零
					Count=0;		//计次清零
					LCD_ShowNum(2,1,Password,4);	//更新显示
				}
				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);	//更新显示
			}
		}
	}
}

最终实现的结果就是本节的目标2。文章来源地址https://www.toymoban.com/news/detail-763136.html

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

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

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

相关文章

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

    文章目录 前言 一、工具准备 工具一:51单片机 工具二:LCD1602液晶显示屏 工具三:Keil软件 二、开始操作 1.LCD1602的程序调试 2.矩阵键盘的程序调试 3.密码锁程序设计 总结 51单片机是一种8位的可编程控制元件,广泛应用于各种工业生产、家电中。51单片机的厂家有很多,如

    2023年04月09日
    浏览(32)
  • 基于51单片机的简易6位密码锁(数码管 led 矩阵)

      本文章是基于51单片机的简易密码锁,无掉电保护,所以没有用到I^C总线协议,仅用到数码管显示,矩阵键盘扫描,led显示。   本例程主要实现功能为:定义一个六位数的初始密码,用矩阵输入,输入正确后led被点亮,错误不点亮;摁下任意一个按键蜂鸣器发出声音,松下

    2024年02月11日
    浏览(28)
  • 51单片机-电子密码锁

    实物演示效果: https://www.bilibili.com/video/BV1xh4y1K7uV/?vd_source=6ff7cd03af95cd504b60511ef9373a1d 电子密码锁的主要功能 1.按键设置6位密码,输入密码若密码正确,则锁打开。显示open! 2.密码可以自己修改(6位密码),必须是锁打开时才能改密。为防止误操作,修改密码得输入两次。

    2024年01月17日
    浏览(33)
  • 51单片机“密码锁”代码详解

    注:此代码一经过验证,读者不必怀疑其正确性,如果烧录进去没有反应,请自行检查引脚端口配置,以及仔细分析代码实现原理。倘若能静下心来分析代码,一定能受益匪浅。 废话不多说,,直接上代码。如有问题,请下方评论并私信我,收到后一定及时回复!     功能

    2024年02月08日
    浏览(41)
  • 51单片机简易电子密码锁

    由于作业需求,在昨天天晚上写了一个通过lcd1602,i2c,eeprom,按键,实现的可以设置密码的简易电子锁,    首先点击k15(回车键)进入  进入后可以点击0-9按键输入6位密码,错误则显示error,5s后重新显示密码输入页面,密码正确则进入。    进入后可以点击Esc键设置密码,进入设

    2024年02月02日
    浏览(36)
  • 51单片机制作简易密码锁

    51单片机期末考试设计题目 设计要求: 设计具有16个按键和1个数码管显示的密码锁,具体要求: 输入一位密码(为0~9,A~F之间的数字),密码输入正确显示“F”并将锁打开;否则显示“E”,继续保持锁定状态。 基本要求: 密码锁的基本功能如下:16个按键,分别代表数

    2024年02月11日
    浏览(38)
  • 基于51单片机的电子密码锁

    主要功能: 1、6位密码开锁 可以修改用户密码和管理员密码 断电记忆 3次错误报警锁住键盘

    2024年02月11日
    浏览(35)
  • 基于51单片机的密码锁设计

    电子密码锁设计,以AT89C51为主控,晶振电路和复位电路共同组成最小系统,使得单片机可以正常运行。矩阵按键作为输入模块,输入密码,LCD1602作为显示设备,显示输入的密码和提示语句,AT24C02作为EEPROM存储器,使用LED模拟“锁”,表示锁的开启和关闭状态。系统掉电后,

    2024年02月11日
    浏览(48)
  • C51单片机密码锁课程设计

    提示:文章写完后,目录可以自动加粗样式生成,如何生成可参考右边的帮助文档 微机原理及单片机应用技术的课程设计,C51设计一个密码锁; 要求:键盘上有0-9个数字按键,功能键:确认和取消等,可设置复合键。密码的位数及密码可以任意设定,,当输入数字和设置的密

    2023年04月10日
    浏览(36)
  • 基于51单片机的电子密码锁设计

    一.硬件方案         本系统由STC89C52单片机、4*4矩阵键盘,蜂鸣器,复位电路和晶振电路、继电器等组成,4*4键盘主要用于密码的输入和修改,蜂鸣器报警,复位电路和晶振电路与STC89C52单片机组成单片机最小系统。它具有设置、修改6位用户密码、输错报警、密码错误报

    2024年02月16日
    浏览(35)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包