蓝桥杯嵌入式赛道复习笔记1(按键控制LED灯,双击按键,单击按键,长按按键)

硬件原理解释

这张图展示了一个简单的按键电路原理图,其中包含四个按键(PB0、PB1、PB2、PB3、PA0),每个按键通过一个10kΩ的上拉电阻连接到VDD(电源电压),并接地(GND)。

图中的按键电路工作原理如下:

  1. 未按下按键时:当按键未被按下时,由于上拉电阻的存在,按键的引脚(例如PB1)通过电阻R2被拉高到VDD电压,此时为高电平。

  2. 按下按键按下时:当按键被按下时,按键的引脚直接连接到地(GND),此时为低电平。

  3. 输入模式:图中描述了输入模式为"既不是上拉输入也不是下拉输入",这意味着按键的引脚在未被按下时为高电平,按下时为低电平。

  4. 按键去抖:由于机械按键在按下和释放时可能会产生抖动,电路中通常会加入去抖电路来稳定信号。图中没有显示去抖电路,但实际应用中可能需要在软件中实现去抖处理。

  5. 按键状态检测:微控制器(MCU)通过检测按键引脚的电平变化来判断按键是否被按下。当检测到低电平时,认为按键被按下;当检测到高电平时,认为按键未被释放。

  6. 电路连接:每个按键通过其引脚(例如PB1)连接到微控制器的相应引脚(例如B2),微控制器通过扫描这些引脚来检测按键的状态。

总结来说,这个电路图展示了一个基本的按键输入按键电路设计,其中按键通过上拉电阻连接到VDD,按下时引脚接地,微控制器通过检测引脚的电平变化来检测按键状态。这种设计简单且常用于各种电子设备中。

实际操作

cubeMX配置

1.gpio的配置

2.TIM时钟的开启

3.ARR,PSC的配置

代码

按键单击,双击,长按

cpp 复制代码
#include "key_disply.h"
#include "gpio.h"

uint8_t now_state_1;
uint8_t last_state_1=1;
//extern uint32_t count;
uint32_t last_press_time = 0;
uint8_t click_count = 0;     
void key_text1(){
	now_state_1=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
	if(now_state_1==0&&last_state_1==1){
		  TIM2->CNT=0;
		  HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9, GPIO_PIN_SET);
		
        if (HAL_GetTick() - last_press_time <= DOUBLE_CLICK_TIME) {
            click_count++;  
        } else {
            click_count = 1; 
        }
        
        last_press_time = HAL_GetTick(); 
	}
	if(now_state_1==0&&last_state_1==0){
		 if(TIM2->CNT>=10000){
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_RESET);
		 }
		  
	}
	if(now_state_1==1&&last_state_1==0){
	 if(click_count == 1){
		 if(TIM2->CNT<10000){
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_RESET);
		 }
	 }
		
		if (click_count == 2) {
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); 
			HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_15);  
            HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
      click_count = 0;  
      }

		
	}
	if(now_state_1==1&&last_state_1==1){
		    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_SET);
			HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2, GPIO_PIN_RESET);
	}
	last_state_1=now_state_1;
	
}
相关推荐
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇19)
java·笔记·学习·学习笔记
新子y3 小时前
【小白笔记】最大交换 (Maximum Swap)问题
笔记·python
你要飞7 小时前
Hexo + Butterfly 博客添加 Live2D 看板娘指南
笔记
ajsbxi10 小时前
【Java 基础】核心知识点梳理
java·开发语言·笔记
呱呱巨基10 小时前
vim编辑器
linux·笔记·学习·编辑器·vim
新子y10 小时前
【小白笔记】普通二叉树(General Binary Tree)和二叉搜索树的最近公共祖先(LCA)
开发语言·笔记·python
聪明的笨猪猪10 小时前
Java JVM “调优” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
爱学习的uu11 小时前
CURSOR最新使用指南及使用思路
人工智能·笔记·python·软件工程
YuCaiH11 小时前
Linux文件处理
linux·笔记·嵌入式
Cathy Bryant11 小时前
大模型损失函数(二):KL散度(Kullback-Leibler divergence)
笔记·神经网络·机器学习·数学建模·transformer