51单片机嵌入式开发:5、按键、矩阵按键操作及protues仿真

news2024/11/15 17:17:02

按键、矩阵按键操作及protues仿真

  • 1 按键介绍
    • 1.1 按键种类
    • 1.2 按键应用场景
  • 2 按键电路
  • 3 按键软件设计
    • 3.1 按键实现
    • 3.2 按键滤波方法
    • 3.3 矩阵按键软件设计
    • 3.4 按键Protues 仿真
  • 4 按键操作总结


提示

1 按键介绍

1.1 按键种类

按键是一种用于控制电子设备或电路连接和断开的按钮或开关。它们通常具有两个状态:打开和关闭。下面是一些常见的开关按键介绍:

  1. 按下开关(Push Button Switch):这是一种简单的按键,按下按钮可以连接电路,释放按钮则断开电路。它们通常用于控制设备的开关或触发特定功能。
  2. 切换开关(Toggle Switch):切换开关是一种具有固定位置的开关,可以手动切换其状态。它们通常有两个或更多个固定位置(例如打开和关闭),通过切换开关的位置来连接或断开电路。
  3. 滑动开关(Slide Switch):滑动开关是一种通过滑动按钮来改变状态的开关。它们通常具有两个位置,通过将滑块从一个位置滑动到另一个位置来连接或断开电路。
  4. 拨动开关(Toggle Switch):拨动开关是一种通过拨动按钮来改变状态的开关。它们通常具有一个中间位置和两个极端位置,通过将按钮从一个位置拨到另一个位置来连接或断开电路。
  5. 按钮开关(Button Switch):按钮开关类似于按下开关,但通常具有弹簧机制,释放按钮后会自动返回到初始位置。它们常用于需要按住按钮来保持连接状态的应用,而松开按钮则断开电路。
  6. 电子开关(Electronic Switch):电子开关是一种使用电子元件(如晶体管或继电器)来控制电路连接和断开的开关。它们可以通过电信号或其他触发方式来控制开关状态

1.2 按键应用场景

一些机械按键的应用场景:

  1. 电脑键盘:机械键盘在电脑领域广泛应用。由于机械按键提供更好的触感和键程,使得打字和游戏体验更加舒适和精准。
  2. 游戏设备:机械按键在游戏机、游戏手柄和游戏机械键盘中得到广泛应用。机械按键的触感反馈和快速响应时间有助于提高游戏的控制性能。
  3. 工业控制设备:机械按键耐用性强,适用于工业控制设备中需要频繁操作的场景,如机械控制面板、机器人控制台等。
  4. 通信设备:机械按键可以用于手机、电话、对讲机等通信设备中,提供更好的按键触感和可靠性。
  5. 音频设备:机械按键在音频设备中使用广泛,如调音台、音频控制面板、音乐键盘等。
  6. 医疗设备:机械按键在医疗设备中的应用很常见,如医疗仪器、手术台控制面板等,机械按键的稳定性和可靠性对医疗设备的正常运行至关重要。
  7. 汽车和航空设备:机械按键可以用于汽车控制面板、飞机仪表盘等需要高可靠性和耐用性的场景。
    机械按键的耐用性、触感和可靠性使其成为许多领域中首选的选择。无论是为了提高工作效率,还是为了提供更好的用户体验,机械按键都在许多应用场景中得到广泛应用。

2 按键电路

开发板上的按键电路原理图如下所示,J11用于控制0/4/8/按钮处于矩阵键盘中还是独立按键中,16个按键用一组P3X端口控制。

在这里插入图片描述

开发板的按键实物如图所示
在这里插入图片描述

在这里插入图片描述

3 按键软件设计

3.1 按键实现

首先我们实现独立按键,将J11使用跳线帽把2.3两个短接,这样就能实现0/4/8/C按键的独立使用。
1、软件工程,我们新建两个文件,分别为c51_key.c和c51_key.h,在c51_key.c中应用includes.h,在includes.h包含c51_key.h,并将两个共文件添加到工程中如图所示。

在这里插入图片描述

因为要显示按键数值,我们用前面的数码管实现数据显示。
显示函数如下所示。

/********************************************************
函数名称:sys_keynum_ledon
函数功能:显示按键数值
入口参数:按键数值
出口参数:
修    改:
内    容:
********************************************************/
void sys_keynum_ledon(unsigned char num)
{
	//根据原理图,将P0口全部输出高电平,P2选择0号数码管
	P0=EL[num];//取显示数据,段码
	P2=0;  	//取位码
}

在c51_key.c中,实现按键检测

bit key1=0;   //定义按键位置
bit key2=0;
bit key3=0;
bit key4=0;


/********************************************************
函数名称:sys_key_single
函数功能:按键检测
入口参数:
出口参数:按键数值
修    改:
内    容:
********************************************************/
static unsigned char key1_history = 0;//缓存上一次按键的结果
unsigned char sys_key_single(void)
{
	key1=P30;   //定义按键位置
	key2=P31;
	key3=P32;
	key4=P33;

	if(!key1)  //按下相应的按键,数码管显示相应的码值
	{
		key1_history = 1;
		return 1;
	}
	else if(!key2)
	{
		key1_history = 2;
		return 2;
	}
	else if(!key3)
	{
		key1_history = 3;
		return 3;
	}
	else if(!key4)
	{
		key1_history = 4;
		return 4;
	}
	else
	{
		return key1_history;
	}
	
}

主程序main中引用:

#include "includes.h"



/*------------------------------------------------
                    延时子程序
------------------------------------------------*/
void delay(unsigned int cnt) 
{
 while(--cnt);
}

/*------------------------------------------------
                    主函数
------------------------------------------------*/
void main (void)
{
	//8个指示灯的操作
	sys_led();
	sys_led_test();
	sys_led_test1();
	
	sys_ledtube_on1();
	sys_ledtube_on2();
	
	//主循环中添加其他需要一直工作的程序
	while (1)
	{
		sys_keynum_ledon(sys_key_single());
	}
}

3.2 按键滤波方法

/********************************************************
函数名称:sys_key_single
函数功能:按键检测,带有消抖策略
入口参数:
出口参数:按键数值
修    改:
内    容:
********************************************************/
static unsigned char key1_history = 0;//缓存上一次按键的结果
unsigned char sys_key_single(void)
{
	key1=P30;   //定义按键位置
	key2=P31;
	key3=P32;
	key4=P33;

	if(!key1)  //按下相应的按键,数码管显示相应的码值
	{
		delay(1000);
		if(!key1)
		{
			key1_history = 1;
			return 1;
		}
		else
		{
			return key1_history;
		}
	}
	else if(!key2)
	{
		delay(1000);
		if(!key2)
		{
			key1_history = 2;
			return 2;
		}
		else
		{
			return key1_history;
		}
	}
	else if(!key3)
	{
		delay(1000);
		if(!key3)
		{
			key1_history = 3;
			return 3;
		}
		else
		{
			return key1_history;
		}
	}
	else if(!key4)
	{
		delay(1000);
		if(!key4)
		{
			key1_history = 4;
			return 4;
		}
		else
		{
			return key1_history;
		}
	}
	else
	{
		return key1_history;
	}
	
}

3.3 矩阵按键软件设计

// 显示段码值01234567,可对应原理图查看显示不同图形对应的引脚高点电平配置状态

unsigned char const EL[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,\
		                  	 0x77,0x7c,0x39,0x5e,0x79,0x71};//0-F
unsigned char sys_key_board(void)
{
	unsigned char key = 0x00;
	unsigned char num = 0x00;
	key=keyscan();  //调用键盘扫描
	if(key == 0xFF)
	{
		num = key1_history;
	}
	else
	{
		switch(key)
		{
			case 0xee:num = 0x0;break;//0按下相应的键显示相对应的码值
			case 0xde:num = 0x1;break;//1 按下相应的键显示相对应的码值 
			case 0xbe:num = 0x2;break;//2
			case 0x7e:num = 0x3;break;//3
			case 0xed:num = 0x4;break;//4
			case 0xdd:num = 0x5;break;//5
			case 0xbd:num = 0x6;break;//6
			case 0x7d:num = 0x7;break;//7
			case 0xeb:num = 0x8;break;//8
			case 0xdb:num = 0x9;break;//9
			case 0xbb:num = 0xA;break;//a
			case 0x7b:num = 0xB;break;//b
			case 0xe7:num = 0xC;break;//c
			case 0xd7:num = 0xD;break;//d
			case 0xb7:num = 0xE;break;//e
			case 0x77:num = 0xF;break;//f
			default:num = key1_history; break;
		}
		
		key1_history = num;
	}
	return num;
}


/*------------------------------------------------
              键盘扫描程序
------------------------------------------------*/
unsigned char keyscan(void)  //键盘扫描函数,使用行列反转扫描法
{
	unsigned char cord_h,cord_l;//行列值中间变量
	P3=0x0f;            //行线输出全为0
	cord_h=P3&0x0f;     //读入列线值
	if(cord_h!=0x0f)    //先检测有无按键按下
	{
		delay(100);        //去抖
		if(cord_h!=0x0f)
		{
			cord_h=P3&0x0f;  //读入列线值
			P3=cord_h|0xf0;  //输出当前列线值
			cord_l=P3&0xf0;  //读入行线值
			return(cord_h+cord_l);//键盘最后组合码值
		}
	}
	return(0xff);     //返回该值
}

3.4 按键Protues 仿真

独立按键显示结果,拨码开关,将按键一端接地

在这里插入图片描述

矩阵键盘按键仿真:在这里插入图片描述

4 按键操作总结

在单片机应用中,按键检测的可靠性设计对于确保正确的输入和稳定的系统操作至关重要。以下是一些提高按键检测可靠性的设计原则:

  1. 消除按键抖动:按键抖动是指按键在按下或释放时产生的短暂的不稳定信号。为了消除抖动,可以采用硬件或软件的抖动消除方法。硬件方面,可以使用外部电容或RC网络来滤除抖动。软件方面,可以使用软件延时或状态机来稳定按键信号。
  2. 使用外部上拉/下拉电阻:通过使用外部上拉或下拉电阻连接到按键引脚,可以确保按键在未按下时保持稳定状态。这样做可以防止未按下按键时的浮动信号。
  3. 延时和去抖动算法:在软件中实施适当的延时和去抖动算法可以提高按键检测的可靠性。延时可以确保稳定的按键状态,并避免误触发。去抖动算法可以滤除按键抖动,确保只检测到有效的按键操作。
  4. 多重检测和确认:为了提高可靠性,可以使用多重按键检测和确认机制。例如,可以使用软件定时器或中断来周期性地检测按键状态,并通过多次确认来确保按键的有效触发。
  5. 输入缓冲区和状态机:使用输入缓冲区可以存储按键输入,然后使用状态机来处理输入。状态机可以跟踪按键状态和处理按键事件,以确保按键操作的正确性和稳定性。
  6. 电源和地线的干扰隔离:为了防止电源干扰和地线回流对按键信号的影响,可以采取适当的隔离措施。例如,使用独立的电源和地线平面,或者使用滤波器来减少干扰。
  7. 硬件和软件的容错机制:设计容错机制可以在出现错误或异常情况时保护按键输入的可靠性。例如,可以使用冗余检测、校验和检测、错误处理和恢复机制等。
    总的来说,可靠的按键检测设计需要综合考虑硬件和软件方面的各种因素,并根据具体应用场景进行适当的优化和调整。通过合理的设计和实施,可以确保按键的稳定性、准确性和可靠性。

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

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

相关文章

UGC与AI引领的下一个10年,丝芭传媒已经准备好

丝芭传媒最近传来的消息,都跟技术相关。 基于自研AI大模型“Paro(心乐舞河)”的AIGPT及AIGC生成工具APP“鹦鹉人”开启用户内测。2023年3月技术测试的图形化智能社交基座“美踏元宇宙”,也将开放首轮用户内测。 此外&#xff0c…

搭建一个成功的短视频社区,你需要知道这些

近年来,短视频以其独特的魅力在全球范围内迅速崛起。无论是抖音、快手等国内巨头的迅速扩张,还是国外各类短视频应用的不断涌现,都证明了短视频时代的来临。短视频以其消费门槛低、娱乐性强、信息获取快等特点,赢得了广大用户的青…

node使用express在服务器上创建接口,携带参数访问时返回参数

一、下载nodejs​​​​​​Node.js — 在任何地方运行 JavaScriptNode.js is a JavaScript runtime built on Chromes V8 JavaScript engine.https://nodejs.org/zh-cn 二、 安装Express 找一个文件夹,创建 mkdir myapp cd myapp三、初始化一个新的Node.js项目&…

入门PHP就来我这(高级)15 ~ 图书删除功能

有胆量你就来跟着路老师卷起来! -- 纯干货,技术知识分享 路老师给大家分享PHP语言的知识了,旨在想让大家入门PHP,并深入了解PHP语言。 今天给大家接着上篇文章实现图书删除功能,来实现删除图书信息记录行的功能。 1 删…

HTML-CSS 入门介绍

1.web 网站的工作流程 2.web前端开发 简单示例 <html> <head> <title>HTML快速入门</title> </head> <body> <h1>Hello HTML</h1> <img src1.jpg></img> <img src1.jp…

RPA影刀 | 循环 + 嵌套循环 + 循环中的continue和break

一、循环 循环的构成 重复在做的事&#xff08;不变的&#xff09;&#xff1a;循环体每次操作的对象&#xff08;变化的&#xff09;&#xff1a;循环项 二、ForEach列表循环 三、循环相似元素 四、For次数循环 五、嵌套循环 测试目标&#xff1a;遍历所有页面&#xff0…

连升2级,3区变1区,这本计算机杂志当投~

福利✨✨福利✨✨ &#x1f914;想快速录用&#xff0c;顺利毕业/评职吗&#xff1f;没问题&#xff01;&#x1f4af; &#x1f3af;EI期刊征稿&#xff0c;提交后2个月返修&#xff0c;修改后1个月录用&#xff0c;1周见刊&#xff0c;2周检索&#xff1b; &#x1f4e2;人工…

C语言学习笔记[22]:分支语句switch

switch语句 switch语句也是一种分支语句&#xff0c;常用于多分支的情况 switch语句的语法形式是&#xff1a; switch(整型表达式) {语句项; }而语句项是什么呢&#xff1f; case 整型常量表达式:语句; switch语句中的break 对于case 语句来说&#xff0c;我们day输入的多…

SpringMVC源码解析(一):web容器启动流程

SpringMVC源码系列文章 SpringMVC源码解析(一)&#xff1a;web容器启动流程 目录 一、SpringMVC全注解配置1、pom文件2、web容器初始化类(代替web.xml)3、SpringMVC配置类(代替springmvc.xml)4、测试Controller 二、SpringServletContainerInitializer1、web容器初始化入口2、…

linux19:程序替换

一&#xff1a;最简单的看看程序替换是什么样的&#xff08;单个进程版&#xff09; 1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 int main()5 {6 printf("Before : I am a process , myPid:%d,myPPid:%d\n",getpid(),getpp…

为什么要做智慧水务信息化平台建设?带来的好处

随着科技的飞速发展&#xff0c;我们的生活正在经历一场前所未有的变革。在这场变革中&#xff0c;智慧水务信息化建设如同一股清流&#xff0c;以其独特的魅力&#xff0c;悄然改变着我们对水务管理的传统认知。 为何要进行智慧水务信息化建设&#xff1f;答案显而易见——为…

Miniconda的常见用法——以Isaacgym为例

1. ubuntu24.04安装minicondda mkdir -p ~/miniconda3 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh解释下这段代码 bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3~/miniconda3/miniconda.sh: 指向Mi…

2024HW必修高危漏洞集合_v4.0

高危风险漏洞一直是企业网络安全防护的薄弱点&#xff0c;也成为HW攻防演练期间红队的重要突破口;每年 HW期间爆发了大量的高危风险漏洞成为红队突破网络边界防护的一把利器,很多企业因为这些高危漏洞而导致整个防御体系被突破、甚至靶标失守而遗憾出局。 HW 攻防演练在即&…

SpringCloud学习Day7:Seata

概念 Seata是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务 工作流程 TC以Seata服务器形式独立部署&#xff0c;TM和RM则是以Seata Client的形式集成在微服务中运行

SAP 无权限的解决

在进行SAP操作过程中&#xff0c;经常会出现无权限的情况&#xff0c;如客户说没有“ABAAL计划外折旧”权限 但是在查看SU01的时候&#xff0c;已经有角色分配了 解决&#xff1a;1、ABAA之后&#xff0c;SU53查看2、 2、PFCG查找到角色手动添加权限对象S_TCODDE,之后更新&…

SprongBoot及其基础应用全套部署脚本和配置

POM.xml配置 </dependencies> <!--skywalking日志监控依赖--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

小试牛刀-Python生成solana Wallet公私钥

目录 1.编写目的 2.使用依赖 3.实现方法 3.1 Pynacl实现 3.2 ed25519实现 1.编写目的 在使用Python开发solana应用过程中,需要生成solana Wallet公私钥,以实现后续应用操作.这里将Python生成方法进行整理,方便日后的查阅,也能帮助到实现相关功能的朋友。 2.使用依赖 主要…

在 Vue 项目中使用 FullCalendar

1、先安装依赖包&#xff0c;根据自己的需求安装&#xff0c;建议使用cnpm安装&#xff0c;不然会很慢有时候会出现安装不上的情况。 npm i fullcalendar/vue --save npm i fullcalendar/core --save // 在月视图或日视图中操作事件 npm i fullcalendar/daygrid --save // 在…

[数仓]三、离线数仓(Hive数仓系统)

第1章 数仓分层 1.1 为什么要分层 DIM&#xff1a;dimensionality 维度 1.2 数据集市与数据仓库概念 1.3 数仓命名规范 1.3.1 表命名 ODS层命名为ods_表名DIM层命名为dim_表名DWD层命名为dwd_表名DWS层命名为dws_表名 DWT层命名为dwt_表名ADS层命名为ads_表名临时表命名为…

Java-Redis-Clickhouse-Jenkins-MybatisPlus-Zookeeper-vscode-Docker

文章目录 Clickhouse基础实操windows docker desktop 下载clickhousespringboot项目配置clickhouse Redis谈下你对Redis的了解&#xff1f;Redis一般都有哪些使用的场景&#xff1f;Redis有哪些常见的功能&#xff1f;Redis支持的数据类型有哪些&#xff1f;Redis为什么这么快…