【普中51单片机教程 - 4】:独立按键 & 矩阵按键

独立按键1(超详细版) 独立按键介绍及代码 阅读详情
AI摘要

博客围绕51单片机的独立按键和矩阵按键展开。介绍了机械按键原理、消抖方法(软件和硬件),给出独立按键控制指示灯亮灭的软件设计案例。还说明了引入矩阵按键可节省IO资源,以4x4矩阵键盘为例讲解行列扫描识别按键方法,并给出数码管显示矩阵按键键值的软件设计案例。

独立按键

机械按键的介绍

如下图所示,图中为独立按键,距离长的引脚为1、3脚和2、4脚,距离短的为1、2脚和3、4脚。

当按键未按下时,1、3和2、4脚为导通状态,1、2和3、4脚为断开状态,当按键按下时1、2和3、4脚才导通。
在这里插入图片描述

因为使用的按键开关属于机械的弹性开关,假设以下按键开关的连接方式如下图所示:2脚接到单片机管脚,1脚接到GND,当按键按下时,1、2脚接通,为低电平,当按键释放时,1、2脚断开,由上拉电阻将电压拉高,为高电平。

在这里插入图片描述
在这里插入图片描述

由上图我们可看到按键在按下、释放时的理想波形,但是在实际的机械按键会出现抖动的情况,也就会可能出现按下按键多次执行该按键的功能。

在这里插入图片描述

消抖的方法:

  • 软件消抖:可在按键按下时增加一个延迟,再对按键进行扫描判断(根据实际经验,抖动通常在5~10ms的一个范围)
  • 硬件消抖:可在电路中增加RC振荡电路等(RC振荡电路会有一个充放电的过程,就像相当于延迟)

硬件设计

下图为独立按键模块中的硬件设计部分,其P32、P33又是外部中断的管脚
在这里插入图片描述

软件设计

案例:通过开发板上的独立按键K1、K2、K3、K4来控制D1指示灯的亮灭。

#include <reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit KEY1 = P3^1;
sbit KEY2 = P3^0;
sbit KEY3 = P3^2;
sbit KEY4 = P3^3;

sbit LED1 = P2^0;

//定义返回的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0

void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

//按键扫描
u8 Key_scan(u8 mode) //参数model控制扫描方式:单次扫描、连续扫描
{
	static u8 key = 1;
	if (mode) key = 1; //当mode为真时,为连续扫描
	if (key==1 & (KEY1==0||KEY2==0||KEY3==0||KEY4==0)) //有按键按下时
	{
		Delay10ms(); //消抖处理
		key = 0;
		if(KEY1 == 0)
			return KEY1_PRESS;
		else if(KEY2 == 0)
			return KEY2_PRESS;
		else if(KEY3 == 0)
			return KEY3_PRESS;
		else if(KEY4 == 0)
			return KEY4_PRESS;
	}
	else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) //没有按键按下时
		key = 1;
	return KEY_UNPRESS;
}
void main()
{
	u8 key = 0;
	while(1)
	{
		key = Key_scan(0);
		if(key == KEY1_PRESS)
			LED1 = !LED1;
	}
}

矩阵按键

如果单片机需要更多的按键,若还是采用独立按键的接法,就会占用IO资源,而单片机系统的IO资源往往比较宝贵,当用到多个按键的时候,为了较少IO用到的引脚,引入了矩阵按键。

矩阵按键的介绍

以4x4的矩阵键盘为例,识别按键通常有行列扫描、线反转法等,下面只针对行列扫描的方法进行讲解。

行列扫描时,通常将某一列的IO口输出为低电平,然后判断哪一行为低电平,若有某一行为低电平即可知道是哪个按键按下。

在以下的案例中,令P13输出为低电平,即P1口为11110111=0xf7,通过判断P17、16、15、14这四行哪一行为低电平,即可判断哪个按键按下。

在这里插入图片描述

软件设计

案例:通过数码管显示矩阵按键S1-S16按下后键值0-F

#include <reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

#define KEY_MATRIX_PORT		P1

#define SMG_A_DP_PORT		P0

u8 gsmg_code[17] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 
					0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};

void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 108;
	j = 145;
	do
	{
		while (--j);
	} while (--i);
}

u8 key_matrix_ranks_scan(void)
{
	u8 key_value = 0;
	
	KEY_MATRIX_PORT = 0xf7; //第一列为低电平
	if (KEY_MATRIX_PORT != 0xf7) //有按键按下
	{
		Delay10ms();
		switch(KEY_MATRIX_PORT)
		{
			case 0x77: key_value=1; break; //S1按下时
			case 0xb7: key_value=5; break;
			case 0xd7: key_value=9; break;
			case 0xe7: key_value=13; break;
		}	
	}
	while(KEY_MATRIX_PORT!=0xf7); //等待释放,当按键按下时KEY值不等于0xf7,一直循环,当按键释放时,KEY等于0xf7,跳出循环
	
	KEY_MATRIX_PORT = 0xfb; //第二列为低电平
	if (KEY_MATRIX_PORT != 0xfb) //有按键按下
	{
		Delay10ms();
		switch(KEY_MATRIX_PORT)
		{
			case 0x7b: key_value=2; break; 
			case 0xbb: key_value=6; break;
			case 0xdb: key_value=10; break;
			case 0xeb: key_value=14; break;
		}	
	}
	while(KEY_MATRIX_PORT!=0xfb);
	
	KEY_MATRIX_PORT = 0xfd; //第三列为低电平
	if (KEY_MATRIX_PORT != 0xfd) //有按键按下
	{
		Delay10ms();
		switch(KEY_MATRIX_PORT)
		{
			case 0x7d: key_value=3; break; 
			case 0xbd: key_value=7; break;
			case 0xdd: key_value=11; break;
			case 0xed: key_value=15; break;
		}	
	}
	while(KEY_MATRIX_PORT!=0xfd);
	
	KEY_MATRIX_PORT = 0xfe; //第四列为低电平
	if (KEY_MATRIX_PORT != 0xfe) 
	{
		Delay10ms();
		switch(KEY_MATRIX_PORT)
		{
			case 0x7e: key_value=4; break; //S1按键按下时
			case 0xbe: key_value=8; break;
			case 0xde: key_value=12; break;
			case 0xee: key_value=16; break;
		}	
	}
	while(KEY_MATRIX_PORT!=0xfe);	
	
	return key_value;
}

void main()
{
	u8 key = 0;
	while(1)
	{
		key = key_matrix_ranks_scan();
		if(key!=0)
		{
			SMG_A_DP_PORT = gsmg_code[key-1];
		}
			
	}
}

在这里插入图片描述

【51单片机系列】独立按键介绍 51单片机中的独立按键模块介绍 阅读详情

相关推荐

51单片机入门——矩阵按键

文章目录1.独立按键 1.独立按键 常用的按键电路有两种形式,独立式按键和矩阵式按键,独立式按键比较简单,它们各自与独立的输入线相连接。 4 条输入线接到单片机的 IO 口上,当按键 K1 按下时,+5V 通过电阻 R1 然后再通过按键 K1 最终进入 GND 形成一条通路,那么这条线路的全部电压都加到了 R1 这个电阻上,KeyIn1 这个引脚就是个低电平。当松开按键后,线路断开,就不会有电流通过,那么 KeyIn1和+5V 就应该是等电位,是一个高电平。我们就可以通过 KeyIn1 这个 IO 口的高低

倾晨灬雨曦的博客 2万+

51单片机——独立按键实验,小白讲解,相互学习

独立按键实验

songbo1010的博客 5138

51单片机入门教程(4)——按键控制

按键输入一、独立按键1.1 独立按键的原理1.2 独立按键的仿真电路1.3 按键消抖二、矩阵键盘2.1 矩阵键盘原理2.2 矩阵键盘扫描原理矩阵键盘扫描程序 单片机与外界的信息交互主要有两大类,输入信息和输出信息。 之前的博客介绍了通过单片机控制LED灯和数码管向外界输出信息,该教程介绍单片机常用的输入设备——独立按键和矩阵键盘。 一、独立按键 1.1 独立按键的原理 独立按键一共有四个针脚,两个...

郭义臣的博客 5万+

51单片机---按键实验(含源码)

利用51单片机的独立按键模块实现按键对LED模块的控制,进而熟悉对51单片机的相关理解,加强自身动手能力;包括包括按键抖动,延时函数,移位等操作技巧。

m0_56399733的博客 7384

51单片机之矩阵按键

矩阵按键 2019年七月二十日 作用:控制电路的通断。 区别:矩阵按键为4*4即16个按键,如果都采用独立按键的解法,那么需要占用16个I/O接口,对于单片机而言是极大的浪费。 工作原理: 先见下图: 他有两种识别方式:逐行扫描、行列扫描。 (1)逐行扫描: 通俗来讲就是1、2、3、4分别输出高电平,暗示 ...

qq_44266648的博客 7236

51单片机按键检测--独立按键与矩阵键盘

按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式。我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果。51单片机的按键输入主要有两种,一种是独立按键,每个按键对应一个IO口,通过循环或者中断去检测,这种方法常用于按键个数较少得时候。如果按键的个数较多,每个按键都分配一个IO口,会占用大量的资源,所以就有了矩阵键盘。矩阵键盘是通过单片机扫描键盘的每行每列,通过行和列唯一确定按键的编号,下面对这两种方法进行介绍。 1 独立按键 Proteus仿真电路图 途中

我陪你走的博客 4531

普中51-独立按键实验

我们知道单片机的 IO 口既可作为输出也可作为输入使用,当检测按键时用 的是它的输入功能,独立按键的一端接地, 另一端与单片机的 I/O 口相连,开 始时先给该 IO 口赋一高电平,然后让单片机不断地检测该 I/O 口是否变为低 电平,当按键闭合时,即相当于该 I/O 口通过按键与地相连,变成低电平,程 序一旦检测到 I/O 口变为低电平则说明按键被按下,然后执行相应的指令。由于机械点的弹性作用,按键开关在闭合时不会马上稳定的接通,在断开时 也不会一下子断开,因而在闭合和断开的瞬间均伴随着一连串的抖动。

秃头青年的学习记录博客 1270

51单片机的自学之路(5)——独立按键和矩阵按键实验

独立按键实验 做按键的实验,首先需要知道的,就是关于按键的消抖。 一般的情况下,消抖分为两种:硬件和软件消抖。下面做实验用的是软件消抖。 软件消抖的方式:先读取按键的状态,如果在得到按键按下的讯息之后,进行延迟处理。之后在读取按键的状态,如果这时候按键还是处于按下的状态,那么说明按键已经被按下了。其中的延时程序,就是软件消抖处理。 常用的软件消抖方法: 1,先设置IO口输出为高电平,基本上因为单片机IO口有上拉电阻的缘故,所以默认IO口为高电平了。 2,读取按键IO口的输出电平状态确认是否按下:如果有IO口

gao1964han的博客 3625

51单片机之按键(独立按键&矩阵按键)

难的东西学不会是因为简单的知识没学好 基础不牢,地动山摇 按键 (1)按键的物理结构 (2)单片机引脚有两种状态(I/O)输入或者输出 (3)上拉电阻的作用。通过这个电阻把这个引脚上拉到确定的高电平,但是上拉的能量扛不住地。下拉的力量比较强,接地的力量是无穷的! (4)按键的意义:按键是一个输入设备,CPU通过按键所连接的IO引脚的电平状态可以判断我们人对按键进行了什么操作,按下还是弹起。 (5)...

Naunyang的博客 2万+

独立按键与矩阵按键

轻触按键:相当于是一种机械开关,按下时开关接通,松开时开关断开,实现原理是通过轻触按键内部的金属弹片受力弹动来实现接通和断开。在某一个系统设计中,如果需要使用很多的按键时,做成独立按键会大量占用 IO 口,因此我们引入了矩阵按键的设计。机械开关触点的断开、闭合时由于弹性作用,不会立马稳定的断开与接通,而是会产生一个轻微的抖动。根据按键抖动的波形图,我们只需要在按键按下的时候给程序一个延迟,延迟掉这段抖动的时间即可。为了防止多次检测按键或区分是按下触发程序还是抬手触发程序,我们需设计一个检测抬手的程序。

m0_73822602的博客 3646

IDEA 2023.2.3全平台安装指南:Mac/Windows/Linux一键激活(附最新补丁获取)

本文提供IDEA 2023.2.3在Mac、Windows和Linux三大平台的一键安装与激活指南,包含最新补丁获取方法。详细讲解各系统安装流程、性能调优设置及高效开发技巧,帮助开发者快速配置并提升工作效率。

weixin_28832121的博客 394

51单片机教程:按键输入、矩阵按键(按键巧用)proteus仿真+keil

深入探究IO口输入输出原理 (不想深入理解可以跳过这一部分) 一、51单片机IO口工作原理 (一)、IO口原理图 1、P0口 2、P1口 2、P2口 3、P3口 (二)P1口 可以看到的是P1口的工作原理比较简单,首先用P1口做输入输出较为好理解。 1、内部总线:就是内部P1.X位寄存器的值,比如说内部总线P1.0上电压为0V,那么对应P1.0=0;内部总线P1.0上电压为5V,那么对应P1.0=1; 2、P1.X引脚:对应单片机引脚接口 3、读锁存器:读锁存器为1,允许读锁存器。为0,不允许读锁存

mbs706的博客 2万+

AxMath行间公式转化为office公式求和符号以及编号显示问题

AxMath行间公式转化为office公式求和符号以及编号显示问题问题描述解决方法 问题描述 首先打出axmath公式,如下: 转换后的OfficeMath公式: 字体先不说,word公式字体默认cambria math且无法编辑。比较难受的一点是求和符号与后面的 ai+bi2a_i+b_i^2ai​+bi2​比例不匹配啊!正常的比例应该是: (虽然也不太正常,将就下) 解决方法 点击变换后的office公式右侧,选择更改为"显示" 可以看到,多了一些软回车符号(⬇),如果你想删除它,不要直接选中

weixin_43543177的博客 4646

【51单片机】独立按键实验和矩阵按键实验

独立按键实验和矩阵按键实验

mhyasadj的博客 3822

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

weixin_55249340的博客 3万+

Avalonia跨平台开发入门:从安装到运行第一个应用(Windows/Linux/macOS)

本文详细介绍了Avalonia跨平台开发的基础入门指南,从安装到运行第一个应用的全过程。涵盖Windows、Linux和macOS三大平台的环境配置,特别推荐使用Visual Studio进行开发,并提供常见问题的解决方案,帮助开发者快速上手Avalonia框架。

weixin_28688385的博客 542

51单片机LCD1602显示矩阵按键键值

矩阵按键原理图 矩阵按键怎么变成独立按键 方法一: 逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 方法二: 行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键...

weixin_43394725的博客 1万+

AirSim安装和地图加载

详细教程如何安装AirSim并加载地图

fegxg的博客 3033

51单片机学习记录(五)矩阵按键

文章目录1、矩阵按键的控制原理2、矩阵按键实现1、行列式法实现矩阵按键2、线翻转法实现矩阵按键 1、矩阵按键的控制原理 独立按键与单片机连接时, 每一个按键都需要单片机的一个 I/O 口, 若某单片机系统需较多按键, 如果用独立按键便会占用过多的 I/O 口资源。 单片机系统中 I/O 口资源往往比较宝贵, 当用到多个按键时为了减少 I/O 口引脚, 引入了矩阵按键。 本开发板上的矩阵按键原理图如下所示: 可以看到是将16个按键排成4行4列,前面的四行分别连接io口的每一行,后面的四行分别连接io口的

时时总结,常常分享 9609

NSGA-III相关笔记

NSGA-III目录目的区别NSGA-III的算法流程非支配排序详解归一化详解 目录 NSGA-III基于matlab的实现 参考文献 1.An Evolutionary Many-Objective Optimization Algorithm Using Reference-point Based Non-dominated Sorting Approach,Part I: Solving P...

weixin_42555400的博客 1万+

R语言中的summarise函数和mutate函数用于计算分组占比。下面是关于这两个函数的详细介绍以及相应的源代码示例:

R语言中的summarise函数和mutate函数用于计算分组占比。

CodeByte的博客 1182

【51单片机】程序实验5&6.独立按键-矩阵按键

一个按键拥有四个脚,其中①和②、③和④之间初始导通,而①和③、②和④之间只有按下按键才会导通。在下拉电阻作用下,按键所处管脚默认为高电平,当按下按键时线路接地变成低电平。在实际情况中,按键的状态切换过程存在抖动,而不是在高低电平之间瞬时、稳定地切换。软件消抖根据实际经验估计抖动时间在5~10ms,于是可以在检测到第一次低电平后延时10ms再次检测,若仍为低电平可认为按键已处于按下状态。硬件消抖在电路上并联滤波电容,利用按下按键后给电容充电的时间来滤除抖动影响。

mojin2005的博客 2026

PCL点云八叉树体素中心下采样,体素包含点索引提取

基于PCL octree实现点云八叉树计算,支持提取体素中心点进行点云下采样;根据任一点坐标,可以得到其在八叉树中的位置,输出对应体素内其余点的坐标或者索引

qq_48694523的博客 462

基于51单片机和8X8LED点阵屏(板载74HC595驱动)的普中开发板矩阵按键控制的小游戏《贪吃蛇》

51单片机 矩阵键盘按键 普中A2开发板 8X8LED点阵屏 贪吃蛇 小游戏 扫描显示 STC89C52RC

gantengsheng的博客 3557

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

51单片机:独立按键与矩阵按键控制数码管

一,独立按键注意一下几点 &amp;gt;按下的时候,电压被拉低,所以IO口要传低电平( 0x0 ) &amp;gt;按下的时候要消除抖动 ( 延时10ms ),在判断,是否还是低电平,再做业务处理 下面这段程序,就是通过一个独立按键连接到p1口,控制静态数码管的 一段 进行亮和灭的切换。 #include &amp;lt;reg52.h&amp;gt; sbit key_control = P1^0; sb...

weixin_34307464的博客 8061

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

51单片机(V51)———独立按键、4x4矩阵按键

独立按键、4x4矩阵按键一、独立按键(1)独立按键1.0(2)独立按键2.0二、4X4矩阵按键(1)所用到的位移概念:![在这里插入图片描述](https://img-blog.csdnimg.cn/20200928201835352.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2NoaW5lc2Vrb2Jl,size_16,color_FFFFF

正弦定理的博客 2080

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 【机器学习 - 10】:PCA和梯度上升法
下一篇: 【拯救大学生计划】:我做了一个QQ分组神器
街 三 仔
街 三 仔 新星创作者: python技术领域 新星创作者: python技术领域 领域专家: Python技术领域 领域专家: Python技术领域
博客等级 码龄5年 1万+粉丝 338原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

街 三 仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值