目录

32单片机KEY

32单片机——KEY

https://i-blog.csdnimg.cn/direct/646991106dd04946b091e6c55bce9fef.png

KEY0、KEY1和KEY2是低电平有效的,而KEY_UP则是高电平有效的,并且外部都没有上下拉电阻,所以需要在STM32F103内部设置上下拉,来确定设置空闲电平状态

代码

通过开发板上的三个独立按键控制LED灯:KEY_UP控制蜂鸣器翻转,KEY1控制LED1翻转,KEY2控制LED0翻转,KEY0控制LED0/LED1同时翻转

led.h

#ifndef _LED_H

#define _LED_H

//led初始化

void led_init(void);

#endif

led.c

#include “./BSP/LED/led.h”

#include “./SYSTEM/sys/sys.h”

//led初始化

void led_init(void){

GPIO_InitTypeDef g_gppio_struct;

__HAL_RCC_GPIOE_CLK_ENABLE();  //使能时钟–PE5

__HAL_RCC_GPIOB_CLK_ENABLE();  //使能时钟–PB5

g_gppio_struct.Pin=GPIO_PIN_5;

g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

g_gppio_struct.Pull=GPIO_NOPULL;  //无上下拉

g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速

HAL_GPIO_Init(GPIOE,&g_gppio_struct);  //初始化LED1

g_gppio_struct.Pin=GPIO_PIN_5;

g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

g_gppio_struct.Pull=GPIO_NOPULL;  //无上下拉

g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速

HAL_GPIO_Init(GPIOB,&g_gppio_struct);  //初始化LED0

}

beep.h

#ifndef _BEEP_H

#define _BEEP_H

#include “./SYSTEM/sys/sys.h”

//beep初始化

void beep_init(void);

void set_beep(uint8_t flag);

#endif

beep.c

#include “./BSP/BEEP/beep.h”

//beep初始化

void beep_init(void){

GPIO_InitTypeDef g_gppio_struct;

__HAL_RCC_GPIOB_CLK_ENABLE();  //使能beepIO口时钟

g_gppio_struct.Pin=GPIO_PIN_8;  //引脚号

g_gppio_struct.Mode=GPIO_MODE_OUTPUT_PP;  //推挽输出

g_gppio_struct.Pull=GPIO_NOPULL;  //没有上下拉

g_gppio_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速

HAL_GPIO_Init(GPIOB,&g_gppio_struct);

}

void set_beep(uint8_t flag){

if(flag){

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_SET);

}else{

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_8,GPIO_PIN_RESET);

}

}

key.h

#ifndef _KEY_H

#define _KEY_H

#include “./SYSTEM/sys/sys.h”

#include “./SYSTEM/delay/delay.h”

#define KEY0 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_4)

#define KEY1 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_3)

#define KEY2 HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)

#define KEY_UP HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)

//key初始化

void key_init(void);

//按键扫描函数

uint8_t scan(uint8_t mode);

#endif

key.c

#include “./BSP/KEY/key.h”

//key初始化

/*

KEY0—-PE4—-输入上拉

KEY1—-PE3—-输入上拉

KEY2—-PE2—-输入上拉

KEY_UP—-PA0—-输入下拉

*/

void key_init(void){

GPIO_InitTypeDef g_key_struct;

//时钟使能

__HAL_RCC_GPIOE_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

//KEY0

g_key_struct.Pin=GPIO_PIN_4;

g_key_struct.Mode=GPIO_MODE_INPUT;  //输入模式

g_key_struct.Pull=GPIO_PULLUP;  //上拉

g_key_struct.Speed=GPIO_SPEED_FREQ_HIGH;  //高速

HAL_GPIO_Init(GPIOE,&g_key_struct);

//KEY1

g_key_struct.Pin=GPIO_PIN_3;

HAL_GPIO_Init(GPIOE,&g_key_struct);

//KEY2

g_key_struct.Pin=GPIO_PIN_2;

HAL_GPIO_Init(GPIOE,&g_key_struct);

//KEY_UP

g_key_struct.Pin=GPIO_PIN_0;

g_key_struct.Pull=GPIO_PULLDOWN;  //下拉

HAL_GPIO_Init(GPIOA,&g_key_struct);

}

//按键扫描函数

uint8_t scan(uint8_t mode){

static uint8_t key_up = 1; /按键按松开标志/

uint8_t keyval= 0;

if (mode)key_up = 1; /支持连按/

if (key_up && ( KEY0 == 0 ||KEY1 == 0 ||KEY2 == 0 ||KEY_UP == 1)){ /按键松开标志为1,且有任意一个按键按下了/

delay_ms(20);  /去抖动/

key_up = 0;

if (KEY0== 0) keyval=1;

if (KEY1== 0) keyval=2;

if (KEY2== 0) keyval=3;

if (KEY_UP== 1) keyval=4;

}else if (KEY0== 1 && KEY1 == 1 && KEY2 == 1 && KEY_UP == 0){ /没有任何按键按下,标记按键松开/

key_up = 1;

}

return keyval; /返回键值/

}

main.c

#include “./SYSTEM/sys/sys.h”

#include “./SYSTEM/delay/delay.h”

#include “./BSP/LED/led.h”

#include “./BSP/BEEP/beep.h”

int main(void){

HAL_Init();

sys_stm32_clock_init(RCC_PLL_MUL9);

delay_init(72);

led_init();

beep_init();

while(1){

set_beep(1);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);  //熄灭

HAL_Delay(2000);

set_beep(0);

HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_RESET);  //点亮

HAL_Delay(2000);

}

}