利用STM32实现按键控制LED灯

利用野火开发版,一下是说明

/*********************************************************************************************/

【*】程序简介
-工程名称:GPIO输入--按键
-实验平台: 野火STM32 F429 开发板
-MDK版本:5.16
-ST固件库版本:1.5.1


【 !】功能简介:
使用两个按键控制彩灯的红、绿灯反转,按一下KEY1 红灯反转一次,按一下KEY2,绿灯反转一次。

学习目的:学会检测GPIO引脚输入的基本方法。

【 !!】注意事项:
 跳线帽:彩灯需要用跳线帽连接J35 (出厂默认已连接,J35位置在彩灯附近)

/*********************************************************************************************/

【*】 引脚分配
KEY:
两个按键均有硬件去抖,按下的时候均为高电平,不按时为低电平。

    KEY1<--->PA0
    KEY2<--->PC13

LED:
RGB彩灯的三个阴极接到STM32三个引脚上,LED低电平亮。

    R<--->PH10
    G<--->PH11
    B<--->PH12
    
    LED4<--->PD11


/*********************************************************************************************/

【*】 时钟

A.晶振:
-外部高速晶振:25MHz
-RTC晶振:32.768KHz

B.各总线运行时钟:
-系统时钟 = SYCCLK = AHB1 = 180MHz
-APB2 = 90MHz 
-APB1 = 45MHz

C.浮点运算单元:
  不使用

main代码

/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   使用按键控制彩灯
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F429 开发板
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */
  
#include "stm32f4xx.h"
#include "./led/bsp_led.h"
#include "./key/bsp_key.h" 

/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{
    /* LED 端口初始化 */
    LED_GPIO_Config();     
  
  /*初始化按键*/
  Key_GPIO_Config();
    
 
    /* 轮询按键状态,若按键按下则反转LED */ 
    while(1)                            
    {       
        if( Key_Scan(KEY1_GPIO_PORT,KEY1_PIN) == KEY_ON  )
        {
            /*LED1反转*/
            LED1_TOGGLE;
        }   
    
    if( Key_Scan(KEY2_GPIO_PORT,KEY2_PIN) == KEY_ON  )
        {
            /*LED2反转*/
            LED2_TOGGLE;
        }   
    }
}

/*********************************************END OF FILE**********************/

LED文件

/**
  ******************************************************************************
  * @file    bsp_led.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   led应用函数接口
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F429 开发板  
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */
  
#include "./led/bsp_led.h"   

 /**
  * @brief  初始化控制LED的IO
  * @param  无
  * @retval 无
  */
void LED_GPIO_Config(void)
{        
        /*定义一个GPIO_InitTypeDef类型的结构体*/
        GPIO_InitTypeDef GPIO_InitStructure;

        /*开启LED相关的GPIO外设时钟*/
        RCC_AHB1PeriphClockCmd ( LED1_GPIO_CLK|
                               LED2_GPIO_CLK|
                               LED3_GPIO_CLK, ENABLE); 

        /*选择要控制的GPIO引脚*/                                                               
        GPIO_InitStructure.GPIO_Pin = LED1_PIN;    

        /*设置引脚模式为输出模式*/
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   
    
    /*设置引脚的输出类型为推挽输出*/
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    
    /*设置引脚为上拉模式*/
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

        /*设置引脚速率为2MHz */   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; 

        /*调用库函数,使用上面配置的GPIO_InitStructure初始化GPIO*/
        GPIO_Init(LED1_GPIO_PORT, &GPIO_InitStructure);    
    
    /*选择要控制的GPIO引脚*/                                                               
        GPIO_InitStructure.GPIO_Pin = LED2_PIN;    
    GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStructure);    
    
    /*选择要控制的GPIO引脚*/                                                               
        GPIO_InitStructure.GPIO_Pin = LED3_PIN;    
    GPIO_Init(LED3_GPIO_PORT, &GPIO_InitStructure);    
        
        /*关闭RGB灯*/
        LED_RGBOFF;        
}
/*********************************************END OF FILE**********************/
 

按键文件

/**
  ******************************************************************************
  * @file    bsp_key.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   按键应用bsp(扫描模式)
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F429 开发板 
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */ 
  
#include "./key/bsp_key.h" 

/// 不精确的延时
void Key_Delay(__IO u32 nCount)
{
	for(; nCount != 0; nCount--);
} 

/**
  * @brief  配置按键用到的I/O口
  * @param  无
  * @retval 无
  */
void Key_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启按键GPIO口的时钟*/
	RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
	
  /*选择按键的引脚*/
	GPIO_InitStructure.GPIO_Pin = KEY1_PIN; 
  
  /*设置引脚为输入模式*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 
  
  /*设置引脚不上拉也不下拉*/
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	
  /*使用上面的结构体初始化按键*/
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);    
  
  /*选择按键的引脚*/
	GPIO_InitStructure.GPIO_Pin = KEY2_PIN; 
  
  /*使用上面的结构体初始化按键*/
	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);  
}

/**
  * @brief   检测是否有按键按下     
  *	@param 	GPIOx:具体的端口, x可以是(A...K) 
	*	@param 	GPIO_PIN:具体的端口位, 可以是GPIO_PIN_x(x可以是0...15)
  * @retval  按键的状态
  *		@arg KEY_ON:按键按下
  *		@arg KEY_OFF:按键没按下
  */
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{			
	/*检测是否有按键按下 */
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
	{	 
		/*等待按键释放 */
		while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);   
		return 	KEY_ON;	 
	}
	else
		return KEY_OFF;
}
/*********************************************END OF FILE**********************/
/**
  ******************************************************************************
  * @file    bsp_key.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   按键应用bsp(扫描模式)
  ******************************************************************************
  * @attention
  *
  * 实验平台:野火  STM32 F429 开发板 
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */ 
  
#include "./key/bsp_key.h" 

/// 不精确的延时
void Key_Delay(__IO u32 nCount)
{
	for(; nCount != 0; nCount--);
} 

/**
  * @brief  配置按键用到的I/O口
  * @param  无
  * @retval 无
  */
void Key_GPIO_Config(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	/*开启按键GPIO口的时钟*/
	RCC_AHB1PeriphClockCmd(KEY1_GPIO_CLK|KEY2_GPIO_CLK,ENABLE);
	
  /*选择按键的引脚*/
	GPIO_InitStructure.GPIO_Pin = KEY1_PIN; 
  
  /*设置引脚为输入模式*/
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 
  
  /*设置引脚不上拉也不下拉*/
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
	
  /*使用上面的结构体初始化按键*/
	GPIO_Init(KEY1_GPIO_PORT, &GPIO_InitStructure);    
  
  /*选择按键的引脚*/
	GPIO_InitStructure.GPIO_Pin = KEY2_PIN; 
  
  /*使用上面的结构体初始化按键*/
	GPIO_Init(KEY2_GPIO_PORT, &GPIO_InitStructure);  
}

/**
  * @brief   检测是否有按键按下     
  *	@param 	GPIOx:具体的端口, x可以是(A...K) 
	*	@param 	GPIO_PIN:具体的端口位, 可以是GPIO_PIN_x(x可以是0...15)
  * @retval  按键的状态
  *		@arg KEY_ON:按键按下
  *		@arg KEY_OFF:按键没按下
  */
uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{			
	/*检测是否有按键按下 */
	if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON )  
	{	 
		/*等待按键释放 */
		while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == KEY_ON);   
		return 	KEY_ON;	 
	}
	else
		return KEY_OFF;
}
/*********************************************END OF FILE**********************/