第15届蓝桥杯嵌入式省赛准备第二天总结笔记(使用STM32cubeMX创建hal库工程+按键输入)

一.查看电路图

第15届蓝桥杯嵌入式省赛准备第二天总结笔记(使用STM32cubeMX创建hal库工程+按键输入)_第1张图片

按键是使用的PB0,PB1,PB2,PA0四个引脚,然后使用CubeMX配置引脚,4个脚都配置为输入模式和上拉。

第15届蓝桥杯嵌入式省赛准备第二天总结笔记(使用STM32cubeMX创建hal库工程+按键输入)_第2张图片

程序生成之后把不用的删掉,需要的留下,这里我把函数名改了。

第15届蓝桥杯嵌入式省赛准备第二天总结笔记(使用STM32cubeMX创建hal库工程+按键输入)_第3张图片

然后写按键扫描读取程序,这里参考的正点原子的按键输入程序(感谢原子哥感谢左神)。

这是点C程序:

#include "key.h"

void Key_Init(void)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
	
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOB_CLK_ENABLE();

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = GPIO_PIN_0;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /*Configure GPIO pins : PB0 PB1 PB2 */
  GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2;
  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}

/*输入:1|0 模式 1为连续按,0为不连续按*/

unsigned char Key_Scan(unsigned char mode)
{
	static unsigned int key_mode;
	if(mode == 1)key_mode = 1;
	if(key_mode == 1&&(KEY0 == 0||KEY1 == 0||KEY2 == 0||KEY3 == 0))
	{
		HAL_Delay(10);
		key_mode = 0;
		if(KEY0 == 0){return KEY0_FLG;}
		else if(KEY1 == 0){return KEY1_FLG;}
		else if(KEY2 == 0){return KEY2_FLG;}
		else if(KEY3 == 0){return KEY3_FLG;}
	}
	else if(KEY0 == 1||KEY1 == 1||KEY2 == 1||KEY3 == 1) key_mode = 1;
	return 0;
}

这是点H程序:

#ifndef __KEY_H
#define __KEY_H
#include "main.h"

#define KEY0 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define KEY1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define KEY3 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)

#define KEY0_FLG 1
#define KEY1_FLG 2
#define KEY2_FLG 3
#define KEY3_FLG 4

void Key_Init(void);
unsigned char Key_Scan(unsigned char mode);
#endif

这是主程序:滴答定时器10ms扫描一次,按键1按下的话LED显示0x55,按键2按下的话LED显示0xAA;Led_Disp程序是我自己写的,新手朋友注意

unsigned char key; 
int main(void)
{
  HAL_Init();
  SystemClock_Config();
	
  MX_GPIO_Init();
	LCD_Init();
	LED_Init();
	Key_Init();
  while (1)
  {
		if(uwTick % 10 == 0)
		{
			key=Key_Scan(0);
		}
		if(key == 1)
		{
      Led_Disp(0x55);
		}
		if(key == 2)
		{
     Led_Disp(0xaa);
		}
		  

  }

}

接下来看效果:

按键演示

你可能感兴趣的:(蓝桥杯嵌入式,蓝桥杯,笔记,stm32)