32单片机——KEY
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);
}
}