(七)独立按键

文章目录

  • 独立按键原理图
  • 三行代码法
    • 简单概述
    • 代码书写
    • 键码推算
    • 如何使用
      • 短按键
      • 长按键
  • 状态机法
    • 简单概述
    • 代码书写
    • 键码推算
      • 如何使用
      • 短按键
      • 长按键
  • 现象


独立按键原理图

在这里插入图片描述

三行代码法

简单概述

在这里插入图片描述

代码书写

u8 Trg = 0x00;//短按键
u8 Cont = 0x00;//长按键
void BtnThree(void)
{u8 readata = P3^0xff;Trg = readata&(readata^Cont);Cont = readata;
}

键码推算

键码口诀 “ 从下到上 8421”

比如:没有按键按下
readata = 0xff ^ 0xff = 0x00;
Trg = 0x00&(0x00 ^ 0x00) = 0x00;
Cont = 0x00;

比如:S7按下
readata = 0xfe ^ 0xff = 0x01;
Trg = 0x01&(0x01 ^ 0x00) = 0x01;
Cont = 0x01;
第一种情况:接着未松手(下一个10ms来了):
readata = 0xfe ^ 0xff = 0x01;
Trg = 0x01&(0x01 ^ 0x01) = 0x00;
Cont = 0x01;
第二种情况:松手了
readata = 0xff ^ 0xff = 0x00;
Trg = 0x00&(0x00 ^ 0x01) = 0x00;
Cont = 0x00;

因此可以理解:Trg 保存的是短按键状态,Cont保存的是长按键状态

如何使用

短按键

功能:
s7点亮led1
s6熄灭led1
s5点亮led1
s4熄灭led1

u8 btn_cnt =0 ;
void BtnTask()
{if(btn_cnt>=10){btn_cnt = 0;BtnThree();if((Trg&0x01)==0x01){//s7DeviceCtrl(0x80,0xfe);//open led1}if((Trg&0x02)==0x02){//s6DeviceCtrl(0x80,0xff);//open led1}		if((Trg&0x04)==0x04){//s5DeviceCtrl(0x80,0xfe);//open led1}if((Trg&0x08)==0x08){//s4DeviceCtrl(0x80,0xff);//open led1}		}
}

长按键

功能:
按下s7不送手点亮led1
松手熄灭led1

u8 btn_cnt =0 ;
void BtnTask()
{if(btn_cnt>=10){btn_cnt = 0;BtnThree();if(Cont==0x01){		//s7为长按键DeviceCtrl(0x80,0xfe);//按下不松开 open led1}if((Trg==0x00)&&(Cont==0x00)){	//松手检测DeviceCtrl(0x80,0xff);//松手 close led1}	}
}

状态机法

简单概述

在这里插入图片描述

代码书写

u8 BtnState(void)
{static u8 keystate = 0;u8 keyreturn =0;u8 keypress = 0;keypress = P3&0x0f;switch(keystate){case 0: if(keypress!=0x0f){keystate=1;}break;case 1:	if(keypress!=0x0f){//确实有按键按下if(keypress==0x07){keyreturn = 4;break;}if(keypress==0x0b){keyreturn = 5;break;}if(keypress==0x0d){keyreturn = 6;break;}if(keypress==0x0e){keyreturn = 7;break;}keystate=2;}else{	//是抖动keystate=0;}break;case 2:if(keypress==0x0f){keystate=0;} break;//等待松手	}return keyreturn;
}

键码推算

键码口诀 “从下到上 7bde”
比如:S7被按下
keypress = 0x0f&0x0e = 0x0e;

如何使用

短按键

功能同三行代码法的短按键一样

u8 btn_val;//缓存键码
u8 btn_cnt =0 ;
void BtnTask()
{if(btn_cnt>=10){btn_cnt = 0;btn_val = BtnState();//获取哪个按键被按下的键码if(btn_val==4){DeviceCtrl(0x80,0xfe);//open led1}if(btn_val==5){DeviceCtrl(0x80,0xff);//close led1}if(btn_val==6){DeviceCtrl(0x80,0xfe);//open led1}if(btn_val==7){DeviceCtrl(0x80,0xff);//close led1}}
}

长按键

功能同三行代码法的短按键一样

u8 btn_cnt =0 ;
void BtnTask()
{if(btn_cnt>=10){btn_cnt = 0;btn_val = BtnState();//获取哪个按键被按下的键码if(btn_val==7){		// 按下s7没松手DeviceCtrl(0x80,0xfe);//open led1}else{						//按下 s7 松手了DeviceCtrl(0x80,0xff);//close led1}}
}

现象

(七)独立按键



----- 如有错误欢迎大家批评指正!!!

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

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

相关文章

JWT(JSON Web Tokens)入门与Java实践

一、JWT简介 在现代Web应用中,身份验证和授权是确保系统安全性的关键环节。JSON Web Tokens(JWT)是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在网络之间安全地传输信息。JW…

【AI】大模型的黑盒困惑

目录 一、人工智能大模型 二、大模型的黑盒特性 三、黑盒导致的问题 一、人工智能大模型 人工智能大模型是指使用深度学习技术构建的,具有庞大规模参数的神经网络模型。这些模型具有数以亿计的参数,能够对大量的数据进行训练,从而在各种任…

CMake入门教程【核心篇】安装(install)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 概述2. 使用方法2…

如何从零开始搭建公司自动化测试框架?

一、为什么要搭建自动化测试框架 测试如果按照是否手工划分,可以分为“手工测试”和“自动化测试”。 “手工测试”也就是用人力来进行功能测试。相比自动化测试而言执行效率慢,可以进行探索性测试和发散性测试。 “自动化测试”主要是通过所开发的软…

SSE和websocket

SSE (Server-Sent Events,服务器推送事件) 是一种用于实现服务器向客户端推送实时数据的 Web 技术。 SSE 允许服务器在建立的 HTTP 连接上发送事件流,而不需要客户端发起请求。相比于传统的请求-响应模式,它提供了一种服务器主动推送数据给客…

Python控制程控电源(USB)

文章目录 前言一、环境搭建1.软件安装2.硬件安装二、设置程控电源连接方式三、Python代码四、验证结果五、pyd文件前言 随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制…

nifi详细介绍--一款开箱即用、功能强大可靠,可用于处理和分发数据的大数据组件

目录 目录 一、引言 二、NiFi 的历史背景介绍 三、NiFi 是什么? 核心特性 应用领域 四、NIFI 入门 五 、NiFi 工作流程 六、实际应用场景 七、优势总结 一、引言 NiFi(Apache NiFi),全名为“Niagara Files”&#xff0…

Docker把容器打包成镜像并迁移到另外一台服务器上运行

在Docker中,您可以通过两个步骤将容器打包成镜像,并将该镜像保存到本地文件系统中。以下是具体步骤: 将容器提交为镜像: 使用 docker commit 命令可以将现有的容器状态保存为新的镜像。这个过程类似于创建一个镜像的快照。 假设您…

Oracle修改用户密码

文章目录 Oracle修改用户密码Oracle用户锁定常见的两种状态Oracle用户锁定和解锁 Oracle修改用户密码 使用sys或system使用sysdba权限登录,然后执行以下命令修改密码: alter user 用户名 identified by 密码;密码过期导致的锁定,也通过修改…

StratifiedGroupKFold解释和代码实现

StratifiedGroupKFold解释和代码实现 文章目录 一、StratifiedGroupKFold解释和代码实现是什么?二、 实验数据设置2.1 实验数据生成代码2.2 代码结果 三、实验代码3.1 实验代码3.2 实验结果3.3 结果解释 四、样本类别类别不平衡 一、StratifiedGroupKFold解释和代码…

Redis:原理速成+项目实战——初识Redis、Redis的安装及启动、Redis客户端

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:首期文章 📚订阅专栏:Redis速成 希望文章对你们有所帮助 在此之前,我做过的项目里面也用到了…

利用深度学习图像识别技术实现教室人数识别

引言 在现代教育环境中,高效管理和监控教室成为了一个重要议题。随着人工智能技术的迅猛发展,特别是深度学习和图像识别领域的突破,我们现在可以通过智能系统来自动识别教室内的人数,从而实现更加智能化的教室管理。 深度学习与图…

LeetCode 84. 柱状图中最大的矩形

84. 柱状图中最大的矩形 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 求在该柱状图中,能够勾勒出来的矩形的最大面积。 示例 1: 输入:heights [2,1,5,6,2,3] 输出:10 解释…

Spring-IOC综述

文章迁移自语雀。 怎么查看spring的文档 ioc综述 说到spring的ioc,其实就是控制反转,为啥需要控制反转呢,其实是为了功能的增强,如果不用spring, 我们直接使用工厂方法,静态工厂方法, 都是是可以获取到对象的,但是如果需求变了,我们在类的生成时,添加了很多信息,使用工厂就不…

【INTEL(ALTERA)】Arria V FPGA GPIO 引脚上的内部箝位二极管是否始终处于活动状态?

说明 当设备未通电或未配置设备时,英特尔 Arria V FPGA GPIO 引脚上的内部箝位二极管是否处于活动状态? 解决方法 根据 Arria V 器件手册:第 1 卷:设备接口和集成,片上钳位二极管功能通过 英特尔 Quartus Prime 软件…

【鸿蒙杂谈①】——鸿蒙基础介绍及应用领域

1.前言 小伙伴们大家好,最近被复习整的痛苦无比,所以今天咱们了解 一点轻松的东西,至于高并发就先放放吧。好了,废话不多说,咱们进入正题。 相信小伙伴们都已经看到了最近鸿蒙的势头了,那鸿蒙究竟是怎么发…

《Linux C编程实战》笔记:实现自己的myshell

ok,考完试成功复活 这次是自己的shell命令程序的示例 流程图: 关键函数 1.void print_prompt() 函数说明:这个函数打印myshell提示符,即“myshell$$”. 2.void get_input(char *buf) 函数说明:获得一条指令&#…

阿里云免费SSL证书有效期只有3个月?

阿里云免费SSL证书签发有效期从12个月缩短至3个月:尊敬的用户,根据供应商变更要求,免费证书(默认证书)的签发有效期将由12个月缩短至3个月。 免费证书(升级证书)的有效期不会改变。 没错&#…

Vue3-32-路由-重定向路由

什么是重定向 路由的重定向 :将匹配到的路由 【替换】 为另一个路由。 redirect : 重定向的关键字。 重定向的特点 1、重定向是路由的直接替换,路由的地址是直接改变的; 2、在没有子路由配置的情况下,重定向的路由可以省略 component 属性的配…

Langchain访问OpenAI ChatGPT API Account deactivated的另类方法,访问跳板机API

笔者曾经写过 ChatGPT OpenAI API请求限制 尝试解决 Account deactivated. Please contact us through our help center at help.openai.com if you need assistance. 结果如何? 没有啥用。目前发现一条曲线救国的方案。 1. 在官方 openai 库中使用 此处为最新Op…