zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    11.09_近期需要关注和学习的,,,
    11.08_
    11.04_晚
    11.04
    gitlab
    eos开发指南
    谷歌助记词
    solidity语法解读
    parity注记词和地址
    dice2win早期版本
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11424459.html
Copyright © 2011-2022 走看看