一、原理图
二、库函数
(1)读取IO的状态
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
参数:
GPIO_Pin--->GPIO_Pin_x(x = 0~15)
返回值:
读取到的状态:0表示按键按下;1表示按键没有按下。
三、程序
key.h文件
#ifndef __KEY_H__
#define __KEY_H__
#include "stm32f4xx_conf.h"
void KEY_Config(void);
uint16_t KEY_Scan(void);
#endif
key.c文件
#include "./KEY/key.h"
/*
key1--->PF9
key2--->PF8
key3--->PF7
key4--->PE6
*/
/**********************
功能:配置KEY
参数:无
返回值:无
***********************/
void KEY_Config(void)
{
GPIO_InitTypeDef initValue;
/*1、打开GPIO时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
/*2、初始化KEY*/
initValue.GPIO_Mode = GPIO_Mode_IN;
initValue.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7;
initValue.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOF,&initValue);
initValue.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOE,&initValue);
}
/*********************************
功能:扫描按键
参数:无
返回值:
1---表示key1按下
2---表示key2按下
3---表示key3按下
4---表示key4按下
0---表示所有key都没有按下
*********************************/
uint16_t KEY_Scan(void)
{
if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_9) == 0) //key1按下
{
return 1;
}
if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_8) == 0) //key2按下
{
return 2;
}
if(GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_7) == 0) //key3按下
{
return 3;
}
if(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_6) == 0) //key4按下
{
return 4;
}
return 0;
}
main.c文件
#include "delay.h"
#include "./LED/led.h"
#include "./BEEP/beep.h"
#include "./KEY/key.h"
int main(void)
{
uint16_t num;
//配置LED
LED_Config();
//配置BEEP
BEEP_Config();
//配置KEY
KEY_Config();
num = KEY_Scan();
while(1)
{
if(num == 1) //key1按下
{
BEEP_ON();
}
else
{
BEEP_OFF();
}
if(num == 2) //key2按下
{
LED_ON(1);
}
if(num == 3) //key3按下
{
LED_ON(2);
}
if(num == 4) //key4按下
{
LED_OFF(1);
LED_OFF(1);
}
}
}