MCU-51:矩阵键盘

news2024/11/19 19:21:06

题目

  • 一、矩阵键盘介绍
    • 1.1 矩阵键盘
    • 1.2 扫描的概念
  • 二、编程
    • 2.1 LCD屏显示“HelloWord”
    • 2.2 矩阵键盘程序
  • 三、矩阵键盘应用

一、矩阵键盘介绍

1.1 矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式
采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态
在这里插入图片描述
在STC89C52芯片中所有的IO口都可以是输入也可以做输出,P1 P2 P3都是弱上拉,P0是开漏输出,但在开发板上已经做了外部上拉电阻和P1 P2 P3一样。IO口都是弱上拉,强下拉,所以按键扫描是可以IO口接IO的,不会发生短路的现象。

1.2 扫描的概念

数码管扫描(输出扫描)
原理:显示第1位→显示第2位→显示第3位→……,然后快速循环这个过程,最终实现所有数码管同时显示的效果

矩阵键盘扫描(输入扫描)
原理:读取第1行(列)→读取第2行(列) →读取第3行(列) → ……,然后快速循环这个过程,最终实现所有按键同时检测的效果

以上两种扫描方式的共性:节省I/O口

二、编程

2.1 LCD屏显示“HelloWord”

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

void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"HelloWord");
	while(1)
	{
		
	}

注:程序采用模块化编写,直接复制代码会有问题

2.2 矩阵键盘程序

MatrixKey.c:

#include <REGX52.H>
#include "Delay.h"
/** 
  * @brief  矩阵键盘读取按键键码
  * @param  无
  * @retval KeyNumber 按下按键的键码值
	如果按键按下不放,程序会停留在此函数(while函数中,会阻止主函数的运行),松手的一瞬间,返回按键键码,没有按键按下时,返回0
  */
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;
}

main.c

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

unsigned char KeyNum;
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"MatrixKey:");
	while(1)
	{
		KeyNum=MatrixKey();
		if(KeyNum)
		{
			LCD_ShowNum(2,1,KeyNum,2);
		}
	}
}

延时函数文件和LCD调试函数文件在这里就不展现了

三、矩阵键盘应用

矩阵密码锁
按键1-9为密码1-9号键 按键10为密码0号键 按键11为确认键 按键12为重置键

if(Password==1234) 在此行设置密码
当密码正确时 LCD显示OK
当密码错误时 LCD显示ERR

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

unsigned char KeyNum;
unsigned int PassWard,Count;
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"PassWard:");
	while(1)
	{
		KeyNum=MatrixKey();
		if(KeyNum)
		{
			if(KeyNum<=10)//如果按键S1-S10按键按下,输入密码
			{
				if(Count<4)//如果输入次数小于4
				{
				   PassWard*=10;     //密码左移一位
				   PassWard+=KeyNum%10;//获取一位密码
					 Count++;//计次加一
				}
			  LCD_ShowNum(2,1,PassWard,4);//更新显示
			}
			if(KeyNum==11)
		{
			if(PassWard==2345)//正确密码
			{
				LCD_ShowString(1,14,"OK");//显示OK
				PassWard=0;//密码清零
				Count=0;//计次清零
				LCD_ShowNum(2,1,PassWard,4);//更新显示
			}
			else
			{
				LCD_ShowString(1,14,"ERR");//显示错误
				PassWard=0;//密码清零
				Count=0;//计次清零
				LCD_ShowNum(2,1,PassWard,4);//更新显示
			}
		 }
		if(KeyNum==12)
		{
			  PassWard=0;//密码清零
				Count=0;//计次清零
				LCD_ShowNum(2,1,PassWard,4);//更新显示
		}
		}
		
	}
}

延时函数文件和LCD调试函数文件在这里就不展现了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112377.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flowable学习笔记(一):SpringBoot项目整合Flowable

1.基于k8s部署Mysql 参考&#xff1a;k8s部署mysql 我安装是去掉了卷挂载。安装过程可能出现磁盘容量不够&#xff0c;可以通过df -h查看。 镜像下载得比较慢&#xff0c;可以先用docker拉取镜像。 2.搭建SpringBoot项目 (1)搭建maven项目&#xff0c;pom.xml依赖如下&am…

一文带你深入理解【Java基础】· 网络编程(下)

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

我国农村水利水电行业项目投资、水电站建设及装机容量情况分析

一、农村水利水电行业投资情况 根据水利部数据显示&#xff0c;2020年农村水利水电累计下达投资428.63亿元&#xff08;其中中央投资214.84亿元&#xff0c;地方投资213.79亿元&#xff09;。其中&#xff0c;中央预算内投资97.75亿元&#xff0c;中央财政水利发展资金100.96亿…

【MindStudio训练营第一季】基于U-Net网络的图像分割的MindStudio实践

前情说明 本作业基于Windows版MindStudio 5.0.RC3&#xff0c;远程连接ECS服务器使用&#xff0c;ECS是基于官方分享的CANN6.0.RC1_MindX_Vision3.0.RC3镜像创建的。 基于ECS&#xff08;Ascend310&#xff09;的U-Net网络的图像分割 1. U-Net网络介绍&#xff1a; U-Net模…

第12章_数据库其它调优策略

第12章_数据库其它调优策略 1.数据库调优的措施 1.1调优的目标 尽可能节省系统资源&#xff0c;以便系统可以提供更大负荷的服务。(吞吐量更大)。合理的结构设计和参数调整&#xff0c;以提高用户操作响应的速度。(响应速度更快)减少系统的瓶颈&#xff0c;提高MySQL数据库整…

PCL 基于最小生成树(MST)获取单木骨架(粗)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 提取的过程大体上分为两个部分:生成单木MST(最小生成树)以及基于该MST获取大致的骨架结构(线条)。 具体的计算过程如下所述: 1、首先应用Delaunay三角剖分来构造初始图。Delaunay三角剖分是MST计算的基础,因…

【SQL优化】union 与 union all 的区别

先说结论&#xff1a; union all:合并查询结果 union:合并查询结果 && 去重 && 排序 &#xff08;所以 union 比union all 功能多&#xff0c;性能就会稍微差一点&#xff09; 推导过程&#xff1a; 假设有这样一张表&#xff0c;里面有4条数据 union操作…

win环境mysql版本升级到5.7过程

win环境mysql版本升级到5.7过程&#xff0c;我win电脑里mysql版本是5.0&#xff0c;版本太老了&#xff0c;也不支持和nacos集成&#xff08;nacos至少需要5.6版本的mysql&#xff09;&#xff0c;思来想去还是要升级一下自己电脑的mysql版本&#xff0c;保守点升级到5.7吧&…

Apache Hive DML语句与函数使用

Hive SQL 加载数据 之前我们加载数据是&#xff0c;创建一张表&#xff0c;将结构化文件放到hadoop对应表路径下。这样我们就将表和文件进行映射了。但是这样比较暴力&#xff0c;官方不推荐。 这样的操作是直接跳过了Hive Load加载数据 语法&#xff1a; load data [local]…

【编译原理】实验一:熟悉实验环境VSCode并完成正则表达式转换为NFA

目录 实验一 熟悉实验环境VSCode并完成正则表达式转换为NFA 一、实验目的 二、预备知识 三、实验内容 VSCode的基本使用方法 安装和启动VSCode VSCode的窗口布局 使用VSCode将项目克隆到本地磁盘 使用VSCode登录平台 查看项目中的文件 实验源代码 演示程序的执行过程 四、实验过…

我国淡水养殖虾行业现状:小龙虾一路高歌猛进 青虾产量逐渐下滑

虾是一种生活在水中的节肢动物&#xff0c;属节肢动物甲壳类&#xff0c;种类很多&#xff0c;包括南极红虾、青虾、河虾、草虾、对虾、明虾、龙虾等。按出产来源不同&#xff0c;虾分为海水虾和淡水虾两种。 虾类养殖是以经济价值较高的虾类为对象&#xff0c;进行人工饲养生产…

houdini之旋转 revolve

话不多说&#xff0c;先上效果图 一根曲线绕指定轴旋转一周形成扫描面 有两组参数一个是旋转过程设置&#xff08;revolve&#xff09;一个是旋转结果设置(detail) 一、revolve Connectivity&#xff1a;如何构建几何体 origin&#xff1a;旋转轴原点 direction&#xff1a;…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.10 圆弧、饼图

本节对应的视频讲解&#xff1a;B_站_视_频 https://www.bilibili.com/video/BV1AA411R75N 本节讲解如何绘制圆弧、饼图、弦图 1. 相关的 API 直接查看官方的帮助文档&#xff0c;可以看到有多个重载的方法 1.1 圆弧 绘制圆弧时&#xff0c;需要指定一个矩形&#xff0c;…

基于WOA优化的svm最优参数计算仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 WOA算法设计的既精妙又富有特色&#xff0c;它源于对自然界中座头鲸群体狩猎行为的模拟&#xff0c; 通过鲸鱼群体搜索、包围、追捕和攻击猎物等过程实现优时化搜索的目的。在原始的WOA中&#x…

数据挖掘期末-图注意力模型

PyGAT图注意力模型 ​  PyGAT实现的分类器&#xff1a; https://www.aliyundrive.com/s/vfK8ndntpyc 还在发烧&#xff0c;不是特别清醒&#xff0c;就简单写了写。用GAT进行关系预测&#xff0c;GAT可能是只做中间层&#xff0c;不过本来在GAT这一层就为了能懂就简化了很多…

基于双闭环PID控制器的永磁同步电机控制系统仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 永磁同步电机&#xff08;PMSM&#xff0c;permanent magnet synchronous motor&#xff09;的基本结构主要包括定子、转子以及端盖三个主要模块。其中转子磁路结构是永磁同步电机与其它电机最主…

Verilog刷题HDLBits——Exams/review2015 fsm

Verilog刷题HDLBits——Exams/review2015 fsm题目描述状态转换图代码结果题目描述 This is the fourth component in a series of five exercises that builds a complex counter out of several smaller circuits. See the final exercise for the overall design. You may …

人工智能期末复习:聚类(详细笔记)

文章目录聚类的概述常见的聚类算法原型聚类K均值聚类算法K均值聚类算法顺序前导聚类&#xff08;Sequential leader clustering&#xff09;高斯混合聚类&#xff08;KMM&#xff09;密度聚类DBSCAN聚类算法层次聚类AGNES聚类算法谱聚类聚类的评价&#xff08;轮廓系数&#xf…

深度学习—00入门 神经网络

1、深度学习简介 深度学习是机器学习的一个分支&#xff0c;简单来说就是通过人工神经网络&#xff0c;强行在业务的 输入 和 输出 之间&#xff0c;暴力耦合一个出一个数学模型。 1.1 深度学习特点 1、由于是暴力耦合出来的模型&#xff0c;自然模型可解释性很差&#xff0c…

kkfile在线文件预览部署(Linux服务器版本)

一&#xff1a;kkfile部署指南 KKfile文件预览是一款开源的文档在线预览项目。项目使用流行的spring boot搭建&#xff0c;易上手和部署&#xff0c;基本支持主流办公文档的在线预览&#xff0c;如doc,docx,Excel,pdf,txt,zip,rar,图片等等。 如果你是在windows系统中可以不用…