不管那一屆比賽,按鍵是必考的,第十一屆考的短按鍵,考的也很簡單,在這里就分享一下我經常用的短按鍵處理程式吧!!!
短按鍵
- 相關的宏定義及變數定義
#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://www.uj5u.com/yidong/191924.html
標籤:其他
下一篇:博主聯系方式匯總(非誠勿擾)
