蓝桥杯物联网竞赛_STM32L071_18_长短按键检测

长短按键的检测是国赛题里面遇到的,省赛没出过有两种实方法

定时器配置:

定时器的话要比delay准确,其中tim7定时器的准度最高
在这里插入图片描述

在这里插入图片描述
定时器预分配配置32 - 1,计数周期是10000 - 1这样做那么32MHZ/32也就是一秒钟记录10^6的数,计数周期配置10 ^ 4也就是说一个周期花费10 ^ 4/10 ^6秒也就是10ms

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){  // 10ms// OLED_ShowString(0, "KEY)");COUNTNUMBER ++;
}

1、普通按键实现:

普通按键我用的是矩阵按键模块的B1按键测试的

在这里插入图片描述

ROW1与ROW2配置为输入模式上拉,COLUMN1配置输出模式

void Function_KeyCheck(){HAL_GPIO_WritePin(COLUMN1_GPIO_Port, COLUMN1_Pin, GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(ROW1_GPIO_Port, ROW1_Pin) == 0){  // 按键按下HAL_TIM_Base_Start_IT(&htim7);while(HAL_GPIO_ReadPin(ROW1_GPIO_Port, ROW1_Pin) == 0);  // 等待定时器关闭HAL_TIM_Base_Stop_IT(&htim7);if(COUNTNUMBER <= 100) KEYTIMEFLAG = 0;else KEYTIMEFLAG = 1;PRESSTIME = (float) COUNTNUMBER * 1.0 / 100;COUNTNUMBER = 0;}HAL_GPIO_WritePin(COLUMN1_GPIO_Port, COLUMN1_Pin, GPIO_PIN_SET);}

2、中断按键实现:

在这里插入图片描述
在这里插入图片描述

中断按键设置成上升沿和下降沿都会触发的模式,这样人按下按键就是下降沿这时候开定时器,松开就是上升沿,关定时器

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){  // 中断按键if(!HAL_GPIO_ReadPin(USER_Key_GPIO_Port, USER_Key_Pin)){  // 下降电平开启定时器HAL_TIM_Base_Start_IT(&htim7);}else{  // 上升电平关闭定时器并检测时间if(COUNTNUMBER <= 100) KEYTIMEFLAG = 0;else KEYTIMEFLAG = 1;PRESSTIME = (float) COUNTNUMBER * 1.0 / 100;COUNTNUMBER = 0;HAL_TIM_Base_Stop_IT(&htim7);}
}

完整代码:

Function.c

#include "Function.h"
#include "main.h"
#include "oled.h"
#include "i2c.h"
#include <stdio.h>
#include "tim.h"unsigned char KEYFLAG = 0;
unsigned char ARRAY[20];
char* LONGKEY = "long key press";
char* SHORTKEY = "short key press";
unsigned char KEYTIMEFLAG = 2;
float PRESSTIME = 0;uint32_t COUNTNUMBER = 0;  // 记录时间,这个区间必须要足够大void OLED_Write(unsigned char type, unsigned char data){unsigned char WriteData[2];WriteData[0] = type;WriteData[1] = data;HAL_I2C_Master_Transmit(&hi2c3, 0x78, WriteData, 2, 0xff);
}
void Function_OledInit(unsigned char ms){HAL_GPIO_WritePin(OLED_Power_GPIO_Port, OLED_Power_Pin, GPIO_PIN_RESET);HAL_Delay(ms);OLED_Init();
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){  // 10ms// OLED_ShowString(0, "KEY)");COUNTNUMBER ++;
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){  // 中断按键if(!HAL_GPIO_ReadPin(USER_Key_GPIO_Port, USER_Key_Pin)){  // 下降电平开启定时器HAL_TIM_Base_Start_IT(&htim7);}else{  // 上升电平关闭定时器并检测时间if(COUNTNUMBER <= 100) KEYTIMEFLAG = 0;else KEYTIMEFLAG = 1;PRESSTIME = (float) COUNTNUMBER * 1.0 / 100;COUNTNUMBER = 0;HAL_TIM_Base_Stop_IT(&htim7);}}void Function_KeyCheck(){HAL_GPIO_WritePin(COLUMN1_GPIO_Port, COLUMN1_Pin, GPIO_PIN_RESET);if(HAL_GPIO_ReadPin(ROW1_GPIO_Port, ROW1_Pin) == 0){  // 按键按下HAL_TIM_Base_Start_IT(&htim7);while(HAL_GPIO_ReadPin(ROW1_GPIO_Port, ROW1_Pin) == 0);  // 等待定时器关闭HAL_TIM_Base_Stop_IT(&htim7);if(COUNTNUMBER <= 100) KEYTIMEFLAG = 0;else KEYTIMEFLAG = 1;PRESSTIME = (float) COUNTNUMBER * 1.0 / 100;COUNTNUMBER = 0;}HAL_GPIO_WritePin(COLUMN1_GPIO_Port, COLUMN1_Pin, GPIO_PIN_SET);}void Function_MyMain(){Function_KeyCheck();if(KEYTIMEFLAG != 2){sprintf((char* )ARRAY, "%.2f s", PRESSTIME);if(KEYTIMEFLAG == 0){OLED_ShowString(0, (unsigned char* )SHORTKEY);}else if(KEYTIMEFLAG == 1){OLED_ShowString(0, (unsigned char* )LONGKEY);}OLED_ShowString(2, ARRAY);KEYTIMEFLAG = 2;}
}

Function.h

#ifndef __FUNCTION_H__
#define __FUNCTION_H__
#include "main.h"void OLED_Write(unsigned char type, unsigned char data);
void Function_OledInit(unsigned char ms);
void Function_MyMain();
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin);#endif

效果:

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【编译原理】小型语法编译器-Gradio界面设计

前言 本文部分内容来自网上搜集与个人实践。如果任何信息存在错误,欢迎读者批评指正。本文仅用于学习交流,不用作任何商业用途。 欢迎订阅专栏Gradio 文章目录 前言all/gui.pylexical_analysis.py导入库定义辅助函数 analyze_token定义词法分析函数 lexical_analysis测试代码总…

HR人才测评,什么是亲和力?如何提高亲和力?

什么是亲和力&#xff1f; 无论是熟人还是陌生人&#xff0c;在沟通之时&#xff0c;一些特定的人群总是给人一种非常融洽的感觉&#xff0c;让人在与其聊天之时没有任何的防备&#xff0c;可以畅所欲言&#xff0c;而这样的人就是具备亲和力的人。 在职场之中&#xff0c;…

常见的MySQL语句类型及其基础用法

MySQL语句主要用于在MySQL数据库管理系统中执行各种操作&#xff0c;包括数据的检索、插入、更新、删除以及数据库结构的管理。下面是一些常见的MySQL语句类型及其基础用法详解&#xff1a; 1. SELECT 语句 - 查询数据 最基本的数据检索语句&#xff0c;用于从数据库中选取数…

uniapp 解决华为上架被拒问题,APP在申请敏感权限时,应同步说明权限申请的使用目的

1、store/modules/permission.js // app权限申请处理 const state {// 处理应用程序权限请求CAMERA: false,WRITE_EXTERNAL_STORAGE: false,ACCESS_FINE_LOCATION: false,CALL_PHONE: false,isIos: uni.getSystemInfoSync().platform ios,mapping: {CAMERA: {title: 摄像头权…

Pytorch入门需要达到的效果

会搭建深度学习环境和依赖包安装 使用Anaconda创建环境、在pytorch官网安装pytorch、安装依赖包 会使用常见操作&#xff0c;例如matmul&#xff0c;sigmoid&#xff0c;softmax&#xff0c;relu&#xff0c;linear matmul操作见文章torch.matmul()的用法 sigmoid&#xff0…

Java多线程(02)

一、如何终止线程 终止线程就是要让 run 方法尽快执行结束 1. 手动创建标志位 可以通过在代码中手动创建标志位的方式&#xff0c;来作为 run 方法的执行结束条件&#xff1b; public static void main(String[] args) throws InterruptedException {boolean flag true;Thr…

Flutter 中的 CupertinoTabBar 小部件:全面指南

Flutter 中的 CupertinoTabBar 小部件&#xff1a;全面指南 在 Flutter 的 Cupertino 组件库中&#xff0c;CupertinoTabBar 是一个用于创建 iOS 风格底部导航栏的 widget。它为用户提供了一个直观的界面&#xff0c;可以快速在不同的标签页之间切换。本文将详细介绍 Cupertin…

MySQL分库分表:原理、实现与优化

推荐一个程序员的常用工具网站&#xff0c;嘎嘎好用&#xff1a;程序员常用工具 云服务器限时免费领&#xff1a;轻量服务器2核4G MySQL分库分表&#xff1a;原理、实现与优化 在现代互联网应用中&#xff0c;随着数据量的迅速增长和访问量的激增&#xff0c;单个数据库的性…

基于AT89C52单片机的智能窗帘系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/89276984?spm1001.2014.3001.5503 C 源码仿真图毕业设计实物制作步骤07 智能窗户控制系统学院&#xff08;部&#xff09;&#xff1a; 专 业&#xff1a; 班 级&…

双指针法和链表练习题(2024/5/28)

1面试题 02.07. 链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xf…

系统管理、磁盘分区

系统管理 业务层面&#xff1a;为了满足一定的需求所做的特定操作。 硬盘是什么&#xff0c;硬盘的作用&#xff1a; **硬盘&#xff1a;**计算机的存储设备&#xff0c;机械硬盘是由一个或者多个磁性的盘组成&#xff0c;可以在盘片上进行数据的读写。 连接方式&#xff1a…

【Rust日报】Rust 中的形式验证

文章 - 未来的愿景&#xff1a;Rust 中的形式验证 这篇文章回顾了形式化验证的基本概念&#xff0c;作者展示了如何使用 Hoare triples 来描述和推理程序的正确性&#xff0c;以及如何使用分离逻辑来解决验证的复杂性。文章还解释了为什么 Rust 适用于形式化验证&#xff0c;以…

go ast语义分析实现指标计算器

什么是AST 首先我们要知道AST是什么&#xff08;Abstract Syntax Tree&#xff0c;AST&#xff09;&#xff0c;简称为语法树&#xff0c;是go语言源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构&#xff0c;树上的每个节点都表示源代码中的一种结构。 …

SCSS基本使用:解锁CSS预处理器的高效与优雅

SCSS基本使用&#xff1a;解锁CSS预处理器的高效与优雅 一、SCSS初探&#xff1a;从CSS到预处理的飞跃1.1 SCSS基础概念1.2 安装与使用安装Sass编译SCSS 二、SCSS核心特性与实践2.1 变量2.2 嵌套2.3 混合&#xff08;Mixins&#xff09;2.4 继承2.5 运算 三、实战技巧与最佳实践…

Python怎么得到 xxx/xxx/xxx/abc.bag中的abc.bag?

在Python中&#xff0c;从一个完整的文件路径中提取文件名&#xff08;如abc.bag&#xff09;&#xff0c;可以使用os.path模块中的basename函数。下面是一个例子&#xff1a; python import os # 假设这是你的完整文件路径 full_path "xxx/xxx/xxx/abc.bag" # 使…

我的心情JSP+Servlet+JDBC+MySQL

系统概述 本系统采用JSPServletJDBCMySQL技术进行开发&#xff0c;包括查看我的心情列表&#xff0c; 编辑我的心情信息、新增我的心情。使用方法 将项目从idea中导入&#xff0c;然后配置项目的结构&#xff0c;包括jdk,库&#xff0c;模块&#xff0c;项目&#xff0c;工件…

基于低代码的数智化融通研究

低代码平台简介 在信息化时代的浪潮中&#xff0c;软件应用开发扮演着至关重要的角色。然而&#xff0c;传统的软件开发方式往往需要开发人员具备深厚的编程基础和丰富的经验&#xff0c;这使得应用开发的门槛较高&#xff0c;开发周期较长&#xff0c;效率相对较低。为了解决这…

QT 自定义协议TCP传输文件

后面附带实例的下载地址 一、将文件看做是由:文件头+文件内容组成,其中文件头包含文件的一些信息:文件名称、文件大小等。 二、文件头单独发送,文件内容切块发送。 三、每次发送信息格式:发送内容大小、发送内容类型(文件头或是文件块内容)、文件块内容。 四、效果展…

基于springboot实现政府管理系统项目【项目源码+论文说明】

基于springboot实现政府管理系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff…

饲料粉碎混合机组:打造精细化养殖

饲料粉碎混合机组是畜牧业和养殖业中不可或缺的设备。它集饲料粉碎和混合于一体&#xff0c;可以高效地处理各种饲料原料&#xff0c;提高饲料的均匀度和营养价值。 具体来说&#xff0c;饲料粉碎混合机组的主要功能包括将饲料原料进行粉碎&#xff0c;增加其表面积和调质粒度…