(七)独立按键

文章目录

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


独立按键原理图

在这里插入图片描述

三行代码法

简单概述

在这里插入图片描述

代码书写

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.hqwc.cn/news/317910.html

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

相关文章

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

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

Java反射机制和动态代理

反射和动态代理 反射前言获取class对象的方式反射获取构造方法反射获取成员变量反射获取成员方法实例 动态代理 反射 前言 什么是反射? 反射允许对成员变量,成员方法和构造方法的信息进行编程访问。 为什么用反射 / 反射的作用? 可以轻易地获…

图像分割-漫水填充法 floodFill (C#)

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 本文的VB版本请访问:图像分割-漫水填充法 floodFill-CSDN博客 FloodFill方法是一种图像处理算法,它的目的是…

【SpringBoot框架篇】34.使用Spring Retry完成任务的重试

文章目录 简要1.为什么需要重试?2.添加maven依赖3.使用Retryable注解实现重试4.基于RetryTemplate模板实现重试 简要 Spring实现了一套重试机制,功能简单实用。Spring Retry是从Spring Batch独立出来的一个功能,已经广泛应用于Spring Batch,…

哪些洗地机比较好?洗地机选购指南

随着社会生活水平的提高,人们对居家环境的卫生和清洁要求不断提升。家用洗地机作为一种先进的清洁工具,带来了许多便利和优势,特别是在解决一些特殊需求的家庭环境方面。 以下是一些家用洗地机的优势和适用场景: 1.高效清洁&…

Hive用户自定义函数之UDF开发

在进行大数据分析或者开发的时候,难免用到Hive进行数据查询分析,Hive内置很多函数,但是会有一部分需求需要自己开发,这个时候就需要自定义函数了,Hive的自定义函数开发非常方便,今天首先讲一下UDF的入门开发…

爬虫如何获取免费代理IP(二)

89ip代理爬取代码实现 一、代码实现 import requests import time import random from fake_useragent import UserAgent from lxml import etree import os import csv""" 89ip代理爬取 """class IPSipder(object):def __init__(self):self.u…

macbook电脑2024免费好用的系统清理优化软件CleanMyMac X4.14.7

CleanMyMac X2024来帮助你找到和删除不需要的文件。CleanMyMac X是一款专业的mac清理软件,它可以智能地扫描你的磁盘空间,找出并删除大型和旧文件,系统垃圾,iTunes垃圾,邮件附件,照片库垃圾等,让…

那些高级工程师才知道的只有几行代码却功能强大python自动化脚本,号称掌握这个python库让你工作效率变得比别人遥遥领先

那些高级工程师才知道的只有几行代码却功能强大python自动化脚本,号称掌握这个python库让你工作效率变得比别人遥遥领先。 如果你也厌倦了每天重复同样乏味的工作?Python,凭借它的简单和通用性,能够为你的问题提供最佳方案。 在本文中,我们将探索10个Python脚本,这些脚本…

数据结构学习 Jz48最长不含重复字符的子字符串

关键词:哈希表 动态规划 滑动窗口 用时:40min 哈希表 动态规划 题解:我觉得这个写的很好。 题目: 方法一: 哈希表 滑动窗口 思路: 我一开始没想到用一个左指针做滑动窗口。 哈希表:存之前…

七:Day06_redis高级01

第一章 Redis入门 1.1 节 什么是NoSql型数据库 NoSQL ,泛指非关系型的数据库, NoSQL Not Only SQL,它可以作为关系型数据库的良好补充。NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。 SQLNoSQL数据结构结构化非…

P59 生成式对抗网络GAN-理论介绍 Theory behind GAN

Object Normal Distribution 的数据 经过 Generator 后生成分布更加复杂的PG. 真实数据的分布为 Pdata , 希望 PG和Pdata 越近越好 LOSS 是 两者之间的分布距离 问题: 如何计算 divergence? Sampling is goog enough Discriminator 希望V越大越好 y~Pdata 代表从 Pdata里…