2

YIE002开发探索02-按键

 2 years ago
source link: http://yiiyee.cn/blog/2021/07/13/yie002%e5%bc%80%e5%8f%91%e6%8e%a2%e7%b4%a203-%e6%8c%89%e9%94%ae/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

请保留-> 【原文:  https://blog.csdn.net/luobing4365 和 http://yiiyee.cn/blog/author/luobing/】

按键实验中,使用GPIO的相关知识就可以了。在上一篇中,已经介绍了GPIO的基本用法,这一篇使用这些知识实现按键的功能。

1 在YIE002-STM32型上编程

在后续的实验中,没有必要每次都重新去配置工程。比如时钟树的配置、调试的配置等,每次都差不多。因此,可以直接在之前的工程上进行修改,添加需要的功能即可。本篇的工程,就是在上一篇的基础上进行修改的。

1.1 硬件资源

YIE002-STM32型上准备了三个按键,如图1所示。

图1 按键的硬件资源

开发板上提供的三个按键SW1、SW2和SW3,分别连接到PA6、PA5和PA1上。从图中可以看出,这三个按键都是低电平有效的。

1.2 软件设计

本篇的实验中,主要使能按键相关的GPIO,再编写相应的按键扫描函数即可。

使能GPIO可以通过Cube MX的图形化编程实现,修改的引脚如图2所示。

图2 修改GPIO引脚配置

重新生成代码,在生成的代码中会自动添加对这三个引脚的初始化语句。

初始化完成后,编写对应的按键扫描函数,内容如下:

/**
  获得按键的状态
  
  @param  void
  @retval 返回对应的按键是否按下,如果没有按键按下,则返回0              
**/
#define KEY1Pressed 1
#define KEY2Pressed 2
#define KEY3Pressed 4
uint8_t GetKey(void)
{
	uint8_t key1,key2,key3;
	static uint8_t keyup=1;
	uint8_t key=0;
	
	key1= HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);//读取按键1
	key2= HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5);//读取按键2
	key3= HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1);//读取按键3
	
	if(keyup && (key1==0||key2==0||key3==0))
	{
		HAL_Delay(10);    //去抖动
		keyup=0;
		
		if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6)) key|= KEY1Pressed;
		if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_5)) key|= KEY2Pressed;
		if(!HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_1)) key|= KEY3Pressed;
		return key;
	}
	else if(key1==1 && key2==1 && key3==1)
		keyup=1;
	
	return 0;
}

在main函数的while循环中,实现按键亮灯的功能,添加的代码如下:

 while (1)
 {
    /* USER CODE END WHILE */
		key=GetKey();
		if(key)
		{
			if(key&KEY1Pressed)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_12);
			if(key&KEY2Pressed)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_13);
			if(key&KEY3Pressed)
				HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_14);
		}
    /* USER CODE BEGIN 3 */
  }

代码比较简单,就不一一分析了。每个按键控制了一个LED灯,按下后会点亮LED灯,再按则熄灭LED灯。

博客中的代码,实际上都是移植自我以前用Legacy library编写的STM32工程,只不过使用Cube library的函数重新编写了而已。所实现的代码比较简单,主要是为了演示使用方法,方便自己以后查看。

有兴趣的话,可以在此基础上修改,比如实现按键的连按、优先级的调整等。

136 total views, 3 views today


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK