蓝桥杯物联网竞赛_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,一经查实,立即删除!

相关文章

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

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

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…

基于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;树上的每个节点都表示源代码中的一种结构。 …

我的心情JSP+Servlet+JDBC+MySQL

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

QT 自定义协议TCP传输文件

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

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

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

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

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

Steam游戏搬砖:靠谱吗,详细版说下搬砖中的核心内容!

可能大家也比较关注国外Steam游戏搬砖这个项目&#xff0c;最近单独找我了解的也比较多&#xff0c;其实也正常&#xff0c;因为现在市面上的项目很多都很鸡肋&#xff0c;而且很多都是一片红海&#xff0c;内卷太过严重&#xff0c;所以对于Steam的关注度也高很多&#xff0c;…

CTF-web-WP-攻防世界-1

1、view_source&#xff1a;打开开发者工具F12就能看到flag 2、robots (1)、使用目录扫描工具 工具&#xff1a;dirsearch命令&#xff1a;python dirsearch.py -u http://61.147.171.105:55644/ -e * (2)、看到下面有robots.txt文件&#xff0c;在URL后面输入&#xff0c…

INDICATOR 再c嵌入sql环境中的作用

在C语言嵌入SQL&#xff08;Embedded SQL&#xff09;的环境中&#xff0c;INDICATOR关键字用于处理数据库中的NULL值&#xff0c;以及管理与之相关联的宿主变量&#xff08;host variables&#xff09;。具体来说&#xff0c;它的作用主要体现在以下几个方面&#xff1a; NUL…

LeetCode题练习与总结:有序链表转换二叉搜索树--109

一、题目描述 给定一个单链表的头节点 head &#xff0c;其中的元素 按升序排序 &#xff0c;将其转换为平衡二叉搜索树。 示例 1: 输入: head [-10,-3,0,5,9] 输出: [0,-3,9,-10,null,5] 解释: 一个可能的答案是[0&#xff0c;-3,9&#xff0c;-10,null,5]&#xff0c;它表…

Docker安装Redis的详细教程

以下是一个使用Docker安装Redis的详细教程 1. 拉取Redis镜像 运行以下命令来从Docker Hub上拉取最新的Redis镜像&#xff1a; docker pull redis:latest如果您需要特定版本的Redis&#xff0c;可以指定版本号&#xff1a; docker pull redis:6.2.72. 运行Redis容器 以下命…

分享个自用的 Nginx 加强 WordPress 防护的规则

Nginx WordPress 的组合是目前非常普及的组合了&#xff0c;我们完全可以借助 Nginx 规则来加强 WordPress 的防护&#xff0c;提高 WordPress 的安全性&#xff0c;今天明月就给大家分享个自用的 Nginx 针对 WordPress 的防护规则&#xff0c;部分规则大家只需要根据自己的需要…

基于vuestic-ui实战教程 - 页面篇

1. 简介 前面介绍了基本的内容比如如何获取动态数据&#xff0c;下面就到登录进来后的页面实现了&#xff0c;相信各位读者或多或少都有 element-uijs 的实战经历&#xff0c;那么 vuestic-uits 实现的页面又该如何写呢&#xff1f;带着疑问开启今天的学习&#xff08;声明由于…

Linux系统编程学习笔记

1 前言 1.1 环境 平台&#xff1a;uabntu20.04 工具&#xff1a;vim,gcc,make 1.2 GCC Linux系统下的GCC&#xff08;GNU Compiler Collection&#xff09;是GNU推出的功能强大、性能优越的多平台编译器&#xff0c;是GNU的代表作品之一。gcc是可以在多种硬体平台上编译出可执…