蓝桥杯嵌入式短按键分享
不管那一届比赛,按键是必考的,第十一届考的短按键,考的也很简单,在这里就分享一下我经常用的短按键处理程序吧!!!
短按键
- 相关的宏定义及变量定义
#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
- 初始化代码以及按键读取函数
#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;
}
}
}
- 按键处理函数
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
上一篇: 实现arduino和esp8266的连接
下一篇: 前端初学了解