51单片机-矩阵键盘

51单片机---矩阵键盘(含源码、小白可入) 利用51单片机的矩阵按键模块以及LCD1602液晶屏幕显示模块,实现矩阵键盘的控制显示等;包括:电路分析、源码分享以及电子锁项目的讲解;通过此节学习熟悉51单片机的相关模块理解,加深对电路分析,扫描概念的理解,相关C语言程序的理解与学习; 阅读详情

目录

1.硬件设计

2.软件设计

2.1.矩阵键盘扫描

2.2.矩阵键盘-密码锁

3.知识点

3.1.模块化编程的应用

3.2.#include详解


1.硬件设计

矩阵键盘按键数量较多,为了减少I/O口的占用,通常将按键排列成矩阵形式,采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态

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

2.软件设计

2.1.矩阵键盘扫描

功能需求:矩阵键盘扫描,LCD1602显示键码

程序设计:首先,确定扫描方式,此处选用逐列扫描;其次,确定驱动方式,单片机的IO口的模式是一种弱上拉模式(输出0时,驱动能力较强);

MatrixKey.c文件

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

//*逐列扫描
unsigned char MatrixKey()
{
	unsigned char KeyNumber=0;
	
	P1=0xFF;//P1口全部置高电平
	P1_3=0;//P1_3低电平
	if(P1_7==0){Delay(20);while(P1_7==0);Delay(20);KeyNumber=1;}//如果P1_7也置低电平,按键1导通
	if(P1_6==0){Delay(20);while(P1_6==0);Delay(20);KeyNumber=5;}//如果P1_6也置低电平,按键5导通
	if(P1_5==0){Delay(20);while(P1_5==0);Delay(20);KeyNumber=9;}//如果P1_5也置低电平,按键9导通
	if(P1_4==0){Delay(20);while(P1_4==0);Delay(20);KeyNumber=13;}//如果P1_4也置低电平,按键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;
}

MatrixKey.h文件

#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__

unsigned char MatrixKey();

#endif

main.c文件

#include <REGX52.H>
#include"LCD1602.h"//引用LCD1602头文件
#include"MatrixKey.h"//引用MatrixKey头文件

unsigned char KeyNum;//定义一个字符KeyNum,其实就是我们想要的键码
void main()
{
	LCD_Init();
	LCD_ShowString(1,1,"MatrixKey:");//第1行,第1列,显示字符串"MatrixKey:"
	while(1)
	{
		KeyNum=MatrixKey();//将KeyNum等于我们已经定义好的矩阵键盘程序
		if(KeyNum)//如果有按键按下
		{
			LCD_ShowNum(2,1,KeyNum,2);//在第2行,第1列,显示对应的按键码
		}
	}
}

2.2.矩阵键盘-密码锁

功能需求:用矩阵键盘,做一个简易密码锁

程序设计:首先,确认所需按键,需要用到的按键1~10(密码区),11确认键,12清除键;那如何程序如何设计呢?

main.c文件

#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:");//定义字符创“Password:”
	while(1)
	{
		KeyNum=MatrixKey();
		if(KeyNum)//如果按键按下
		{
			if(KeyNum<=10)//密码区:如果S1-S10按键按下,输入密码
			{
				if(Count<4)//密码位:定义为4位密码(int整型的数值范围0-65535;如果定义6为密码会超出int范围)
				{
					Password*=10;//密码每输入一位,密码左移一位
					Password+=KeyNum%10;//取与的目的,主要是要将S10按键定义为数字0
                    Count++;//没输入一次密码,计次+1
				}
			}
			LCD_ShowNum(2,1,Password,4);//更新显示
			if(KeyNum==11)//如果按下按键S11
			{
				if(Password==1229)//如果密码是1299
				{
					LCD_ShowString(1,10,"OK ");//那LCD的第1行,第10列显示OK
					Password=0;//密码清零
					Count=0;//计次清零
					LCD_ShowNum(2,1,Password,4);//更新显示
				}
				else
				{
					LCD_ShowString(1,10,"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);更新显示
			}
		}
	}
}

3.知识点

3.1.模块化编程的应用

  • 在密码锁的代码中,主要用到的模块函数有<REGX52.H>,"LCD1602.h","MatrixKey.h";
  • 模块化编程的主要优势是,模块管理,逻辑清晰,可移植等
#include <REGX52.H>
#include"LCD1602.h"
#include"MatrixKey.h"

3.2.#include详解

  • 作用:叫做文件包含命令,用来引入对应的头文件(.h文件);#include 也是C语言预处理命令的一种。
  • 处理过程:就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。
  • 用法:主要有两种,如下:
#include <REGX52.H>//查找<系统目录>,引用系统自带的程序文件
#include"LCD1602.h"//查找"当前工作目录",应用自己编辑好的程序文件
51单片机(六):矩阵键盘的扫描 在行扫描中,逐行检测按键状态,而在列扫描中,逐列检测按键状态。在逐行逐列扫描方法中,键盘的按键布局被组织成多行和多列的矩阵。按键是接到P2口上,P2口上电默认是准双向 I / O 口,下面来简单了解一下准双向 I / O 口的电路,电路如上图所示。在某一个系统设计中,当需要使用很多按键时,做成独立按键会大量占用I / O口,因此引入了矩阵按键的设计。函数体中计算了a和b的和,并将结果存储在sum变量中,最后通过return语句返回sum的值。类似地,在逐列扫描方法中,扫描过程从第一列开始,逐列扫描每一列。 阅读详情

相关推荐

51单片机学习笔记-4矩阵键盘

读取矩阵键盘、矩阵键盘密码锁

虎慕的博客 2843

51单片机入门教程——矩阵键盘

在键盘按键中,如果键盘按键过多,为减少I/O口的占用,通常将按键排列成矩阵形。采用逐行或逐列扫描就可以判断出任意位置按键状态。

m0_66315662的博客 4481

【51单片机】矩阵键盘_51单片机4×4矩阵键盘

在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态。结构:在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。

2401_87555477的博客 3120

【51单片机】矩阵键盘

51单片机 矩阵键盘

m0_73665080的博客 4064

51单片机——矩阵键盘扫描(矩阵键盘1602显示及密码锁)

可以看到矩阵键盘是4*4的一个结构,而独立按键是2*4的结构从原理图可以看到,二者按键数量虽然不同,但I/O口数量均为8个,这也就是矩阵键盘的优势所在,大大减少了外设对I/O口的使用;独立按键:4个按键为一小组,一端接GND(低电平),另外一端连接4个I/O口,也就是说,通过给予I/O口高低电平进行按键的扫描矩阵键盘:低四位(接口1234)控制行,高四位(5678)控制列,也就是说整个按键就是一个坐标图,通过(行,列)/(列,行)坐标来进行扫描,从而判断哪个按键被按下。

m0_74225397的博客 5886

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

使用51单片机与LCD1602模块做了一个密码锁。

w736996104的博客 1万+

51单片机实现矩阵键盘密码锁

在51单片机上,使用矩阵键盘与led1602显示屏实现密码锁

weixin_54435584的博客 9136

51单片机之矩阵键盘的使用

首先据我个人理解,矩阵键盘其实和独立按键具有相似之处,独立按键把按键的公共端接在了GND上,另一端接在了IO口上,而矩阵键盘则是把一行的四个单独拿出去就是和独立按键差不多了。

2401_88049051的博客 2489

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

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

AnChenliang_1002的博客 5563

用51单片机矩阵键盘控制数码管显示数字

用51单片机矩阵键盘控制数码管显示数字 #include<reg51.h>//头文件 #define keys P1//宏定义矩阵键盘 #define smg P0//宏定义数码管 sbit SMGA=P2^2;//位定义 sbit SMGB=P2^3; sbit SMGC=P2^4; unsigned int table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f ,0x6f,0x77,0x7c,0x

基极向上的三极管的博客 1万+

51单片机矩阵键盘响应程序

51单片机矩阵键盘响应程序 #include // P0端口接LED // P0端口接数码管 // P3端口接矩阵键盘 #define LED P0 #define KEY P3 #define DIG P0 unsigned char GetKey(void); void delay10ms(void); // 独立数码管的段码表 unsigned char

xiongjianjunCSND的博客 1万+

51单片机之矩阵键盘

矩阵键盘

2302_78279100的博客 1657

51单片机矩阵键盘程序

#include<reg52.h> typedef unsigned char uchar; typedef unsigned int uint; sbit a=P1^0; uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; ...

weixin_45280176的博客 2702

proteus进行51单片机矩阵键盘仿真实验

本文通过在proteus上搭建51单片机的矩阵键盘电路并联合keil编程软件编写的源程序进行8*8矩阵键盘仿真,进而熟悉proteus仿真软件的仿真操作。 目录(一)4×4矩阵键盘原理1.逐行扫描2.行列扫描(二)8×8矩阵键盘设计1.proteus电路图设计2.程序设计3.矩阵键盘仿真效果(三)总结 (一)4×4矩阵键盘原理 1.逐行扫描 通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下;然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 2.

qq_45237293的博客 1万+

保姆级教程:STK 11.0 从下载到安装成功(附Matlab互联配置与常见问题解决)

本文提供STK 11.0的完整安装指南,包括下载、安装步骤、Matlab互联配置及常见问题解决方案。详细介绍了系统要求核查、分步安装流程、关键文件替换和许可证配置,确保用户能够顺利完成STK 11.0的部署并实现与Matlab的无缝对接。

weixin_30698297的博客 345

从零到一:OptimizePI Pre-layout PDN前仿真实战指南

本文详细介绍了如何使用OptimizePI进行电源完整性(PDN)前仿真,从软件安装配置到元器件建模、去耦电容配置及仿真参数设置,提供了实战技巧和常见问题排查指南。通过OptimizePI的Pre-layout仿真,工程师可以在PCB布局前优化电源分配网络,显著提升设计效率并降低成本。

weixin_28304023的博客 507

【51单片机入门】矩阵键盘

在嵌入式系统设计中,键盘输入是一种常见的人机交互方式。其中,矩阵键盘因其简单、方便和易于扩展的特性,被广泛应用于各种设备中。本文将介绍如何使用51单片机来实现矩阵键盘的设计,包括硬件连接、键盘扫描算法以及按键处理等内容。希望通过本文的学习,读者能够掌握矩阵键盘的基本原理和设计方法,为自己的项目提供强大的输入功能。矩阵键盘是一种常见的输入设备,它由多个按键组成,通常是以矩阵的形式排列。每个按键都有一个唯一的行和列位置,通过检测行和列的电平变化来确定按下的是哪个按键。

m0_62599305的博客 1485

ROS2理论与实践_宇树机器人Go2开发指南(文字)

本文介绍了Unitree Go2机器人ROS2开发环境的安装与配置流程。主要内容包括:1)从GitHub克隆unitree_ros2仓库;2)安装ROS2 Foxy版本依赖项;3)编译特定版本的CycloneDDS(0.10.2);4)编译unitree_go和unitree_api功能包;5)网络配置,包括设置静态IP和修改环境变量脚本setup.sh以指定网络接口。文章还提供了本地回环测试的替代方案,并建议配置完成后重启电脑。整个流程涉及ROS2环境切换、网络适配和编译安装等多个技术环节。

Li_Dongyi的博客 4205

51单片机——矩阵键盘+动态数码管

基于protues8,13,搭建51单片机最小系统连接4*4矩阵键盘(P3)和两位数码管(段选P0、位选P20\P21) 功能要求;两位数码管显示00~15,00~15与矩阵键盘对应,上电后数码管不显示,按下按键后显示对应的数字。

li_han_han的博客 3802

Unity 升级引擎版本后构建报错:script class layout is incompatible between the editor and the player

Unity升级引擎版本后,项目报错:script class layout is incompatible between the editor and the player。

学习与分享 593

ROS开发者的福音:用Anaconda虚拟环境解决Python包冲突(附完整配置流程)

本文为ROS开发者提供了使用Anaconda虚拟环境解决Python包冲突的完整方案。通过分析冲突根源,详细介绍了Miniconda安装、专用环境创建以及核心桥梁包的配置流程,并阐述了“混合环境运行”与“纯虚拟环境构建”两种实战工作流,帮助开发者实现ROS核心与特定Python库的和谐共存,从而提升开发效率和项目可维护性。

weixin_28835789的博客 338

06 51单片机之矩阵键盘

06 51单片机之矩阵键盘

汽车软件工程师 | 好奇博主 | 处女座 1511

华为流程L1-L6业务流程深度细化到可执行【附全文阅读】

该文档主要介绍了华为业务流程的深度细化及相关内容,包括流程框架、建模方法、流程模块描述、流程图建模等,旨在帮助企业构建有效的流程体系,实现战略目标。

cdfunlove的博客 4003
上一篇: 51单片机-LCD1602
下一篇: 51单片机-定时器中断
桃亭TT
博客等级 码龄5年 268粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃亭TT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值