STM32实现按键控制灯:
五份主要代码:
main.c,KEY.c,LED.c,KEY.h和LED.h
main.c:
#include "stm32f10x.h"
#include "LED.h"
#include "KEY.h"
int main(void)
{
LED_Init(); // 初始化LED
KEY_Init(); // 初始化按键
while (1)
{
if (Key_GetNum() == 1) // 获取按键值
{
LED1_Toggle(); // 切换LED状态
}
}
}
KEY.c:
#include "stm32f10x.h"
static void delay_ms(uint32_t ms); // 延迟函数声明
void KEY_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); // 使能GPIOD时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOD, &GPIO_InitStructure); // 配置PD0为上拉输入模式
}
uint8_t Key_GetNum(void)
{
if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_0) == 0)
{
delay_ms(20); // 消抖延时
if (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_0) == 0)
{
while (GPIO_ReadInputDataBit(GPIOD, GPIO_Pin_0) == 0); // 等待按键释放
delay_ms(20); // 消抖延时
return 1;
}
}
return 0;
}
static void delay_ms(uint32_t ms)
{
for (uint32_t i = 0; i < ms * 8000; i++); // 简单延时
}
LED.c:
#include "stm32f10x.h"
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // 配置PA11为推挽输出模式
GPIO_SetBits(GPIOA, GPIO_Pin_11); // 设置PA11为高电平(关闭LED)
}
void LED1_Toggle(void)
{
GPIO_WriteBit(GPIOA, GPIO_Pin_11, (BitAction)(1-GPIO_ReadOutputDataBit(GPIOA, GPIO_Pin_11))); // 切换LED状态
}
KEY.h:
#ifndef __KEY_H
#define __KEY_H
#include "stdint.h"
void KEY_Init(void); // 初始化按键
uint8_t Key_GetNum(void); // 获取按键值
#endif
LED.h:
#ifndef __LED_H
#define __LED_H
void LED_Init(void); // 初始化LED
void LED1_Toggle(void); // 切换LED状态
#endif
此代码点灯,需要按下按键再松开按键,才可以实现小灯的开关(与下次作业做区分)。
演示视频:
stm32按键控制灯