2、KEY_LED 通过按键来点亮小灯

1.实现功能

实验板上有三个按键,和三个led灯。当烧入程序后,三个灯都是关断状态。
如果按下其中一个按键,则对应一个led灯变亮。当松开时,对应的led灯关灭。
硬件图如下:
LED与KEY的硬件接线图

2.软件编程实现

本人使用cubemax配置rcc和引脚。
通过本例程可以来学习头文件的应用,以及枚举的应用。

  1. 在gpio.h中添加数据类型,Led_TypeDef,KEYState_TypeDef
typedef enum
{
	LED0,
	LED1,
	LED2,
	
}Led_TypeDef;	

typedef enum 
{ 
  KEY0  = 0,
  KEY1  = 1,
  WK_UP  = 2,
  KEY_NONE  = 3, 
}KEYState_TypeDef;

2.在gpio.h中添加函数声明,这些函数会在其他.c文件中被调用。

void BSP_LED_On(Led_TypeDef Led);
void BSP_LED_Off(Led_TypeDef Led);
void BSP_LED_Toggle(Led_TypeDef Led);
KEYState_TypeDef BSP_KEY_GetState(void);
  1. 在gpio.c中声明两个数组
GPIO_TypeDef* GPIO_PORT[] = {LED0_GPIO_Port,
                             LED1_GPIO_Port,
                             LED2_GPIO_Port};

const uint16_t GPIO_PIN[] = {LED0_Pin,
                             LED1_Pin,
                             LED2_Pin };

4.在gpio.c中定义函数

KEYState_TypeDef BSP_KEY_GetState(void) 
{  
  /* Check the pressed keys */  
  if(HAL_GPIO_ReadPin(KEY0_GPIO_Port,KEY0_Pin) == GPIO_PIN_RESET)
  {
    return (KEYState_TypeDef) KEY0;
  }
  else if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
  {
    return (KEYState_TypeDef) KEY1;
  } 
  else if(HAL_GPIO_ReadPin(WK_UP_GPIO_Port,WK_UP_Pin) == GPIO_PIN_SET)
  {
    return (KEYState_TypeDef) WK_UP;
  }
  else
  { 
    return (KEYState_TypeDef) KEY_NONE;
  }  
}
/**
  * @brief  Turns selected LED On.
  * @param  Led: LED to be set on 
  *          This parameter can be one of the following values:
  *            @arg  LED0
  *            @arg  LED1
  *            @arg  LED2
  * @retval None
  */
void BSP_LED_On(Led_TypeDef Led)
{
  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
}

/**
  * @brief  Turns selected LED Off. 
  * @param  Led: LED to be set off
  *          This parameter can be one of the following values:
  *            @arg  LED0
  *            @arg  LED1
  *            @arg  LED2
  * @retval None
  */
void BSP_LED_Off(Led_TypeDef Led)
{
  HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_SET); 
}

/**
  * @brief  Toggles the selected LED.
  * @param  Led: LED to be toggled
  *          This parameter can be one of the following values:
  *            @arg  LED0
  *            @arg  LED1
  *            @arg  LED2
  * @retval None
  */
void BSP_LED_Toggle(Led_TypeDef Led)
{
  HAL_GPIO_TogglePin(GPIO_PORT[Led], GPIO_PIN[Led]);
}

在此.c文件中,还有引脚初始化的配置,是在cubemax中设置的。按键相连接的引脚设置为输入模式;led相连接的引脚设置为输出模式,推挽输出,无需上拉和下拉。

5.main.c

switch(BSP_KEY_GetState())
		{
			case KEY0:
				BSP_LED_On(LED0);break;
			case KEY1:
				BSP_LED_On(LED1);break;
			case WK_UP:
				BSP_LED_On(LED2);break;   
			default:
				BSP_LED_Off(LED0);
			 	BSP_LED_Off(LED1);
				BSP_LED_Off(LED2);
				break;
		}

猜你喜欢

转载自blog.csdn.net/qq_34190043/article/details/93910588
今日推荐