STM32---按键控制小灯

   STM32按键点灯的实现需要用到STM32的GPIO外设,不同开发板的LED外设不同,本文将采用野火STM32mini开发板来实现按键点灯。

在这里插入图片描述

1.首先,我们要想使用mini开发板按键控制小灯,就需要找到它的原理图,查找到板载的led和按键是用的哪一个引脚。
下图为led的板载引脚图,从图中我们可以知道mini板的两个led灯连接的是PC2、PC3引脚。且为低电平点亮、高电平熄灭
在这里插入图片描述

下图为mini板的按键引脚图,从图中我们也可以知道两个按键的引脚为PA0、PC13。且为高电平驱动,低电平阻断
在这里插入图片描述

所以当我们在使用不同的STM32开发板时,led和按键的引脚以及驱动方式是不同的,这就需要我们必须使用相应开发板的原理图这里我把mini板的原理图奉上,希望能帮助到有缘人。

2.代码驱动
首先我们需要创建一个led的驱动文件以及按键的驱动文件。

key.c
#include "stm32f10x.h"                  // Device header


void delay(uint32_t ms)//毫秒延时
{
    uint32_t i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 5000; j++)
        {
            __NOP(); // 空操作,不做任何事情,占用一个CPU周期
        }
    }
}


void Key_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC, ENABLE);//开启GPIOA、GPIOC时钟
    
    
    GPIO_InitTypeDef GPIO_InitStructure;//初始化GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//输入上拉模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//时钟频率
     GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
     GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
    
    
}

uint8_t Key_GetNum(void)
{
    uint8_t KeyNum = 0;
    if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1)
    {
        delay(20);
        while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) == 1);
        delay(20);
        KeyNum = 1;
    }
    if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1)
    {
        delay(20);
        while (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_13) == 1);
        delay(20);
        KeyNum = 2;
    }
    
    return KeyNum;
}

key.h

#ifndef __KEY_H
#define __KEY_H

void Key_Init(void);
uint8_t Key_GetNum(void);
void delay(uint32_t ms);
#endif

led.c

#include "stm32f10x.h"                  // Device header

void LED_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//开启GPIOA、GPIOC时钟
    
    GPIO_InitTypeDef GPIO_InitStructure;//初始化GPIO引脚
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出模式
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;//使能引脚
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//设置GPIO的速度
    GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC
    
    GPIO_SetBits(GPIOC, GPIO_Pin_2 | GPIO_Pin_3);//给PC2、PC3
}

void LED1_ON(void)
{
    GPIO_ResetBits(GPIOC, GPIO_Pin_2);
}

void LED1_OFF(void)
{
    GPIO_SetBits(GPIOC, GPIO_Pin_2);
}



void LED2_ON(void)
{
    GPIO_ResetBits(GPIOC, GPIO_Pin_3);
}

void LED2_OFF(void)
{
    GPIO_SetBits(GPIOC, GPIO_Pin_3);
}

led.h

#ifndef __LED_H
#define __LED_H

void LED_Init(void);
void LED1_ON(void);
void LED1_OFF(void);
void LED2_ON(void);
void LED2_OFF(void);


#endif

main.c

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

uint8_t KeyNum;

int main(void)
{
    LED_Init();
    Key_Init();
    
    while (1)
    {
        KeyNum = Key_GetNum();
        if (KeyNum == 1)//按key1键led1亮
        {
            LED1_ON();
        }
        if (KeyNum == 2)//按key2键小灯2亮一秒熄灭
        {
            LED2_ON();
            delay(1000);
            LED2_OFF();
        }
    }
}