STM32F103(标准库)按键控制LED

STM32F103(标准库)按键控制 LED 实验

在学习 STM32 单片机的过程中,点亮 LED 是最基础的实验,而通过 按键控制 LED 翻转,则是对 GPIO 输入输出综合应用的入门案例。本文将带大家完成一个基于 STM32F103 标准库 的按键控制 LED 实验。


一、实验目标

  • 掌握 STM32F103 使用 标准库 配置 GPIO 输入与输出的方法。
  • 学会使用 按键输入 控制 LED 状态翻转
  • 熟悉延时函数 Delay_usDelay_msDelay_s 的实现。
  • 通过实验建立起 外设初始化 → 主循环控制 的编程思路。

二、硬件准备

  1. 核心硬件

    • STM32F103C8T6 最小系统板
    • LED 模块(或开发板自带 LED)
    • 按键模块(2 个独立按键)
  2. 连接方式(示例)

    • LED1 → PA1
    • LED2 → PA2
    • KEY1 → PB1
    • KEY2 → PB11

(具体引脚可根据实际电路调整)

img


三、软件设计

软件分为 主函数、延时模块、LED 模块、Key 模块 四部分。

1. 主函数 main.c

主函数调用 LED_Init()Key_Init() 完成外设初始化,在循环中检测按键状态,根据返回值翻转对应 LED。

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "LED.h"
#include "Key.h"

uint8_t KeyNum;

int main(void)
{
	LED_Init();
	Key_Init();
	
	while (1)
	{
		KeyNum = Key_GetNum();
		if (KeyNum == 1)
		{
			LED1_Turn();
		}
		if (KeyNum == 2)
		{
			LED2_Turn();
		}
	}
}

2. 延时函数 Delay

Delay.h

#ifndef __DELAY_H
#define __DELAY_H

void Delay_us(uint32_t us);
void Delay_ms(uint32_t ms);
void Delay_s(uint32_t s);

#endif

Delay.c

#include "stm32f10x.h"

/**
  * @brief  微秒级延时
  * @param  xus 延时时长,范围:0~233015
  * @retval 无
  */
void Delay_us(uint32_t xus)
{
	SysTick->LOAD = 72 * xus;				//设置定时器重装值
	SysTick->VAL = 0x00;					//清空当前计数值
	SysTick->CTRL = 0x00000005;				//设置时钟源为HCLK,启动定时器
	while(!(SysTick->CTRL & 0x00010000));	//等待计数到0
	SysTick->CTRL = 0x00000004;				//关闭定时器
}

/**
  * @brief  毫秒级延时
  * @param  xms 延时时长
  * @retval 无
  */
void Delay_ms(uint32_t xms)
{
	while(xms--)
	{
		Delay_us(1000);
	}
}
 
/**
  * @brief  秒级延时
  * @param  xs 延时时长
  * @retval 无
  */
void Delay_s(uint32_t xs)
{
	while(xs--)
	{
		Delay_ms(1000);
	}
} 

3. LED 模块

实现 LED 初始化与翻转。

LED.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);

void LED1_ON(void);
void LED1_OFF(void);
void LED1_Turn(void);

void LED2_ON(void);
void LED2_OFF(void);
void LED2_Turn(void);

#endif

LED.c

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);
}

void LED1_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_1);
}

void LED1_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_1);
}

void LED1_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_1) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_1);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_1);
	}
}

void LED2_ON(void)
{
	GPIO_ResetBits(GPIOA, GPIO_Pin_2);
}

void LED2_OFF(void)
{
	GPIO_SetBits(GPIOA, GPIO_Pin_2);
}

void LED2_Turn(void)
{
	if (GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_2) == 0)
	{
		GPIO_SetBits(GPIOA, GPIO_Pin_2);
	}
	else
	{
		GPIO_ResetBits(GPIOA, GPIO_Pin_2);
	}
}

4. 按键模块

实现按键初始化与消抖读取。

Key.h

#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);
uint8_t Key_GetNum(void);

#endif

Key.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"

void Key_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStructure);
}

uint8_t Key_GetNum(void)
{
	uint8_t KeyNum = 0;
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0);
		Delay_ms(20);
		KeyNum = 1;
	}
	if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0)
	{
		Delay_ms(20);
		while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0);
		Delay_ms(20);
		KeyNum = 2;
	}
	
	return KeyNum;
}

四、运行效果

  1. 上电后,LED 默认关闭。
  2. 当按下 KEY1 (PA0) 并松开时,LED1 (PB5) 翻转一次(亮 ↔ 灭)。
  3. 当按下 KEY2 (PA1) 并松开时,LED2 (PB0) 翻转一次。
  4. 每次按键动作只会触发一次翻转,消抖效果良好。

五、总结

本实验通过 STM32 标准库 实现了 按键输入控制 LED 翻转,主要收获有:

  • 学会了 GPIO 输入输出的基本配置方法;
  • 理解了按键消抖的必要性及其软件实现方式;
  • 熟悉了模块化编程结构(Delay、LED、Key、Main)。

这为后续更复杂的外设实验(如外部中断、定时器中断控制 LED、矩阵键盘等)打下了坚实的基础。

posted @ 2025-08-30 14:09  jeikerxiao  阅读(125)  评论(0)    收藏  举报