蓝桥杯嵌入式入门指南-按键KEY(TIM6)【3】

devtools/2024/11/29 8:03:55/

在bsp文件夹中新建key.c和key.h
PB0 PB1 PB2 PA0设置为GPIO_input,模式为上拉
在这里插入图片描述
打开TIM
输入频率/(PSC*Counter)=中断频率
设置为1ms的中断
在这里插入图片描述
tips:一定要记得开NVIC中断
在这里插入图片描述
点击生成代码
将key.c添加到User文件夹
记得在all.h中添加key.h,tim.h头文件

key.c

#include "key.h"struct Bkeys bkey[5] = {0,0};
//low 0
//high 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;
}void key_serv()//包含短按和长按
{uint8_t key_sta = key_read(); if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age == 2) bkey[key_sta].press = 1;}else{for (int i=0;i<5;i++) {if(bkey[i].press==1 && bkey[i].long_flag==0) bkey[i].short_flag = 1;bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>69) bkey[key_sta].long_flag=1;
}

key.h

#ifndef KEY_H
#define KEY_H
#include "all.h"void key_serv(void);
struct Bkeys
{uint8_t age;uint8_t short_flag;uint8_t long_flag;uint8_t press;};#endif

记得在setup里初始化tim6
all.c

#include "all.h"uint8_t led_sta=0x20;//LED初始化参数
extern struct Bkeys bkey[];//按键存储void LED_Disp(uint8_t dsLED)//LED控制
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);//所有LED熄灭HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);//左移8位。控制C8~C15引脚,值为1的点亮HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);//开锁存器HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);//关锁存器
}
void LED_Chg(uint8_t num,uint8_t sta)//单独控制一个LED
{uint8_t pos = 0x01<<(num-1);led_sta =(led_sta&(~pos))|(pos*sta);LED_Disp(led_sta);
}void setup()
{HAL_TIM_Base_Start_IT(&htim6);//开启TIMLED_Disp(0x00);}void loop()
{if(bkey[1].short_flag==1){LED_Chg(1,1);bkey[1].short_flag = 0;//用完记得清零}if(bkey[1].long_flag==1){LED_Chg(2,1);}}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM6)key_serv();}

http://www.ppmy.cn/devtools/137871.html

相关文章

【CSS】clip-path 属性(剪裁显示区域)

文章目录 属性用法&#xff1a; 使用背景&#xff1a;遇到这样一个需求&#xff0c;嵌入一个网页到系统&#xff0c;但是不需要他顶部的导航栏&#xff0c;这时候就可以使用clip-path 属性剪裁到顶部导航栏&#xff0c;把网页相当于照片&#xff0c;把不想要的部分剪掉就好了 使…

【机器学习】——朴素贝叶斯模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

Java 异常处理

目录&#xff1a; 碎碎念&#xff1a; 题目&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 碎碎念&#xff1a; 我知道我是低代码&#xff0c;但是只是完成个作业&#xff0c;所以就随便写了&#xff0c;能过测试点就行&#xff0c;没想到有个测试点死…

【优选算法】位运算

目录 常见位运算总结1、基础位运算2、给一个数n&#xff0c;确定它的二进制位的第x位上是0还是13、将一个数n的二进制位的第x位改成14、将一个数n的二进制位的第x位改成05、位图的思想6、提取一个数n的二进制位中最右侧的17、将一个数n的二进制位中最右侧的1变为08、位运算的优…

【C++】7000字介绍map容器和set容器的功能和使用

目录 一、关联式容器和序列式容器 二、键值对,> 三、树形结构的关联式容器 四、set容器&#xff08;key模型&#xff09; 1、文档官网 2、功能介绍&#xff1a; 3、注意事项&#xff1a; 4、基本使用&#xff0c;更多接口可查看官网&#xff1a; &#xff08;1&…

【代码随想录|贪心算法02】

122.买股票的最佳时机 题目链接https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii 好巧妙的一道题啊&#xff0c;做之前完全不会想到这种解法。 局部最优&#xff1a;收集每天正利润 全局最优&#xff1a;求得最大利润 这道题只让你返回最大的利润和&…

大数据 MapReduce基础实战

一、关于此次实践 1、实战简介 MapReduce是Hadoop的核心功能之一&#xff0c;掌握它对学习Hadoop至关重要。Hadoop Map/Reduce是一个使用简易的软件框架&#xff0c;基于它写出来的应用程序能够运行在由上千个商用机器组成的大型集群上&#xff0c;并以一种可靠容错的方式并行…

定长子串中元音的最大数目

力扣链接:1456. 定长子串中元音的最大数目 - 力扣&#xff08;LeetCode&#xff09; 给你字符串 s 和整数 k 。 请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 示例1: 输入&#xf…