(七)独立按键

news2024/11/15 14:05:21

文章目录

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


独立按键原理图

在这里插入图片描述

三行代码法

简单概述

在这里插入图片描述

代码书写

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

现象

(七)独立按键



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

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

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

相关文章

李沐机器学习系列2--- mlp

1 Introduction LP中有一个很强的假设,输入和输出是线性关系,这一般是不符合事实的。 通过几何的方式去对信息进行理解和压缩是比较高效的,MLP可以表示成下面的形式。 1.1 从线性到非线性 X ∈ R n d X \in R^{n \times d} X∈Rnd表示输入…

2023-12-26分割回文串和子集以及子集II

131. 分割回文串 思想:回溯三步骤!① 传入参数 ② 回溯结束条件 ③ 单层搜索逻辑!抽象成回溯树,树枝上是每次从头部穷举切分出的子串,节点上是待切分的剩余字符串【从头开始每次往后加一】 class Solution:def partiti…

基于混合蛙跳算法优化的Elman神经网络数据预测 - 附代码

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

ChatGPT持续火热,OpenAI年收入突破16亿美元

著名科技媒体The Information消息,由于OpenAI的ChatGPT等产品实现强劲增长,其年收入将突破16亿美元。 这主要得益于OpenAI在2023年发布了一系列重磅产品,包括GPT-4、ChatGPT企业版、GPT-4 Turbo、DALLE 3、苹果/安卓应用、自定义GPTs、Assis…

测试人必看,看完必会的fiddler抓包,抓包抓的好........

📢专注于分享软件测试干货内容,欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!📢交流讨论:欢迎加入我们一起学习!📢资源分享:耗时200小时精选的「软件测试」资…

ELF文件信息一览

准备开个专栏,记录《从零开始实现链接器》的学习过程,先占个坑。 之前一直想把自己的学习过程记录在个人博客网站上,但这个要自己维护,上传图片什么的比较麻烦。关键是没有人互动,自己也没有怎么去看,慢慢的…

麒麟云增加计算节点

一、安装基座系统并配置好各项设置 追加的计算节点服务器,安装好系统,把主机名、网络网线(网线要和其他网线插的位置一样)、hosts这些配置好,在所有节点的/etc/hosts里面添加信息 在控制节点添加/kylincloud/multinod…

解决Redis序列化乱码问题

如果我们使用原生的JDK序列化&#xff0c;那么当我们将数据存储到Redis中就会出现乱码的情况 为了解决这个问题我们需要重写RedisTemplate从而解决序列化乱码问题 首先在Maven中引入相应的依赖 <dependency> <groupId>com.fasterxml.jackson.core</group…

交换机01_以太网

1、交换机工作原理 交换机是数据链路层的设备&#xff0c;数据链路层传输的是数据帧&#xff0c;所以封装的是MAC头部&#xff08;主要有源MAC地址和目的MAC地址&#xff09; 2、数据链路层的功能&#xff1a; 建立逻辑连接&#xff0c;进行物理地址寻址&#xff0c;差错校验…

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

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

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

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

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具&#xff0c;一直被许多网友们所喜欢&#xff0c;使用简单、方便。 UltraISO官方下载地址&#xff1a;https://cn.ultrais…

Halcon顶帽运算与底帽运算的应用

Halcon顶帽运算与底帽运算的应用 文章目录 Halcon顶帽运算与底帽运算的应用1. 提取小的物件2. 校正非均匀光照 正如上文所说的&#xff0c;顶帽运算返回的像素部分是尺寸比结构元素小的&#xff0c;并且比较亮的局部小区域&#xff1b;底帽运算返回的像素部分是尺寸比结构元素小…

【EI会议征稿通知】第三届艺术设计与数字化技术国际学术会议( ADDT 2024)

第三届艺术设计与数字化技术国际学术会议( ADDT 2024&#xff09; 2024 3rd International Conference on Art Design and Digital Technology 所谓艺术设计&#xff0c;就是将艺术的审美感应用到与日常生活密切相关的设计中&#xff0c;使其不仅具有审美功能&#xff0c;而且…

Arduino定时器和定时器中断

目录 一、定时器中断库函数方式说明 1、定时器中断编号和引脚说明 2、库文件安装 3、MsTimer2库文件使用 4、TimerOne库文件使用 5、注意事项 二、定时器的寄存器配置说明 1、定时器寄存器列表说明 2、Timer0寄存器说明 3、预分频系数与比较匹配器 4、定时器模式 …

天津大数据培训机构 大数据时代已到来!

大数据时代已经来临&#xff0c;越来越多的人开始关注大数据&#xff0c;并且准备转行大数据。但是&#xff0c;对于一个外行人或者小白来说&#xff0c;大数据是什么&#xff1f;大数据需要学什么&#xff1f;什么样的大数据培训机构是靠谱的&#xff1f;这几个简单的问题就足…

xpath定位--切换frame/窗口

在web自动化中&#xff0c;有时候我们界面上明明定位到了该元素&#xff0c;但是就是点击不到&#xff0c;怎么回事&#xff1f; --可能是没有切换到对应的frame或者没有切换到对应窗口&#xff01;&#xff01;&#xff01; 切换frame用于在同一个窗口中切换到frame上下文&a…

SpringBoot之多环境开发配置

1 多环境开发配置 问题导入 在实际开发中&#xff0c;项目的开发环境、测试环境、生产环境的配置信息是否会一致&#xff1f;如何快速切换&#xff1f; 1.1 多环境启动配置 yaml文件多环境启动 不同环境使用—隔开 示例代码&#xff1a; spring:profiles:active: dev#生产…

Spring Bean的生命周期(钩子函数)

借鉴&#xff1a;https://www.cnblogs.com/liweimingbk/p/17843970.html https://blog.csdn.net/lxz352907839/article/details/128634404 一、Spring Bean生命周期 如果Spring配置文件中所定义的Bean类实现了ApplicationContextAware 接口&#xff0c;那么在加载Spring配置文…

C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 成功的秘诀就在于多努力一次&#xff…