蓝桥杯嵌入式短按键分享

不管那一届比赛,按键是必考的,第十一届考的短按键,考的也很简单,在这里就分享一下我经常用的短按键处理程序吧!!!

短按键

  1. 相关的宏定义及变量定义
#ifndef _KEY_H
#define _KEY_H

#include "stm32f10x.h"
typedef enum
{
	K1=1,
	K2=2,
	K3=3,
	K4=4,
	K_OFF,
}KEY_ENUM;

#define KEY1_Read  (GPIOA->IDR&GPIO_Pin_0)
#define KEY2_Read  (GPIOA->IDR&GPIO_Pin_8)
#define KEY3_Read  (GPIOB->IDR&GPIO_Pin_1)
#define KEY4_Read  (GPIOB->IDR&GPIO_Pin_2)

void KEY_Init(void);
void LED_Read(void);
#endif
  1. 初始化代码以及按键读取函数
#include "key.h"
#include "main.h"

void KEY_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_Init(GPIOA,&GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1;
  GPIO_Init(GPIOB,&GPIO_InitStructure);
  }
  
KEY_ENUM KEY_Short=K_OFF;//枚举型变量
void LED_Read(void)
{
	static u8 KEY_Clear=0;
	static FlagStatus KEY_Wait=RESET;
	static KEY_ENUM KEY_Temp=K_OFF;	
	if(KEY1_Read==0||KEY2_Read==0||KEY3_Read==0||KEY4_Read==0)
	{
		KEY_Clear++;
		if(KEY_Clear>=3) //按键消抖
		{
			if(KEY1_Read==0) KEY_Temp=K1;
			else if(KEY2_Read==0) KEY_Temp=K2;
			else if(KEY3_Read==0) KEY_Temp=K3;
			else if(KEY4_Read==0) KEY_Temp=K4;
			KEY_Wait=SET;
		}
  }
	else  //按键抬起时,KEY_Short才发生变化
	{
		KEY_Clear=0;
		if(KEY_Wait!=RESET)
		{
			KEY_Wait=RESET;
			KEY_Short=KEY_Temp;
		}
	}
}
  1. 按键处理函数
void KEY_Set(void)
{
	LED_Read(); //读取按键值
	switch(KEY_Short)
	{
		case K_OFF: break;
		case K1:
		{
			KEY_Short=K_OFF;
			......
			break;
		}
		case K2:
		{
			KEY_Short=K_OFF;
			......
			break;
		}
		case K1:
		{
			KEY_Short=K_OFF;
			......
			break;
		}
		case K2:
		{
			KEY_Short=K_OFF;
			......
			break;
		}
		case K3:
		{
			KEY_Short=K_OFF;
			......
			break;
		}
		case K4:
		{
			KEY_Short=K_OFF;
			......
			break;
		}
	}
}

注意:这里每个case语句中都要有KEY_Short=K_OFF;否则若K1按下,KEY_Short一直为K1,直到下一次有按键按下。

参赛体验

上星期参加了第十一届的蓝桥杯嵌入式的比赛,总体来说今年考的不难,逻辑很简单(与第八届的相比?)。试题涉及到了ADC,PWM波输出(我用的是PWM比较输出,因为要求的频率不一样),按键,LED。
话说,好好准备,这个比赛还是不难的,寒假里我准备了不到一个月吧,先把每个模块学会了,之后就是刷往年的题,刷了不少题,找了五六套题做了两遍,后来因为疫情,比赛一直推到现在。而且今年的电赛和蓝桥杯重合了,因为今年电赛是省赛,就果断放弃了电赛去准备蓝桥杯,又准备了一星期,做了四套题,最后背了背选择题,就这样进考场了。题目不难,要说难得话就是PWM波的输出了,要是不会PWM比较输出,可能会有难度(幸好我提前看了(●ˇ∀ˇ●)好机智)。比赛时间是从上午九点到下午两点,我不到12点就已经把所有的代码写完了,开始下到板子上验证,我都想打我自己,因为示波器不会用,PWM波一直出不来,我以为是我代码的问题,天那,比赛快结束了我才发现是我示波器没用对,匆匆忙忙的改了一些小问题就交卷了,哎。现在卑微的坐等结果。今年进不了国赛那就明年,必须公费去北京玩!!!!

有时间会写一次第十一届程序题的参考代码(看心情)

本文地址:https://blog.csdn.net/weixin_45849079/article/details/109260957

(0)
上一篇 2022年3月22日
下一篇 2022年3月22日

相关推荐