51单片机矩阵键盘

2023-11-14

目录

前言

一、矩阵键盘扫描

二、LCD1602显示矩阵键盘键值

三、趣味小项目——密码锁

总结


前言


         矩阵键盘的原理很浅显易懂,不涉及任何寄存器,就是纯线路连接。

一、矩阵键盘扫描


        矩阵键盘的内部接线图如下:

        不难看出其组成就是多个独立按键彼此相连形成,在键盘中按键数量较多时,为了减少I/O口占用,通常将按键排列成矩阵的形式,采用逐行或逐列扫描就可以读出任一按键的状态。 

        普中开发板将矩阵键盘接在了P1的八个引脚上,举个例子,将P1口赋值为0xFE,也就是P1_0到P1_7分别为1111 1110,这时如果按键S1按下(注意按键消抖),将P1_7与P1_3短路,那么会检测到P1_3变为低电平,同样道理,若P1_12变为低电平,则代表S2被按下,不停扫描各个引脚的高低电平,即可得到按键的状态,扫描可分为行扫描和列扫描。

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

unsigned char MatrixKey() //该函数为有返回值函数,返回键码值用于与其他硬件交互
{
	unsigned char KeyNumber=0;
	//这里分别把P1_3、P1_2、P1_1、P1_0置0,所以是列扫描。
    //当P1_7变为低电平,则代表S1按键被按下,先延时20ms,在进行松手检测,
    //如果P1_7一直为低电平, 也就是S1一直被按下,那么程序会一直停留在while循环里,
    //直到P1_7变为1,跳出循环,再延时20ms去除抖动,给KeyNumber赋值。
	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; 
}

二、LCD1602显示矩阵键盘键值


        将LCD1602的代码模块导入工程项目中,直接就可以在主函数中引用:

#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);	//在2行1列显示键码值
		}
	}
}

三、趣味小项目——密码锁


        这个小项目硬件接线部分与上述无差,只对软件上做了些更改,比较考验初学者对条件判断语句的应用。

        首先介绍下各个按键的预定的功能,S1-S10就是键值区分别对应值 “1234567890” ,“S11”键代表确认,“S12”键代表删除,其余按键皆空置。创建一个无符号变量存放密码值,在LCD1602的2行1列用4位显示这个值,那这里就会遇到一个问题,LCD_ShowNum()函数只会显示十进制的4位数,它并不知道我们要逐个显示这4位,这样就会导致每次输入的时候前三位都是0,只有最后一位在变,那么可以用下面22、23两行代码巧妙地解析出我们想要的数值。因为每次*10都会向前推进一位,所以还要定义一个计次变量,不然就会一直向前移位,这个变量很快也会溢出,所以就加入一个判断,当键入四次值后则跳出继续向下执行。按下“S11”键,若密码变量的值与我们预设的值相等即为密码正确,可以继续扩展功能。否则,密码错误,计次清零,键入的值清零。如果按下“S12”键,则直接密码清零,键入值清零,再更新显示,即可重新回到最初的判断。

        注释写的比较详细,其他内容直接对照代码看注释吧:

#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);	//更新显示
			}
		}
	}
}

        还可以扩展一些功能哈,比如说多次输入错误后,延时一段时间才可以进行下一次输入,在屏幕上添加倒计时,或当密码输入正确后,控制继电器驱动更大功率电路,做成门锁保险柜之类。


51单片机密码锁

总结


        矩阵键盘部分就是对I/O口电平不停地进行判断,不涉及任何寄存器和复杂电路,切记任何按键都不要忘记消抖。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

51单片机矩阵键盘 的相关文章

随机推荐

  • 2021-05-23unity【OnEnable,  OnDisable,  OnDestroy】(这是三个方法函数)-(声明方法即可)(常用于设置游戏结束运行后的状态)   

    3 OnEnable OnDisable OnDestroy 这是三个方法函数 声明方法即可 常用于设置游戏结束运行后的状态 OnEnable 当对象变为可用或激活状态时 此函数被调用 注 这里的对象指的是 挂有该脚本的对象 OnDisab
  • python基于字典多线程目录枚举工具

    基于字典多线程目录枚举工具 整体思路 命令行参数获取 字典文件的读取 多线程访问 命令行参数获得 使用模块 sys getopt sys argv获取命令行执行的数据 参数获得 opt args getopt getopt sys argv
  • SQL group by和count

    group by 使用时具体看右边是要统计什么 统计什么就具体把那一列得数据给贴上去和左边对应 不使用聚合函数直接group by 分组 只截取对应分组第一行数据 group by可以通过逗号用多个字段进行分组 group by 字段1 字
  • 遇到问题之-centos安装配置hadoop超详细过程(含故障排除)

    1 集群部署介绍 1 1 Hadoop简介 201205161427003307 png Hadoop是Apache软件基金会旗下的一个开源分布式计算平台 以Hadoop分布式文件系统 HDFS Hadoop Distributed Fil
  • 个人对智能家居平台选择的思考

    本人之前开发过不少MicroPython程序 其中涉及到自动化以及局域网控制思路 也可以作为智能家居的实现方式 而NodeMCU ESPHome的方案具有方便添加硬件 容易更新程序和容量占用小的优势 本人也查看过相关教程后感觉部署ESPHo
  • 滤波器的主要参数

    一 3dB带宽定义和理解 3dB带宽指幅值等于最大值的二分之根号二倍时对应的频带宽度 幅值的平方即为功率 平方后变为1 2倍 在对数坐标中就是 3dB的位置了 也就是半功率点了 对应的带宽就是功率在减少至其一半以前的频带宽度 表示在该带宽内
  • 面试题亲身经历

    1 什么是浅拷贝和深拷贝有什么区别 1 浅拷贝只是复制了对象的引用地址 两个对象指向同一个内存地址 所以修改其中任意的值 另一个值都会随之变化 这就是浅拷贝 例 assign 2 深拷贝是将对象及值复制过来 两个对象修改其中任意的值另一个值
  • PPP协议使用同步传输技术传送比特串0110111111111100。试问经过零比特填充后变成怎样的比特串?若接收端收到的PPP帧的数据部分是0001110111110111110110,问删除发送端

    比特填充法的具体做法是 在发送端 当一串比特流尚未加上标志字段时 先用硬件扫描整个帧 只要发现5个连续1 则立即填入一个0 因此经过这种零比特填充后的数据 就可以保证不会出现6个连续1 在接收一个帧时 先找到F字段以确定帧的边界 接着再用硬
  • ADIDAS阿里纳斯励志广告语

    系列文章目录 精选优美英文短文1 Dear Basketball 亲爱的篮球 精选优美英文短文2 Here s to the Crazy Ones 致疯狂的人 我祝你不幸并痛苦 约翰 罗伯茨毕业致辞 亲爱的波特兰 CJ麦科勒姆告别信 Hi
  • 你现在是一名博主,你要写关于chatgpt的文章,有哪些独特见解,写500字

    作为一名 AI 模型 ChatGPT 的独特之处在于它能够生成高质量的文本内容 并且具有很强的语言理解能力 首先 ChatGPT 是一种基于 Transformer 架构的语言模型 它通过大量的训练数据学习了语言的知识和结构 这使得它能够生
  • 运放积分器为什么要在电容两端并联一个电阻,阻值怎么计算

    本文摘自 新概念模拟电路 对于积分电路 在实际应用中 因为存在输入失调电压 输入偏置电流 会导致会有一个持续电流流过反馈电容 使电容上的电压累积增加或者减小 最终达到最大输出电压 上图很好的解释了给电容充电的原因 为了避免这种现象 一般在电
  • LVGL V8之flex布局item反序排列

    flex布局实现 static void lv example flex 4 void lv obj t cont lv obj create lv scr act 当前活动界面上创建obj对象 lv obj set size cont 3
  • 说说SFINAE

    文章目录 SFINAE简介 SFINAE的一个例子 使用C 11进行代码简化 对于c 11代码的解说 大后天就是除夕了 牛年将过 虎年马上来了 以一篇关于C 的非常小众的文章作为牛年的结尾 若有讲的不清楚或讲错的地方欢迎大家留言指出来 为什
  • tcl加载tcom扩展包的一个实例

    函数名 readconfig 输入参数 无 返回参数 返回一个列表 proc readconfig package require tcom 创建com实例 set excel tcom ref createobj Excel Applic
  • 服务器启动显示message,DNS服务器中的message日志出现一些信息,看不懂,请大家帮我看看!!...

    DNS服务器中的message日志出现一些信息 看不懂 请大家帮我看看 2012 01 03 00 34 46 标签 服务器 信息 message 杂谈 DNS服务器中的message日志出现一些信息 看不懂 请大家帮我看看 主要是发现DN
  • flutter iOS 缺少通知权限,缺少位置权限

    App Store Connect 亲爱的开发者 我们发现了一个或多个问题与您的应用程序 hayya附近的朋友Chat Meet 1 0 3 1 最近的交付 您的交付是成功的 但您可能希望在您的下一次交付纠正以下问题 ITMS 90078
  • docker问题笔记--前端容器更新失败

    问题描述 情况是这样的 今天由于项目需要 更新了前端容器 但是重启之后发现还是旧的前端 一时间有点迷惑 我的更新方式是为了图省事 并没有用新的前端镜像去重新起一个容器 而是直接用dist文件夹内容替换前端容器中的frontend文件夹内容
  • 在vue项目中引入jssdk所遇到的各种问题

    由于在最近的项目中 需要用到扫一扫二维码签到的功能 在纯H5的页面中要实现这个是不太可能的 所以考虑用jssdk或者混合开发 由于没有微信公众号和混合开发的经验 混合开发不太现实 公司没有考虑这个 而jssdk有其他公众号平台的公司配合 所
  • 封装HashMap加入URLdecoder解码器,防注入

    其中URLDecoder decode有个好处 就是防止 sql注入 当然对其他字符无效了 当在input输入用户名时候 10001 经过后台先获取 并解码 会报错 package test import java io Unsupport
  • 51单片机矩阵键盘

    目录 前言 一 矩阵键盘扫描 二 LCD1602显示矩阵键盘键值 三 趣味小项目 密码锁 总结 前言 矩阵键盘的原理很浅显易懂 不涉及任何寄存器 就是纯线路连接 一 矩阵键盘扫描 矩阵键盘的内部接线图如下 不难看出其组成就是多个独立按键彼此