嵌入式蓝桥杯学习6 定时中断按键(短按 长按 双击)

前面的cubemx配置都和定时中断的一样,详情请看上文,这篇我们主要写按键相关的代码。

前面的外部中断的按键,还有直接写的按键函数都不适用于比赛,各有不同缺点。在比赛中按键又是个很重要的外设,那如何实现按键呢,请看以下的内容。

首先,新建两个文件(key.c 和 key.h)用于放置关于按键的函数。

前面我们将定时器设置为每隔10ms进行一次中断。考虑到按键抖动问题。如果连着两次10ms的判断都是低电平,就会有真正的按键被按下。

按键短按

按键读取函数

//low return 0
//high return 1
uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}

按键服务函数

struct Bkeys
{uint8_t age;uint8_t flag;
}
struct Bkeys bkey[5]={0,0};
void key_serv()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key.sta].age>1) bkey[key_sta].flag=1;}else{for(int i=0;i<5;++)bkey[i].age=0;}
}

中断回调函数


void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{key_serv();
}

my_main.c 

extern struct Bkeys bkey[];
void loop()
{if(bkey[1].flag==1){sprintf(text,"    KEY1   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[1].flag=0;}if(bkey[2].flag==1){sprintf(text,"    KEY2   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[2].flag=0;}
}

按键长按 

按键服务函数

struct Bkeys
{uint8_t age;uint8_t short_flag;uint8_t long_flag;uint8_t press;
}
struct Bkeys bkey[5]={0,0};
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key.sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;++){if(bkey[i].press==1&&bkey[i].long_flag=0) bkey[i].short_flag=1;bkey[i].press=0;bkey[i].age=0;bkey[i].long_flag=0;}}if(bkey[key.sta].age>69) bkey[key_sta].long_flag=1;
}

中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)key_serv_long();
}

my_main.c

 实现步进自增功能

extern struct Bkeys bkey[];
void loop()
{static uint16_t temp;if(bkey[1].short_flag==1){sprintf(text,"    KEY1   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[1].short_flag=0;}if(bkey[2].short_flag==1){sprintf(text,"    KEY2   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[2].short_flag=0;}if(bkey[1].long_flag==1){sprintf(text,"    KEY1   LONG  !  %d  ",temp);LCD_DisplayStringLine(Line8,(uint8_t*)text);temp++;}if(bkey[2].long_flag==1){sprintf(text,"    KEY2   LONG  !   %d ",temp);LCD_DisplayStringLine(Line8,(uint8_t*)text);temp++;}
}

 实现按超过2s后松开

按键服务函数
struct Bkeys
{uint8_t age;uint8_t short_flag;uint8_t long_flag;uint8_t press;
}
struct Bkeys bkey[5]={0,0};
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key.sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;++){if(bkey[key.sta].age>69) bkey[key_sta].long_flag=1;if(bkey[i].press==1&&bkey[i].long_flag=0) bkey[i].short_flag=1;bkey[i].press=0;bkey[i].age=0;}}}

 

extern struct Bkeys bkey[];
void loop()
{static uint16_t temp;if(bkey[1].short_flag==1){sprintf(text,"    KEY1   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[1].short_flag=0;}if(bkey[2].short_flag==1){sprintf(text,"    KEY2   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[2].short_flag=0;}if(bkey[1].long_flag==1){sprintf(text,"    KEY1   LONG  !   ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[1].long_flag=0;}if(bkey[2].long_flag==1){sprintf(text,"    KEY2   LONG  !  ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[2].long_flag=0;}
}

按键双击 

按键服务函数

struct Bkeys
{uint8_t age;uint8_t short_flag;uint8_t long_flag;uint8_t press;uint8_t double_ageEN;uint8_t double_age;uint8_t double_flag;
}
struct Bkeys bkey[5]={0,0};
void key_serv_double()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key.sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<5;++){if(bkey[i].double_ageEN=1&&bkey[i].press==1){bkey[i].double_flag=1;bkey[i].double_age=0;bkey[i].double_ageEN=0;}if(bkey[i].press==1&&bkey[i].long_flag==0) bkey[i].double_ageEN=1;if(bkey[i].double_ageEN==1) bkey[i].double_age++;if(bkey[i].double_ageEN==1&&bkey[i].double_age>20){bkey[i].short_flag=1;bkey[i].double_age=0;bkey[i].double_ageEN=0;}bkey[i].press=0;bkey[i].age=0;}}}

中断回调函数

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)key_serv_double();
}

 my_main.c

extern struct Bkeys bkey[];
void loop()
{static uint16_t temp;if(bkey[1].short_flag==1){sprintf(text,"    KEY1   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[1].short_flag=0;}if(bkey[2].short_flag==1){sprintf(text,"    KEY2   DOWN  !    ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[2].short_flag=0;}if(bkey[1].long_flag==1){sprintf(text,"    KEY1   LONG  !  %d  ",temp);LCD_DisplayStringLine(Line8,(uint8_t*)text);temp++;}if(bkey[2].long_flag==1){sprintf(text,"    KEY2   LONG  !   %d ",temp);LCD_DisplayStringLine(Line8,(uint8_t*)text);temp++;}if(bkey[1].double_flag==1){sprintf(text,"    KEY1   DOUBLE  !  ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[1].double_flag=0;}if(bkey[2].double_flag==1){sprintf(text,"    KEY2   DOUBLE !  ");LCD_DisplayStringLine(Line8,(uint8_t*)text);bkey[2].double_flag=0;}
}

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

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

相关文章

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束&#xff0c;专业819信号系统与信号处理140&#xff0c;总分420&#xff0c;终于梦圆交大&#xff0c;高考时敢都不敢想目标&#xff0c;现在已经成为现实&#xff0c;考研后劲很大&#xff0c;这一年的复习经历&#xff0c;还是历历在目&#xff0c;整理一下&#xff…

K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常

一、背景 程序在运行过程中&#xff0c;突然无法访问&#xff0c;发现后台接口也无法访问&#xff1b;查看kuboard&#xff0c;发现报如下异常&#xff1a;The node had condition: [DiskPressure]. 继续查看磁盘使用率&#xff0c;发现系统盘使用率已经高达93%。问题前后呼应…

【工具变量】上市公司企业违规数据(企业当年是否违规、企业当年违规的次数)2000-2022年

一、测算方式&#xff1a;参考C刊《当代财经》纪亚方&#xff08;2023&#xff09;老师的研究&#xff0c;通过对上市公司被处罚涉及的年份进行追溯&#xff0c;为了保证企业违规行为变量度量的准确性&#xff0c;将追溯到公司被处罚的年份定义为违规年份。 采用两个指标对企业…

视频孪生携手视联网 智汇云舟亮相中国电信2024数字科技生态大会

12月3日&#xff0c;由中国电信主办的“2024数字科技生态大会”在广州盛大开幕。活动现场&#xff0c;前沿科技与创新理念交相辉映&#xff0c;数字科技未来蓝图徐徐展开。智汇云舟作为中国电信的战略合作伙伴&#xff0c;受邀出席本次活动。 展会期间&#xff0c;以“天翼视联…

Unity 使用LineRenderer制作模拟2d绳子

效果展示&#xff1a; 实现如下&#xff1a; 首先&#xff0c;直接上代码&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineFourRender : MonoBehaviour {public Transform StartNode;public Transform MidNod…

力扣-图论-4【算法学习day.54】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非…

【射频IC进阶实践教程】2.6 LNA版图设计及DRC/LVS验证

射频集成电路的版图设计非常关键&#xff0c;他对寄生参数非常敏感&#xff0c;需要使其最小化。还需要注意相互耦合的方式本次课程主要介绍射频IC的一些相关布局和连线方面的考虑。 一、版图设计 1. 版图的元件布局 首先打开对应的原理图 点击进行版图设计 由于已经有做好的…

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现&#xff0c;因为官方有很多相关的功能和方法…

Spring Bean 的生命周期和获取方式

优质博文&#xff1a;IT-BLOG-CN 一、Spring Bean 的生命周期&#xff0c;如何被管理的 对于普通的 Java对象&#xff0c;当 new的时候创建对象&#xff0c;当它没有任何引用的时候被垃圾回收机制回收。而由 Spring IoC容器托管的对象&#xff0c;它们的生命周期完全由容器控…

【Spring MVC篇】返回响应

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 一、返回静态页面…

使用Python创建API服务器并打包成exe文件

本文来记录下使用Python创建API服务器并打包成exe文件 文章目录 概述简述API服务器创建打包API服务器为exe文件本文小结 概述 在软件开发中&#xff0c;API服务器是连接前端和后端服务的桥梁&#xff0c;而Python因其丰富的库和框架&#xff0c;如Flask、Django等&#xff0c;成…

MHA切换过程

MHA&#xff08;Master High Availability&#xff09;是一套用于MySQL数据库的高可用性解决方案&#xff0c;它能够在主服务器发生故障时自动将一个从服务器提升为新的主服务器&#xff0c;从而实现数据库服务的持续可用。MHA的切换过程主要包括以下几个步骤&#xff1a; 1. …

NextUI 教程:打造美观高效的React UI

NextUI 教程&#xff1a;打造美观高效的React UI 项目地址:https://gitcode.com/gh_mirrors/ne/nextui 1. 项目介绍 NextUI 是一个轻量级、快速且现代化的React UI库&#xff0c;提供了一系列优雅的组件以帮助开发者构建令人印象深刻的Web应用。它注重性能和用户体验&#x…

Python和Java后端开发技术对比

在当今互联网技术飞速发展的时代&#xff0c;后端开发扮演着至关重要的角色。Python和Java作为两大主流的后端开发语言&#xff0c;各自具备独特的优势和应用场景。让我们深入了解这两种技术的特点和选择建议。 Java后端开发一直是企业级应用的首选方案。它以强大的类型系统、…

Java HashMap

HashMap 是一个散列表&#xff0c;它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口&#xff0c;根据键的 HashCode 值存储数据&#xff0c;具有很快的访问速度&#xff0c;最多允许一条记录的键为 null&#xff0c;不支持线程同步。 HashMap 是无序的&#x…

模型案例:| 帐篷检测模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世&#xff0c;它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力&#xff0c;为人工智能技术的发展开辟了新的可能性。同时&#xff0c;人工智能技术正在进入各种应用领…

实验日志——DETR

DETR训练日志 1. 代码来源 代码源自作者的Github: https://github.com/facebookresearch/detr?tabreadme-ov-file 2. 数据来源 在DETR中只使用了COCO2017数据集&#xff0c;其中训练集有118288张图像&#xff0c;验证集有5001张数据&#xff0c;测试集有40671张数据&#…

18、IO流:

18、IO流&#xff1a; 这一章很枯燥无聊~ 文件&#xff1a; 什么是文件&#xff1a; 文件&#xff0c;对我们并不陌生&#xff0c;文件时保存数据的地方&#xff0c;比如我们经常使用的word文档&#xff0c;txt文档&#xff0c;excel文档…都是文件。它既可以保存一张图片&…

24.两两交换链表中的节点 python

两两交换链表中的节点 题目题目描述示例 1&#xff1a;示例 2&#xff1a;示例 3&#xff1a;提示&#xff1a;题目链接 题解解题思路python实现代码解读提交结果 题目 题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须…

解决 git 报错 “fatal: unable to access ‘https://github.com/.../.git‘: Recv failure Connection was rese

目录 前言 方法一&#xff1a;取消代理设置 方法二&#xff1a;设置系统代理&#xff08;推荐&#xff09; 方法三 方法四&#xff1a;不挂梯子时 前言 在使用 Git/Git小乌龟 进行代码管理的过程中&#xff0c;经常会遇到各种各样的问题&#xff0c;其中之一就是在执行 g…