本文转载自:https://www.cnblogs.com/isakovsky/p/11424459.html
按键和小灯一样,也是通过GPIO外设与主板连接,也是通过GPIO_InitStruct类型结构体控制其工作。
查阅技术手册,按键连接GPIOA控制下的管脚0。
但与之不同的是,按键是一种输入设备,输入设备的工作状态也有四类,模拟输入,浮空输入,下拉输入和上拉输入。
模拟输入就是输入一个波形,浮空输入指的是未按下按钮时,不确定此管脚的信号状态。
上拉输入指按下按钮时,输出低电平,即0,松开按钮时,输出高电平,即1。
下拉输入则相反。
但是因为STM32的构造问题,按钮只能采用上拉输入,如果将此管脚工作状态定义为下拉输入,则输出会保持0。
可能是因为管脚A1的设计上就是接地的,因此,下拉输入,按下按钮后依然保持了低电平。
用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
附:《STM32固件库使用手册》和《STM32参考手册》下载地址:
https://blog.csdn.net/weixin_41561640/article/details/107124800