0
点赞
收藏
分享

微信扫一扫

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    0void 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简单的东西

举报

相关推荐

0 条评论