【51单片机系列】矩阵按键介绍

本节实现的功能是:通过开发板上的矩阵键盘控制静态数码管显示对应的键值0-F。

文章目录

  • 一、矩阵按键介绍
  • 二、硬件设计
  • 三、软件设计

一、矩阵按键介绍

独立键盘与单片机连接时,每一个按键都需要单片机的一个I/O口。若某单片机系统需要较多按键,如果用独立按键便会占用过多的I/O口资源。

当用到多个按键时,为了减少I/O口引脚,引入了矩阵按键。比如4*4矩阵键盘。

对于4*4矩阵键盘,开发板上通常将16个按键排成4行4列。第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有4行4列共8根线。将这8根线连接到单片机的8个I/O口上,通过程序扫描键盘可以检测16个键。

无论是独立键盘还是矩阵键盘,单片机检测其是否被按下的依据都是一样的,即检测与该键对应的I/O口是否为低电平。独立键盘有一端固定为低电平而矩阵键盘两端都与单片机I/O口相连,在检测时需编程通过单片机I/O口送出低电平。检测方法最常用的是行列扫描和线翻转法。

  • 行列扫描法检测时,先送一列为低电平,其余几列全为高电平,此时确定列数;然后立即轮流检测一次各行是否有低电平,若检测到某一行为低电平,此时确定了行数,便可以确认当前被按下的键是哪一行哪一列的。用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平,这样即可检测完所有的按键,当有按键被按下时便可判断出按下的键是哪一个键。
  • 线翻转法检测时,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有,就记录列线值;然后再翻转,使所有列线都为低电平,检测所有行线的值。由于有按键按下,行线的值也会有变化,记录行线的值,从而就可以检测到全部按键。

矩阵按键也需要按键消抖。

二、硬件设计

实现功能:通过开发板上的矩阵键盘控制静态数码管显示对应的键值0-F。用到的硬件资源有:

  • 动态数码管
  • 4*4矩阵按键

硬件电路如下:
矩阵按键硬件设计

从上图可以看出,4*4矩阵按键引出的8根控制管脚直接连接到51单片机的P1口上。

三、软件设计

要想51单片机能够检测按键是否按下,必须通过单片机管脚来控制矩阵按键。

代码实现如下:

/*
	实现功能:使用独立按键控制指示灯的亮灭
	[2023-12-06] zoya
*/
#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;


#define GPIO_DIG P0  // 动态数码管
#define GPIO_KEY P1  // 矩阵按键

u8 keyVal;  // 记录按键位置
u8 code smg[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00};  // 共阴极数码管

// 延时函数,i=1延时10us
void delay(u16 i)
{
	while(i--);
}

// 检测矩阵按键的哪个键按下,线翻转法检测哪个按键被按下
void KeyDown()
{
	char a = 0;
	GPIO_KEY = 0x0f;  // 所有行线全部为低电平
	if(0x0f != GPIO_KEY)  // 检测是否有键被按下,如果有键被按下,GPIO_KEY不会为0x0f
	{
		delay(1000);  // 延时10ms进行消抖
		if(0x0f != GPIO_KEY)  // 再次判断是否有键被按下
		{
			// 测试列
			GPIO_KEY = 0x0f;
			// 检测列是否有低电平
			switch(GPIO_KEY)
			{
				case 0x07: keyVal = 0; break;  // 第一列的某行被按下,假设是第一行
				case 0x0b: keyVal = 1; break;  // 第二列的某行被按下,假设是第一行
				case 0x0d: keyVal = 2; break;  // 第三列的某行被按下,假设是第一行
				case 0x0e: keyVal = 3; break;  // 第四列的某行被按下,假设是第一行
			}
			
			// 测试行
			GPIO_KEY = 0xf0;
			switch(GPIO_KEY)
			{
				case 0x70: keyVal = keyVal + 0; break;  // 第一行的某列被按下
				case 0xb0: keyVal = keyVal + 4; break;  // 第二行的某列被按下
				case 0xd0: keyVal = keyVal + 8; break;  // 第三行的某列被按下
				case 0xe0: keyVal = keyVal + 12; break;  // 第四行的某列被按下
			}
			
		}
		
		while((a <50) && (GPIO_KEY != 0xF0))  // 检测按键松手检测
		{
			delay(100);
			a++;
		}
	}
}


void main()
{
	while(1)
	{
		KeyDown();
		GPIO_DIG = smg[keyVal];
	}
}

仿真结果:

矩阵按键控制动态数码管显示0-F

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速上手linux | 一文秒懂Linux各种常用命令(中)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 一、常用目录操作1.1 mkdir 新建目录操作1.2 mrdir 删除空目录1.3 pwd 显示当前所在的工作目录 二、 文件操作命…

系统架构设计师教程(五)软件工程基础知识

软件工程基础知识 5.1 软件工程5.1.1 软件工程定义5.1.2 软件过程模型5.1.3 敏捷模型敏捷开发的特点敏捷方法的核心思想主要敏捷方法简介 5.1.4 统一过程模型 (RUP)RUP的生命周期RUP中的核心概念RUP的特点 5.1.5 软件能力成熟度模型 5.2 需求工程5.2.1 需求获取需求获取的基本步…

2024第一届中国最美乡村文旅产业峰会即将召开

2024第一届中国最美乡村文旅产业峰会将于2024年7月13-14日在京召开。百年变局下的国家经济发展&#xff0c;整体产业经济的下行&#xff0c;央国企及地方龙头企业&#xff0c;均遭遇到了前所未有的发展磨砺&#xff0c;特别是三年疫情后的文旅发展&#xff0c;更面临着一种洗牌…

【MySQL】安装和配置mysql

环境&#xff1a;Centos 7 删除不需要的环境 查看是否有正在运行的服务&#xff1a; ps ajx |grep mysqlps ajx |grep mariadb切换为root用户&#xff0c; 如果存在有服务 systemctl stop mariadb.service 或者 systemctl stop mysqld查看系统下的mysql安装包并删除&#xf…

C语言数据结构-----二叉树(2)堆的深入理解及应用、链式二叉树的讲解及代码实现

前言 本篇文章讲述的内容有部分是上一节写过的。重复内容不会再进行说明&#xff0c;大家可以看上一节内容 链接: C语言数据结构-----二叉树(1)认识数、二叉树、堆及堆的代码实现 文章目录 前言1.使用堆解决TOP-K问题2.向下调整堆的时间复杂度与向上调整堆的时间复杂度对比3.堆…

智能优化算法应用:基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于树种算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.树种算法4.实验参数设定5.算法结果6.参考文献7.MA…

女人感染阴虱的表现?劲松中西医结合医院专家揭示4点

阴虱是一种常见的性传播疾病&#xff0c;由虱子寄生于阴部毛发引起。女性感染阴虱后&#xff0c;通常会有一些特定的症状和表现。了解这些症状有助于及时发现并治疗阴虱感染。 1. 瘙痒&#xff1a;阴虱叮咬阴部皮肤时会产生强烈的瘙痒感。瘙痒可能持续数天或数周&#xff0c;尤…

前端走向未来:真相还是焦虑的贩卖?

目录 一、为什么会出现“前端已死”的言论 二、你如何看待“前端已死” 三、前端技术的未来发展趋势 四、前端人&#xff0c;该如何打好这场职位突围战&#xff1f; 我的其他博客 一、为什么会出现“前端已死”的言论 近来&#xff0c;IT圈内流传着“Java 已死、前端已凉”…

宋仕强论道之华强北的硬件设施(二十三)

宋仕强论道之华强北的硬件设施&#xff08;二十三&#xff09;&#xff1a; 现在深圳市华强北&#xff08;Shenzhen Huaqiangbei&#xff09;硬件设施哪方面不足呢&#xff1f;以前华强北的“万家百货”和“女人世界”在生意最旺的时候&#xff0c;顾客要在门口排队进商场&…

Excel函数 - Filter函数六种查询用法

语法&#xff1a;filter(查询区域&#xff0c;条件&#xff0c;查不到结果返回的值) 注意条件是布尔表达式&#xff0c;这个条件为true&#xff0c;filter才返回结果&#xff0c;否则查不到结果。 一、单条件查询&#xff0c;返回多行多列记录 我们要查询“苹果”这个水果&a…

用Go汇编实现一个快速排序算法

本代码全网首发&#xff0c;使用Go plan9 windows arm64汇编&#xff0c;实现基础版快速排序算法。 未引入随机因子的快速排序的普通Go代码长这样。 func QuickSort(arr []int) {if len(arr) < 1 {return}base, l, r : arr[0], 0, len(arr)-1for i : 1; i < r; {if arr…

选择卓越的数据防泄密软件,关键评判标准揭秘!

如今数据安全环境不断遭受挑战&#xff0c;面对复杂、未知的数据泄露手段&#xff0c;使用数据防泄密软件成为当前企事业单位的最佳选择&#xff0c;而一款好的数据防泄密软件有哪些主要标准&#xff1f;迅软DSE带大家从以下几点判断。 1.稳定性&#xff1a;稳定性是产品选型最…

yml中“@project.description@“失效

pom文件中添加如下代码 <resources><resource><directory>src/main/resources</directory><filtering>true</filtering></resource> </resources> 效果如下&#xff1a; 原理&#xff1a; yml文件中类似 ${spring.applica…

SpringSecurity安全授权

目录 前言 正文 1.基本流程 2.基本用法 3.配置项 4.HttpSecurity 方式和内存认证方式 5.认证流程 6.基于数据库查询的登录验证 7.多种角色权限认证 8.自定义权限认证 总结 前言 安全对于任何系统来说都是非常重要的&#xff0c;权限的分配和管理一直都是开发者需…

ROS2 学习08 导航Nav2:简介、安装、测试效果、错误处理

1、简介 在ROS2中自动导航使用Nav2来实现。 Nav2 使用几个独立的模块化服务&#xff0c;通过 ROS 2接口&#xff08;例如动作服务器或服务&#xff09;与行为树 (BT) 通信。 Nav2 输入包括&#xff1a;TF转换、一个地图源、一个行为树 (BT) XML 文件和相关的传感器数据源; Nav…

基于javaweb教务管理系统

一、系统架构 前端&#xff1a;jsp | jquery | layui 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | maven | mysql 二、代码及数据库 三、功能介绍 01. 登录页 02. 主页 03. 系统管理-用户管理 04. 系统管理-角色管理 05. 系统管理-权限管…

《PySpark大数据分析实战》-08.宽窄依赖和阶段划分

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

express 下搞一个 websocket 长连接

安装模块 npm i express npm i express-ws 新建文件app.js 先安排源码 监听端口 7777 var express require(express) var app express() require(express-ws)(app)var port 7777 var clientObject {} app.ws(/, (client, req) > {// 连接var key req.socket.re…

运筹学经典问题(七):旅行商问题(TSP)

问题描述 给定一系列城市和每对城市之间的距离&#xff0c;求解访问每座城市一次并回到起始城市的最短回路。 数学建模 集合&#xff1a; V V V&#xff1a;城市集合 常量&#xff1a; c i j c_{ij} cij​&#xff1a;城市 i i i到城市 j j j之间距离, i ≠ j i \neq j i…

基于C++的简单BP神经网络(C++)

需求&#xff1a;在某些无网络的实验机器上&#xff0c;由于某些任务需求&#xff0c;需要拟合特定的函数&#xff0c;因此需要部署基于C开发的神经网络&#xff0c;本文在不使用外部库的情况下&#xff0c;编写简单的神经网络&#xff0c;实现简单函数的拟合。 一、简介 本文…