一、杜邦线模拟按键
一端接GND,一端接A1(接在你要初始化的IO,我是初始化了A1)
二、编程
1.写 PC13 LED灯IO初始化程序 LED.c
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
void LED_Init(void) //LED对应IO口的初始化
{
GPIO_InitTypeDef GPIO_InitStruct; //结构体定义
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);//使能时钟
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_13; //管脚13
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOC,&GPIO_InitStruct);
}
2.写LED头文件
#ifndef _LED_H
#define _LED_H
#define LED_OFF GPIO_SetBits(GPIOC,GPIO_Pin_13) //拉低电平
#define LED_ON GPIO_ResetBits(GPIOC,GPIO_Pin_13) //拉高电平
#define LED_REV GPIO_WriteBit(GPIOC, GPIO_Pin_13,(BitAction)(1-(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_13)))) //对输出的bit进行修改
void LED_Init(void);
#endif
为LED灯取反而编写的,即亮与灭
3.模拟按键的对应GPIO口的初始化 KEY.c
#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//依然使能对应IO口的时钟
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_IPU; //!!注意这里为上拉输出
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_1;
GPIO_Init(GPIOA,&GPIO_InitStruct);
}
个人理解:因为GND为低电平,初始化A1口时为上拉输入,这样按键按下时就能进行判断
4.编写头文件KEY.h
#ifndef _KEY_H
#define _KEY_H
#define KEY GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) //读取对应IO口的输入电平的参数
void KEY_Init(void);
#endif
5.编写主函数main.c
#include "stm32f10x.h"
#include "led.h"
#include "delay.h"
#include "KEY.h"
int main(void)
{
LED_Init();
KEY_Init();
Delay_Init();
while(1)
{
if(!KEY)
{
Delay_ms(20); //对于按键来说有一点抖动误差,但是模拟按键则可有可无
if(!KEY)
{
while(!KEY); //松手的检测
Delay_ms(20);//同理
LED_REV; //取反LED灯的电平,使之亮灭
}
}
}
}
拔插A1的杜邦线,就可以做到按键的效果
笔记:
WK_UP按键则可以配置下拉输出
KEY0与KEY1则可以配置上拉输出,可以这么理解,配置这些,就是给IO口一个初始的状态。