前言:我们都知道开发板上除了有经典的流水灯之外,还有一个必备的练习硬件--按键(key),下面继续来完成按键的配置。
1、通过查看原理图,找出按键(key)的管脚名字和对应芯片上的I/O口,四个I/O分别为PA0、PE2、PE3和PE4。
2、配置按键I/O口这里要注意的是工作模式要改成输入模式,不是led的输出模式,并且不需要设置输出模式。
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
3、获取按键的按下和释放的状态
//读取PA0引脚的电平,低电平,按钮按下
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0
//高电平,按钮释放
GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1
4、下面是具体代码,实现了按下一个按键对应的led灯亮,释放之后led灯灭
#include "stm32f4xx.h"
GPIO_InitTypeDef GPIO_InitStructure;
void delay(void)
{
unsigned int i=0x500000;
while(i--);
}
/*初始化led灯*/
void init_led(void)
{
/* GPIOG Peripheral clock enable ,使能外设时钟GPIOF、GPIOE,也就是让GPIOF、GPIOE工作*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* 配置PF9引脚为推挽输出模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //第PF9和PF10号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出模式,增加输出电流
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻
GPIO_Init(GPIOF, &GPIO_InitStructure); //初始化端口F
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14; //第PE13和PE14号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //输出模式
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽输出模式,增加输出电流
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化端口E
}
/*初始化按键*/
void init_key(void)
{
/* GPIOG Peripheral clock enable ,使能外设时钟GPIOA和GPIOE,也就是让GPIOA和GPIOE工作*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
/* 配置PA0引脚为输入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //第PA0号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化端口A
/* 配置PA0引脚为输入模式 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4; //第PE2、PE3和PE4号引脚
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //输入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //引脚的的工作速度最高为100MHz,最低为2MHz,工作速度越高,功耗就越高
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //不需要上拉电阻
GPIO_Init(GPIOE, &GPIO_InitStructure); //初始化端口E
}
int main(void)
{
init_led();
init_key();
GPIO_SetBits(GPIOF,GPIO_Pin_9); //PF9引脚为高电平,led灯灭
GPIO_SetBits(GPIOF,GPIO_Pin_10); //PF10引脚为高电平,led灯灭
GPIO_SetBits(GPIOE,GPIO_Pin_13); //PE13引脚为高电平,led灯灭
GPIO_SetBits(GPIOE,GPIO_Pin_14); //PE14引脚为高电平,led灯灭
while(1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) //读取PA0引脚的电平,低电平,按钮按下
{
GPIO_ResetBits(GPIOF,GPIO_Pin_9);//PF9引脚为低电平,led灯亮
}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) ==1) //读取PA0引脚的电平,高电平,按钮按释放
{
GPIO_SetBits(GPIOF,GPIO_Pin_9); //PF9引脚为高电平,led灯灭
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 0) //读取PE2引脚的电平,低电平,按钮按下
{
GPIO_ResetBits(GPIOF,GPIO_Pin_10);//PF10引脚为低电平,led灯亮
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_2) == 1) //读取PE2引脚的电平,高电平,按钮按释放
{
GPIO_SetBits(GPIOF,GPIO_Pin_10); //PF10引脚为高电平,led灯灭
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 0) //读取PE3引脚的电平,低电平,按钮按下
{
GPIO_ResetBits(GPIOE,GPIO_Pin_13);//PF10引脚为低电平,led灯亮
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3) == 1) //读取PE3引脚的电平,高电平,按钮按释放
{
GPIO_SetBits(GPIOE,GPIO_Pin_13); //PF10引脚为高电平,led灯灭
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 0) //读取PE4引脚的电平,低电平,按钮按下
{
GPIO_ResetBits(GPIOE,GPIO_Pin_14);//PF10引脚为低电平,led灯亮
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4) == 1) //读取PE4引脚的电平,高电平,按钮按释放
{
GPIO_SetBits(GPIOE,GPIO_Pin_14); //PF10引脚为高电平,led灯灭
}
}
}
鉴于本人才疏学浅,所以其中不免有遗漏或者错误,恳请各位博友批评指正。