STM32嵌入式开发学习笔记(三):使用按键控制小灯

按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作。

查阅技术手册,按钮连接GPIOA控制下的管脚0.

但与之不同的是,按键是一种输入设备,输入设备的工作状态也有四类,模拟输入,浮空输入,下拉输入和上拉输入。

模拟输入就是输入一个波形,浮空输入指的是未按下按钮时,不确定此管脚的信号状态。

上拉输入指按下按钮时,输出低电平,即0,松开按钮时,输出高电平,即1.

下拉输入则相反。

但是因为STM32的构造问题,按钮只能采用上拉输入,如果将此管脚工作状态定义为下拉输入,则输出会保持0.

可能是因为管脚A1STM32的设计上就是接地的,因此,下拉输入,按下按钮后依然保持了低电平。

用GPIO_ReadInputDataBit函数读取某个管脚的输入输出,注意此函数返回值是u8,无符号8位整数。

在key.h/.c文件中定义和实现按钮初始化和读取按钮功能。

#include <stm32f10x.h>
#ifndef _KEY_H
    #define _KEY_H
    void KEY_configer(void);
    u8 KEY_scan(void);
#endif
//key.h
#include <stm32f10x.h>
#include <key.h>
void KEY_configer(){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef GPIO_KEY_INIT;
    GPIO_KEY_INIT.GPIO_Pin=GPIO_Pin_0;
    GPIO_KEY_INIT.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_KEY_INIT.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_Init(GPIOA,&GPIO_KEY_INIT);
}
u8 KEY_scan(){
    return GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);
}
//key.c

在led.h/.c中定义小灯初始化和开关

#include <stm32f10x.h>
#ifndef _LED_H
    #define _LED_H
    void LED_configer(void);
    void LED_on(void);
    void LED_off(void);
#endif
//led.h
#include <led.h>
#include <stm32f10x.h>
void LED_configer(){
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    GPIO_InitTypeDef GPIO_LED_INIT;
    GPIO_LED_INIT.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
    GPIO_LED_INIT.GPIO_Speed=GPIO_Speed_2MHz;
    GPIO_LED_INIT.GPIO_Mode=GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA,&GPIO_LED_INIT);
}
void LED_on(){
    GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
}
void LED_off(){
    GPIO_ResetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4);
}
//led.c

主函数的实现逻辑是,不断询问按钮状态,若按下则打开小灯,若未按下则关闭小灯

#include <stdio.h>
#include <stm32f10x.h>
#include <led.h>
#include <key.h>
int main(){
    KEY_configer();
    LED_configer();
    while(1){
        if(KEY_scan()==0){
            LED_on();
        }else{
            LED_off();
        }
    }
    return 0;
}
//main.c
原文地址:https://www.cnblogs.com/isakovsky/p/11424459.html