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