1. 程式人生 > >stm32按鍵配置

stm32按鍵配置

高電平 pan 功耗 upd alt 設置 truct per nbsp

前言:我們都知道開發板上除了有經典的流水燈之外,還有一個必備的練習硬件--按鍵(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燈滅 } } }

 

stm32按鍵配置