实验目的:通过按键控制 LED 与 蜂鸣器 状态翻转;
一、复制LED项目,更改项目名称;
二、工程配置:
-
查看 按键 和 蜂鸣器 的电路原理图; -
打开工程中的 STM32CubeMX 文件; -
配置引脚模式:蜂鸣器对应引脚为“GPIO_Output”模式,按键对应引脚为“GPIO_Input”模式; -
进行引脚的初始化配置,主要配置引脚的初始电平状态、输入输出模式、上下拉(看电路图)。之后生成代码; -
创建“beep.h”、“key.h”、“key.c”保存到“Hardware”文件夹; beep.h
#ifndef _BEEP_H
#define _BEEP_H
#include "stm32l4xx_hal.h"
//BEEP接口定义
// n ( 1 响; 0 不响 )
#define BEEP(n) (n?HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET):HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET))
#define BEEP_TogglePin HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_2) //BEEP电平翻转
#endif
key.h
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32l4xx_hal.h"
#define KB0 HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_10)
#define KB1 HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_9)
#define KB2 HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_8)
#define WK_UP HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_13)
#define KEYPORT KB0 | (KB1<<1) | (KB2<<2) | ((!WK_UP)<<3) | 0xf0
extern unsigned char Trg;
extern unsigned char Cont;
void Key_Read( void );
#endif
key.c
#include "key.h"
unsigned char Trg;
unsigned char Cont;
// C语言 自己分析一下代码执行过程吧
// 说明一下,这里的按键实现方法考虑了 按键抖动 的情况,
// 很好的解决了传统 延时消抖 的CPU占用情况(不再需要进行延时消抖)
// 0x01 -------KB0
// 0x02 -------KB1
// 0x04 -------KB2
// 0x08 -------WK_UP
void Key_Read( void )
{
unsigned char ReadData = (KEYPORT)^0xff; // 1. Read KEYPORT ^(xor)
Trg = ReadData & (ReadData ^ Cont); // 2
Cont = ReadData; // 3
}
- 管理项目文件:
- 测试:
while (1)
{
Key_Read();
if(Trg == 0x01)
{
LED_TogglePin;
BEEP_TogglePin;
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
8.KB0 是否可以控制 LED 和 蜂鸣器 状态翻转了呢? 下一篇解决按键支不支持长按多次触发的问题
|