前言:咱們都知道開發板上除了有經典的流水燈以外,還有一個必備的練習硬件--按鍵(key),下面繼續來完成按鍵的配置。spa
一、經過查看原理圖,找出按鍵(key)的管腳名字和對應芯片上的I/O口,四個I/O分別爲PA0、PE二、PE3和PE4。code
二、配置按鍵I/O口這裏要注意的是工做模式要改爲輸入模式,不是led的輸出模式,而且不須要設置輸出模式。blog
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; //輸入模式
三、獲取按鍵的按下和釋放的狀態ip
//讀取PA0引腳的電平,低電平,按鈕按下 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0 //高電平,按鈕釋放 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 1
四、下面是具體代碼,實現了按下一個按鍵對應的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; //第PE二、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燈滅 } } }