单片机外设矩阵键盘之行列扫描识别原理与示例

news2025/1/19 3:17:28

单片机外设矩阵键盘之行列扫描识别原理与示例

1.概述

这篇文章介绍单片机通过行列扫描的方式识别矩阵键盘的按键,通过程序执行相应的操作。

2.行列扫描识别原理

2.1.独立按键识别原理

为什么需要矩阵按键
独立按键操作简单,当数量较多时候会占用单片机的IO口,限制了按键的数量,无法满足需要更多按键的场景,因此矩阵键盘就应用而生了,他的按键数量多占用的IO口却很少。

为什么介绍独立按键
为什么不直接介绍矩阵按键而是先介绍独立按键工作原理那,这是因为矩阵键盘是独立按键数量的升级,矩阵键盘工作原理并没有改变,还是独立按键的工作原理。

一个独立按键工作原理

  • 当我们将按键接到单片机上,通过按键控制LED灯的亮灭。
  • -他的工作原理是将按键的一端接到单片机IO口,另一端接到GND端
  • 当按下按键,连接按键的IO口和GND导通,高电平变为低电平。
  • 当检测到IO口为低电平,就让LED灯点亮。
  • 松开按键IO口恢复高电平,就让LED灯灭。

多个独立按键工作原理
当我们掌握了一个独立按键控制LED灯的原理后,就可以将多个独立按键用一根导线并联并接到GND,按键另一端接到单片机的每个IO口,形成一列独立按键。

  • 定义每个接到单片机IO口上的按键名称
  • 当某个按键按下去的时候,对应的IO口引脚就会与GND导通,高电平变为低电平
  • 检测低电平的引脚对应的按键,然后通过程序逻辑作出对应操作。

在这里插入图片描述

2.2.独立按键升级矩阵按键

当一列独立按键不够用的时候,可以增加多列。但是单片机的IO口是有限的,因此不能介入更多的按键。这个时候就可以采用矩阵接线方式,连接多列独立按键形成行和列的矩阵键盘。

行列扫描工作原理
例如下图中是一个4X4矩阵键盘,KEYIN1~KEYIN4为行,KEYOUT1~KEYOUT4为列。

  • 第一列行扫描:如果我们将第一列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上那么就是上面的多个独立按键组成一列独立按键场景,当按下某个按键时就会扫描第一列的1~4行按键的高低电平。
  • 第二列行扫描:将第二列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上,当按下某个按键时就会扫描第二列的1~4行按键的高低电平。
  • 第三列行扫描:将第三列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上,当按下某个按键时就会扫描第三列的1~4行按键的高低电平。
  • 第四列行扫描:将第三列接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上,当按下某个按键时就会扫描第四列的1~4行按键的高低电平。

在这里插入图片描述
行列扫描软件实现原理
了解了矩阵键盘的行列扫描工作原理后,就可以用程序实现行列扫描识别按键。

  • 第一列行扫描:将第一列KEYOUT1接到单片机引脚并设置为低电平,就可以模拟硬件电路接到GND,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下1号按键那么第一行就与第一列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了1号按键
  • 第二列行扫描:将第二列KEYOUT2接到单片机引脚并设置为低电平,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下5号按键那么第一行就与第二列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了5号按键
  • 第三列行扫描:将第三列KEYOUT3接到单片机引脚并设置为低电平,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下9号按键那么第一行就与第三列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了9号按键
  • 第四列行扫描:将第四列KEYOUT4接到单片机引脚并设置为低电平,KEYIN1~KEYIN4行接到单片机的4个IO口上设置为高电平,当按下C号按键那么第一行就与第四列接通,第一行的高电平就变为低电平,这个时候就能识别出按下了C号按键

3.行列扫描实例

根据矩阵键盘的行列扫描原理用程序来实现识别按键,并作出对应的操作。

/*
程序名:行列扫描操作矩阵键盘   
编写人:bruce     
编写时间:2023年12月
硬件支持:STC12C2052AD系列  
接口说明:    
修改日志:  
  NO.1-								
*/

#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件
// 定义LED灯
sbit LED = P3^7;
// 定义行扫描按键
sbit KEYIN1 = P1^0;
sbit KEYIN2 = P1^1;
sbit KEYIN3 = P1^2;
sbit KEYIN4 = P1^3;

//定义列扫描按键
sbit KEYOUT1 = P1^4;
sbit KEYOUT2 = P1^5;
sbit KEYOUT3 = P1^6;
sbit KEYOUT4 = P1^7;

/*
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
*/
void DELAY_MS (unsigned int a){
	unsigned int i;
	while( a-- != 0){
		for(i = 0; i < 600; i++);
	}
}


/*
作用:行列扫描方式识别矩阵键盘按键
参数:返回识别到的按键
返回:
*/
unsigned char keyScan(){
	unsigned char keyNum;
	/*
		扫描第一列行上面的按键
	*/
	KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;
	KEYOUT2,KEYOUT3,KEYOUT4 = 1;
	// 第一列设置为低电平
	KEYOUT1 = 0;
	if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){
		DELAY_MS(20);
		if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){
			if(!KEYIN1){
				keyNum = 1;
			}
			if(!KEYIN2){
				keyNum = 2;
			}
			if(!KEYIN3){
				keyNum = 3;
			}
			if(!KEYIN4){
				keyNum = 4;
			}
		}
		//等待按键松开
		while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);
	}
	
	/*
		扫描第二列行上面的按键
	*/
	KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;
	KEYOUT1,KEYOUT3,KEYOUT4 = 1;
	// 第二列设置为低电平
	KEYOUT2 = 0;
	if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){
		DELAY_MS(20);
		if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){
			if(!KEYIN1){
				keyNum = 5;
			}
			if(!KEYIN2){
				keyNum = 6;
			}
			if(!KEYIN3){
				keyNum = 7;
			}
			if(!KEYIN4){
				keyNum = 8;
			}
		}
		//等待按键松开
		while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);
	}
	
	/*
		扫描第三列行上面的按键
	*/
	KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;
	KEYOUT1,KEYOUT2,KEYOUT4 = 1;
	// 第三列设置为低电平
	KEYOUT3 = 0;
	if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){
		DELAY_MS(20);
		if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){
			if(!KEYIN1){
				keyNum = 9;
			}
			if(!KEYIN2){
				keyNum = 10;
			}
			if(!KEYIN3){
				keyNum = 11;
			}
			if(!KEYIN4){
				keyNum = 12;
			}
		}
		//等待按键松开
		while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);
	}
	
	/*
		扫描第四列行上面的按键
	*/
	KEYIN1,KEYIN2,KEYIN3,KEYIN4 = 1;
	KEYOUT1,KEYOUT2,KEYOUT3 = 1;
	// 第四列设置为低电平
	KEYOUT4 = 0;
	if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4 ){
		DELAY_MS(20);
		if(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4){
			if(!KEYIN1){
				keyNum = 13;
			}
			if(!KEYIN2){
				keyNum = 14;
			}
			if(!KEYIN3){
				keyNum = 15;
			}
			if(!KEYIN4){
				keyNum = 16;
			}
		}
		//等待按键松开
		while(!KEYIN1 || !KEYIN2 || !KEYIN3 || !KEYIN4);
	}
	return keyNum;

}

void main(){
	while(1){
		switch(keyScan()){
			case 1:
				LED = 0;
				break;
			case 2:
				LED = 1;
				break;
			default:
				LED =1;
		}
	}

}

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

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

相关文章

Flink1.17实战教程(第二篇:DataStream API)

系列文章目录 Flink1.17实战教程&#xff08;第一篇&#xff1a;概念、部署、架构&#xff09; Flink1.17实战教程&#xff08;第二篇&#xff1a;DataStream API&#xff09; Flink1.17实战教程&#xff08;第三篇&#xff1a;时间和窗口&#xff09; Flink1.17实战教程&…

MYSQL一一外键约束

概念&#xff1a;外键用来让两张表的数据之间建立联系&#xff0c;从而保证数据的一致性和完整性 建立外键&#xff1a; ①这是在建立表的时候建立外键的方法 ②这是在建立完表之后建立外键的方法&#xff1a; 删除外键&#xff1a; 现在有一张员工表&#xff08;emp&#xf…

【easy-ES使用】1.基础操作:增删改查、批量操作、分词查询、聚合处理。

easy-es、elasticsearch、分词器 与springboot 结合的代码我这里就不放了&#xff0c;我这里直接是使用代码。 基础准备&#xff1a; 创建实体类&#xff1a; Data // 索引名 IndexName("test_jc") public class TestJcES {// id注解IndexId(type IdType.CUSTOMI…

C#获取windows系统资源使用情况

1.前言 之前有一篇博客介绍如何获取Linux服务器上的资源使用情况《Java 获取服务器资源&#xff08;内存、负载、磁盘容量&#xff09;》&#xff0c;这里介绍如何通过C#获取Window系统的资源使用。 2.获取服务器资源 2.1.内存 [DllImport("kernel32.dll")][retu…

CSDN规则详解——csdn那些你不知道的事儿(点赞、评论、收藏)

文章目录 每日一句正能量前言点赞评论收藏原力等级和博客等级后记 每日一句正能量 “只有奋斗者才能成为胜利者&#xff0c;只有坚持者才能创造奇迹。” - 迈克尔乔丹 这句话来自于世界著名篮球运动员迈克尔乔丹&#xff0c;他以无与伦比的天赋和努力成为了篮球界的传奇人物。他…

产品经理如何培养思维模式和创新能力?

作为一名产品经理&#xff0c;我们需要具备一定的思维模式和创新能力&#xff0c;以应对不断变化的市场和技术环境。在本文中&#xff0c;我将分享一些培养产品经理思维模式和创新能力的方法。 一、培养市场洞察力 作为产品经理&#xff0c;我们需要深入了解市场和用户需求&a…

表单(HTML)

<!DOCTYPE html> <html><head><meta charset"utf-8"><title>个人信息</title></head><body><h1>个人信息</h1><form><fieldset><legend>基本信息</legend><label for"…

【日常聊聊】编程语言的未来:趋势、多样性、人工智能融合、教育与生态系统

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; 日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言&#xff1a; 正文 1. 编程语言的发展趋势 1.1 新语言和编程范式的涌现 1.2 影响和挑战 2. 编程语言的多样性 2.1 互操作性和可移…

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

制作gif动图软件,视频转gif动图生成器

生活在这个快节奏的时代&#xff0c;我们总是希望能够抓住那些转瞬即逝的美好。而gif动图&#xff0c;正是这样一种能够让时间静止、让美好定格的存在。从视频到gif动图&#xff0c;不仅仅是格式的转换&#xff0c;更是情感的传递与分享。 所需工具&#xff1a; 一个【媒体梦…

Fiddler工具 — 2.补充:HTTP协议介绍(一)

1、HTTP协议介绍 HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写&#xff0c;是用于从万维网(WWW:World Wide Web )服务器传输超文本&#xff08;也可以说是资源&#xff09;到本地浏览器的传送协议。 HTTP协议是基于TCP协议的应用层协议&#xff0c;它不关心…

K8S 全局架构图 —— 筑梦之路

kube-apiserver&#xff1a; Kubernetes API 服务器验证并配置 API 对象的数据&#xff0c; 这些对象包括 pods、services、replicationcontrollers 等。API 服务器为 REST 操作提供服务&#xff0c;并为集群的共享状态提供前端&#xff0c; 所有其他组件都通过该前端进行交互。…

docker学习笔记01-安装docker

1.Docker的概述 用Go语言实现的开源应用项目&#xff08;container&#xff09;&#xff1b;克服操作系统的笨重&#xff1b;快速部署&#xff1b;只隔离应用程序的运行时环境但容器之间可以共享同一个操作系统&#xff1b;Docker通过隔离机制&#xff0c;每个容器间是互相隔离…

Java可视化物联网智慧工地云平台源码支持人脸识别考勤

智慧工地是指利用云计算、大数据、物联网、移动互联网、人工智能等技术手段&#xff0c;为建筑施工现场提供智能硬件及物联网平台的解决方案&#xff0c;以实现建筑工地的实时化、可视化、多元化、智慧化和便捷化。智慧工地通过全新的工程全生命周期管理理念&#xff0c;利用物…

克魔助手:方便查看iPhone应用实时日志和奔溃日志工具

查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具&#xff0c;该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块&#xff0c;可以对苹果奔溃日志进行符号化、格式化和分析&#xff0c;极…

QML —— Slider示例(附完整源码)

示例 - 效果 实例 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {id: rootIdvisible: truewidth: 640height: 480title: qsTr("Hello World")Column{spacing: 50anchors.centerIn: paren…

无公网IP环境如何实现远程访问家里内网威联通QNAP NAS中存储的文件

文章目录 前言1. 威联通安装cpolar内网穿透2. 内网穿透2.1 创建隧道2.2 测试公网远程访问 3. 配置固定二级子域名3.1 保留二级子域名3.2 配置二级子域名 4. 使用固定二级子域名远程访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xf…

Node.js--》node环境配置及nvm和nvm-desktop安装教程

博主最近换了台新电脑&#xff0c;环境得从零开始配置&#xff0c;所以以下是博主从一台纯净机中配置环境&#xff0c;绝对的小白教程&#xff0c;大家第一次安装完全可以参考我的过程&#xff0c;闲话少说&#xff0c;直接开始&#xff01;&#xff01;&#xff01; 接下来介绍…

【五】【C语言\动态规划】删除并获得点数、粉刷房子、买卖股票的最佳时机含冷冻期,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

Linux磁盘与文件管理

目录 一、磁盘介绍 1. 磁盘数据结构 2. 磁盘的接口类型 3. 磁盘在Linux上的表现形式 二、磁盘分区与MBR 1. 分区优缺点 2. 分区方式 3. MBR分区 4. GPT分区 三、文件系统 1. 文件系统的组成 2. 默认的文件系统 3. 文件系统的作用 4. 模拟破坏文件与修复文件 4…