(七)独立按键

文章目录

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


独立按键原理图

在这里插入图片描述

三行代码法

简单概述

在这里插入图片描述

代码书写

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){//s7
			DeviceCtrl(0x80,0xfe);//open led1
		}
		if((Trg&0x02)==0x02){//s6
			DeviceCtrl(0x80,0xff);//open led1
		}		
		if((Trg&0x04)==0x04){//s5
			DeviceCtrl(0x80,0xfe);//open led1
		}
		if((Trg&0x08)==0x08){//s4
			DeviceCtrl(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
		}
	}
}

现象

(七)独立按键



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

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

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

相关文章

CCNP课程实验-04-BGP_CFG

目录 实验条件网络拓朴 基础配置需求实现IGP部分1. 按照图示配置OSPF区域,RID为Loopback 0地址。其中Area 146要配置为OSPF的特殊区域。2. 配置其它路由协议,重分布使得路由互相注入,实现全网互通。3. R1配置策略路由,使得R2经R1去…

openmmlab大模型实战营01

与环境进行交互——智能体更合适 模型微调常见方式 模型评测 模型部署常见问题你 大语言模型本身不具备最新信息和知识的获取,此时需要搭建包含不同模块的智能体框架 智能体:以大语言模型为核心,进行规划、推理和执行

Hive09_函数

HIVE函数 系统内置函数 1)查看系统自带的函数 hive> show functions;2)显示自带的函数的用法 hive> desc function upper;3)详细显示自带的函数的用法 hive> desc function extended upper;hive函数分类 1、UDF:用…

贪心算法part05 435无重叠区间

435无重叠区间 763 划分字母区间 56合并区间

nginx访问路径匹配方法

目录 一:匹配方法 二:location使用: 三:rewrite使用 一:匹配方法 location和rewrite是两个用于处理请求的重要模块,它们都可以根据请求的路径进行匹配和处理。 二:location使用: 1:简单匹配…

打造专业开发者指南:针对ShardingProxy分库分表解决策略的深度剖析 – 详解部署、使用、服务治理与优化技巧

一、 ShardingProxy快速使用 ShardingProxy的功能同样是分库分表,但是他是一个独立部署的服务端,提供 统一的数据库代理服务。注意,ShardingProxy目前只支持MySQL和PostgreSQL。并且,客户端连接ShardingProxy时,最好使…

主流桌面浏览器Chrome,FireFox和Edge等如何禁用弹出式窗口阻止程序,这里有详细步骤

为什么你想知道如何禁用浏览器中的弹出式窗口阻止程序?毕竟,弹出式窗口是网络的祸害:显示烦人的广告、虚假的安全消息和其他刺激,会分散你的浏览注意力,甚至可能包含恶意代码。 所有主要的桌面浏览器现在都默认阻止弹出式窗口,那么你到底为什么要取消阻止这些害虫呢?事…

人机协同的关键

逻辑和实验是现代科学研究的两个支柱,这是因为科学研究需要不断地进行理论和实践的相互验证和修正,而逻辑和实验则分别代表了这两个方面的重要性和必要性。只有将逻辑和实验有效结合起来,它们相辅相成,互相促进,共同推…

【论文阅读】AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion

AADiff:基于文本到图像扩散的音频对齐视频合成。 code:没开源 paper:[2305.04001] AADiff: Audio-Aligned Video Synthesis with Text-to-Image Diffusion (arxiv.org) 一种新的T2V框架,额外使用音频信号来控制时间动态,使现成的…

快速入门ESP32——点亮你的第一个LCD屏幕

相关文章 快速入门ESP32——开发环境配置Arduino IDE 快速入门ESP32——开发环境配置PlatformIO IDE 快速入门ESP32—— platformIO添加开源库和自己的开发库 快速入门ESP32—— 解决platformIO添加开源库下载失败的问题 快速入门ESP32——点亮你的第一个LCD屏幕 前言一、移植T…

Python 流程控制结构(1)

# 在Python主要分为3大流程结构:顺序结构、分支结构、循环结构 Python顺序结构:从头到尾依次执行每一条 , 不需要判断 Python分支结构:程序会拐弯,有选择性的执行代码 ,到某个节点后,会根据一次判断结果来决定之后走哪…

【损失函数】Cross Entropy Loss 交叉熵损失

1、介绍 主页介绍的几种损失函数都是适用于回归问题损失函数,对于分类问题,最常用的损失函数是交叉熵损失函数 Cross Entropy Loss。它用于测量两个概率分布之间的差异,通常用于评估分类模型的性能。 2、公式 对于二分类问题,交…

DolphinScheduler实际应用

前言 最近公司新启动了一个项目,然后领导想用一下新技术,并且为公司提供多个大数据调度解决方案,我呢就根据领导要求调研了下当前的开源调度工具,最终决定采用DolphinScheduler, 因此研究了一下DolphinScheduler &…

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码

基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于头脑风暴算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于头脑风暴优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

QProgressDialog用法及结合QThread用法,四种线程使用

1 QProgressDialog概述 QProgressDialog类提供耗时操作的进度条。 进度对话框用于向用户指示操作将花费多长时间,并演示应用程序没有冻结。此外,QPorgressDialog还可以给用户一个中止操作的机会。 进度对话框的一个常见问题是很难知道何时使用它们;操作…

ASP.NET Core基础之图片文件(一)-WebApi访问静态图片

阅读本文你的收获: 学会在WebApi项目中访问静态图片了解静态文件中间件UseStaticFiles的用法 系统中免不了要去处理图片文件,比如上传商品的图片、显示商品的图片,访问系统中的图片等等,根据微软官网描述: 静态文件&a…

阿里巴巴开源异构数据源离线/全量/增量同步工具 - DataX

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

android——自定义TextView

效果展示&#xff1a; 代码解析&#xff1a; 1、首先设置自定义属性&#xff08;res/values下新建一个attrs.xml文件&#xff09; <?xml version"1.0" encoding"utf-8"?> <resources><!-- name 自定义view的名字 CustomTextView--&…

假期归来必看!2023年9月份,爆款论文总结,了解最新学术进展!

以下文章来源于AINLPer &#xff0c;作者ShuYini 十一假期结束了&#xff0c;十月基本上算是过了一半了&#xff0c;小伙伴们收收心准备开始学习工作吧。按照惯例&#xff0c;月初继续带到家盘一下上个月(九月份)的热点论文。本月论文主要分为大模型微调、大模型发布、大模型应…

jmeter线程组

特点&#xff1a;模拟用户&#xff0c;支持多用户操作&#xff1b;可以串行也可以并行 分类&#xff1a; setup线程组&#xff1a;初始化 类似于 unittest中的setupclass 普通线程组&#xff1a;字面意思 teardown线程组&#xff1a;环境恢复&#xff0c;后置处理