STM32F429在以前的USART中断控制LED的版本基础上上,增加按键控制

1.增加bsp_key.c

/**
  ******************************************************************************
  * @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**********************/
 

2.bsp_key.h

#ifndef __KEY_H
#define    __KEY_H

#include "stm32f4xx.h"

//引脚定义
/*******************************************************/
#define KEY1_PIN                  GPIO_Pin_0                 
#define KEY1_GPIO_PORT            GPIOA                      
#define KEY1_GPIO_CLK             RCC_AHB1Periph_GPIOA

#define KEY2_PIN                  GPIO_Pin_13                 
#define KEY2_GPIO_PORT            GPIOC                      
#define KEY2_GPIO_CLK             RCC_AHB1Periph_GPIOC
/*******************************************************/

 /** 按键按下标置宏
    * 按键按下为高电平,设置 KEY_ON=1, KEY_OFF=0
    * 若按键按下为低电平,把宏设置成KEY_ON=0 ,KEY_OFF=1 即可
    */
#define KEY_ON    1
#define KEY_OFF    0

void Key_GPIO_Config(void);
uint8_t Key_Scan1(GPIO_TypeDef* GPIOx,u16 GPIO_Pin);

#endif /* __LED_H */

上述两个直接用的是野火哥写好的东西,只是在main中增加了函数,最终的效果如下:

/**
  ******************************************************************************
  * @file    main.c
  * @author  fire
  * @version V1.0
  * @date    2015-xx-xx
  * @brief   串口使用,串口接收数据指令控制RGB彩色灯。
  ******************************************************************************
  * @attention
  *
  * 实验平台:秉火  STM32 F429 开发板
  * 论坛    :http://www.firebbs.cn
  * 淘宝    :https://fire-stm32.taobao.com
  *
  ******************************************************************************
  */
  
#include "stm32f4xx.h"
#include "./led/bsp_led.h" 
#include "./usart/bsp_usart.h" 
#include "./key/bsp_key.h" 


uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin);

static void Show_Message(void);
  
/**
  * @brief  主函数
  * @param  无
  * @retval 无
  */
int main(void)
{    

  
  /* 初始化RGB彩灯 */
  LED_GPIO_Config();
    
      /* 初始化USART 配置模式为 115200 8-N-1 */
  USARTx_Config();
    
    Key_GPIO_Config();//按键没有初始化,我了个擦,导致key2不能用
    
      /* 打印指令输入提示信息 */
  Show_Message();

    Usart_SendString( USARTx,"这是一个串口中断接收回显实验\n");
  //printf("你爸爸我王继的USART中断程序\n");
    
    while(1)
        {
            if(Key_Scan(KEY1_GPIO_PORT ,KEY1_PIN)==KEY_ON )
                    {
                            LED1_TOGGLE;
                            Usart_SendString( USARTx,"你按下了key1");
                    }
            if(Key_Scan(KEY2_GPIO_PORT ,KEY2_PIN)==KEY_ON)
                    {
                          LED3_TOGGLE;
                            Usart_SendString( USARTx,"你按下了key2");
                    }    
        }
}


/**
  * @brief  打印指令输入提示信息
  * @param  无
  * @retval 无
  */
static void Show_Message(void)
{
  printf("\r\n   这是一个通过串口通信指令控制RGB彩灯实验 \n");
  printf("使用  USART1  参数为:%d 8-N-1 \n",USARTx_BAUDRATE);
  printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");
  printf("   指令   ------ 彩灯颜色 \n");
  printf("     1    ------    红 \n");
  printf("     2    ------    绿 \n");
  printf("     3    ------    蓝 \n");
  printf("     4    ------    黄 \n");
  printf("     5    ------    紫 \n");
  printf("     6    ------    青 \n");
  printf("     7    ------    白 \n");
  printf("     8    ------    灭 \n");  
}

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

好了,是非常ji简单的东西

猜你喜欢

转载自blog.csdn.net/u011436427/article/details/81122531