欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  互联网

蓝桥杯嵌入式短按键分享

程序员文章站 2022-03-27 20:42:46
不管那一届比赛,按键是必考的,第十一届考的短按键,考的也很简单,在这里就分享一下我经常用的短按键处理程序吧!!!短按键相关的宏定义及变量定义#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_R...

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

短按键

  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