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

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

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;
		}
	}

}

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

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

相关文章

win10: 搭建本地pip镜像源

前言&#xff1a; windows下和linux下都可以搭建本地pip镜像源。操作流程上一样&#xff0c;但是细节上存在一些差异。建议在linux上搭建本地镜像&#xff0c;流程简单很多。在windows系统上&#xff0c;会在多个地方存在问题&#xff08;比如不识别.symlink文件&#xff0c;一…

【MySQL】索引特性

文章目录 一、索引的概念二、MySQL与磁盘三、索引的理解观察主键索引现象推导主键索引结构的构建索引结构可以采用的数据结构聚簇索引 VS 非聚簇索引 四、索引操作创建主键索引创建唯一索引创建普通索引创建全文索引查询索引删除索引索引创建原则 一、索引的概念 数据库表中存…

PostgreSQL | FunctionProcedure | 函数与存储过程的区别

文章目录 PostgreSQL | Function&Procedure | 函数与存储过程的区别1. 简述书面说法大白话讲 2. 函数&#xff08;Function&#xff09;2.1 定义2.2 用途2.3 执行2.4 事务处理2.5 说点例子1. 当参数都是IN类时2. 参数中出现OUT、INOUT参数时 3. 存储过程&#xff08;Proced…

【Java】工业园区高精准UWB定位系统源码

UWB (ULTRA WIDE BAND, UWB) 技术是一种无线载波通讯技术&#xff0c;它不采用正弦载波&#xff0c;而是利用纳秒级的非正弦波窄脉冲传输数据&#xff0c;因此其所占的频谱范围很宽。UWB定位系统依托在移动通信&#xff0c;雷达&#xff0c;微波电路&#xff0c;云计算与大数据…

02之Python运算符与if结构

Day02之Python运算符与if结构 一、昨日回顾 1、回顾昨天的课程内容 略 2、回顾昨天的作业 定义变量&#xff0c;c1 ‘可乐’&#xff0c;c2 ‘牛奶’&#xff0c;通过Python代码把c1内容调整为牛奶&#xff0c;c2调整为可乐。 # 1、定义两个变量 c1 可乐 c2 牛奶# 2、…

以源码为驱动:Java版工程项目管理系统平台助力工程企业迈向数字化管理的巅峰

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

[Linux] MySQL数据库的备份与恢复

一、数据库备份的分类和备份策略 1.1 数据库备份的分类 1&#xff09;物理备份 物理备份&#xff1a;对数据库操作系统的物理文件&#xff08;如数据文件、日志文件等&#xff09;的备份。 物理备份方法&#xff1a; 冷备份(脱机备份) &#xff1a;是在关闭数据库的时候进…

Text-to-SQL小白入门(十)RLHF在Text2SQL领域的探索实践

本文内容主要基于以下开源项目探索实践&#xff0c; Awesome-Text2SQL:GitHub - eosphoros-ai/Awesome-Text2SQL: Curated tutorials and resources for Large Language Models, Text2SQL, Text2DSL、Text2API、Text2Vis and more.DB-GPT-Hub&#xff1a;GitHub - eosphoros-ai…

Java 对象内存布局

在虚拟机中&#xff0c;Java对象在内存中的布局可以分为三块&#xff1a; 对象头&#xff08;Header&#xff09; &#xff1a;包含 markword 标记字段和类型指针&#xff0c;32 位上大小是 8 个字节&#xff0c;64 位 16 个字节&#xff0c;实例数据&#xff08;Instance Dat…

特殊求和(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

LeetCode206反转链表(java实现)

今天带来的题目解析是leetcode206&#xff0c;反转链表&#xff0c;我们来看下题目描述 如何实现链表的反转呢&#xff1f;我在这里提供的思路是双指针的思路。 具体的思路如下&#xff1a; 假设我们的原链表如下 首先定义一个指针pre&#xff0c;用于指向head之前的位置&am…

浮点数(float)与整型数(int)的转换

1.浮点数&#xff08;float/double&#xff09;转整型数&#xff08;int&#xff09;——向零舍入 假设定义float a1.3,b1.6,c2.0; int aa,bb,cc; 使用强制转换aa(int)a;bb(int)b;cc(int)c;结果aa1;bb1;cc2; 在处理时为了四舍五入&#xff0c;aa(int)(a0.5);bb(int)(b0.5);…

Kafka、RocketMQ、RabbitMQ消息丢失可能存在的地方,以及解决方案

这里主要对比&#xff1a;Kafka、RocketMQ、RabbitMQ 介绍一下消息生产、存储、消费三者的架构形式。 消息丢失可能存在的场景&#xff1a; 情况一&#xff1a; 生产者发送给MQ的过程消息丢失 在写消息的过程中因为网络的原因&#xff0c;还没到mq消息就丢失了&#xff1b;或…

为什么要运营海外社媒?海外云手机能发挥什么作用?

基于海外社媒在全球范围内拥有的大量流量&#xff0c;海外社媒运营成为了品牌推广、内容创作和用户互动的重要途径。本文将探讨海外社媒运营的重要性&#xff0c;并介绍海外云手机在这一过程中的卓越帮助。 海外社媒运营的重要性 首先&#xff0c;海外社媒运营有助于企业扩大品…

搭建Vue前端项目的流程

1、安装nodejs 测试安装是否成功 $ npm -v 6.14.16 $ node -v v12.22.122、全局安装npm install -g vue/cli&#xff0c;后续会使用到vue命令 $ vue --version vue/cli 5.0.8使用vue create demo_project_fe命令创建项目&#xff0c;使用箭头键来选择&#xff0c;确认使用回车…

Linux内核中断

Linux内核中断 ARM里当按下按键的时候&#xff0c;他首先会执行汇编文件start.s里面的异常向量表里面的irq,在irq里面进行一些操作。 再跳转到C的do_irq(); 进行操作&#xff1a;1&#xff09;判断中断的序号&#xff1b;2&#xff09;处理中断&#xff1b;3&#xff09;清除中…

macOS系统下载安装PyCharm社区版本的流程(详细)

第一步 进入PyCharm官网&#xff0c;链接&#xff1a;Get Your Educational Tool - JetBrains 第二步 选择下拉框&#xff0c;根据自己的电脑芯片选择下载版本&#xff08;芯片查看位置&#xff1a;设置-通用-关于本机&#xff09;然后点击Download按钮 ​​​​​​​ -- 第…

XUbuntu22.04之删除多余虚拟网卡和虚拟网桥(二百零四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

基础概念、思维习惯、知识图谱

说明&#xff1a; 刚开始写本文&#xff0c;因为本文涉及的内容会很多&#xff0c;部分内容要写清楚不容易&#xff0c;所以提前声明&#xff0c;现在只是第一阶段&#xff0c;先收集零散的内容&#xff0c;第二阶段再大刀阔斧地重构目录。 一&#xff0c;基础概念 1&#xf…

win桌面圣诞小插件分享

最终效果 文章目录 最终效果前言下载效果更多完结 前言 圣诞到了&#xff0c;最近有小伙伴问我有没有一些桌面圣诞小插件可以分享一下&#xff0c;所以我就特地去寻找了一些&#xff0c;感觉效果还不错&#xff0c;所以分享出来 下载 链接&#xff1a;https://pan.baidu.com…