基于stm32Cubemx的矩阵键盘配置

矩阵键盘的选择

在这里插入图片描述
我这里使用的是某宝一块四包邮的4*4矩阵键盘,感觉对大部分简单工程的实现绰绰有余

Cubemx工程的配置

新建工程,配置RCC,SYS,时钟树等基础功能

在这里插入图片描述

一般设置为最大速率,之后点击OK可以实现一键配置,时钟源这里选择的是高速外部时钟源(HSE)
在这里插入图片描述

引脚配置

随便找几个引脚
根据自己单片机的引脚数量和操作的方便性配置矩阵键盘的引脚
一般为四个输入,四个输出,输入模式设为上拉输入
在这里插入图片描述
在这里插入图片描述

代码生成

在这里插入图片描述
设置工程名、文件路径(切记不要出现中文路径,笔者帮你们试过了,代码会被吞);IDE选择MDK-ARM,此时系统会在keil中生成代码

在这里插入图片描述
点击生成代码,打开工程

Keil的配置

在main.c文件中加入矩阵键盘扫描函数如下,引脚根据自己的配置更换

/* USER CODE BEGIN 4 */
uint8_t Key_Scan(void)
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	
	/*前4个端口输出低电平*/
	HAL_GPIO_WritePin(GPIOD, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3, GPIO_PIN_RESET);
	
	//前4个端口推挽输出
	GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
	
	//后4个端口上拉输入
	GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7;
	GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
	GPIO_InitStruct.Pull = GPIO_PULLUP;
	HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
	HAL_Delay(10);
	if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_4)==GPIO_PIN_RESET)//读取第1行
	{
		/*后4个端口输出低电平*/
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
		//后4个端口推挽输出
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		//前4个端口上拉输入
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0)==GPIO_PIN_RESET)return 4;
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_1)==GPIO_PIN_RESET)return 3;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)==GPIO_PIN_RESET)return 2;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3)==GPIO_PIN_RESET)return 1;
	}
	if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_5)==GPIO_PIN_RESET)//读取第2行
	{
		/*后4个端口输出低电平*/
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
		//后4个端口推挽输出
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		//前4个端口上拉输入
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0)==GPIO_PIN_RESET)return 8;
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_1)==GPIO_PIN_RESET)return 7;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)==GPIO_PIN_RESET)return 6;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3)==GPIO_PIN_RESET)return 5;
	}	
	if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_6)==GPIO_PIN_RESET)//读取第3行
	{
		/*后4个端口输出低电平*/
		HAL_GPIO_WritePin(GPIOB, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
		//后4个端口推挽输出
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		//前4个端口上拉输入
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0)==GPIO_PIN_RESET)return 12;
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_1)==GPIO_PIN_RESET)return 11;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)==GPIO_PIN_RESET)return 10;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3)==GPIO_PIN_RESET)return 9;
	}
	if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_12)==GPIO_PIN_RESET)//读取第4行
	{
		/*后4个端口输出低电平*/
		HAL_GPIO_WritePin(GPIOD, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
		//后4个端口推挽输出
		GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		//前4个端口上拉输入
		GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
		GPIO_InitStruct.Pull = GPIO_PULLUP;
		GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
		HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
		HAL_Delay(10);
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_0)==GPIO_PIN_RESET)return 16;
		if(HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_1)==GPIO_PIN_RESET)return 15;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_2)==GPIO_PIN_RESET)return 14;
		if(HAL_GPIO_ReadPin(GPIOD,GPIO_PIN_3)==GPIO_PIN_RESET)return 13;
	}
	return 0;
}
/* USER CODE END 4 */

加入函数声明,使扫描函数能正常调用

/* USER CODE BEGIN PFP */
uint8_t Key_Scan(void);
/* USER CODE END PFP */

以下是笔者在学习中书写的一段代码,未完全展示,将其作为笔者自己的测试程序,仅作参考,读者可以通过串口验证按键输入是否有效,在此不再赘述

/* USER CODE BEGIN 3 */
		int i;
		i = Key_Scan();
		if(i == 1)
		{
	  HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
			for(j=0;j<100;j++)
			{
			temp[j]=n*Sine12bit[j]/30;
			}
		HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)temp,100,DAC_ALIGN_12B_R);//开启正弦波输出
		HAL_Delay (500);
		}
		if(i == 2)
		{
		HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
for(j=0;j<100;j++)
			{
			temp[j]=n*sanjiao[j]/30;
			}			
		HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)temp,100,DAC_ALIGN_12B_R);//开启三角波输出
		HAL_Delay (500);
		}
		if(i == 3)
		{
		HAL_DAC_Stop_DMA(&hdac,DAC_CHANNEL_1);
for(j=0;j<100;j++)
			{
			temp[j]=n*fangbo[j]/30;
			}			
		HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)temp,100,DAC_ALIGN_12B_R);//开启方波输出
		HAL_Delay (500);
		}
		if(i == 5)
		{
		TIM2->ARR *=2;
		HAL_Delay(500);
		}
		if(i == 6)
		{
		TIM2->ARR /=2;
		HAL_Delay(500);
		}
		if(i == 9)
		{
		n -=1;
			HAL_Delay(500);
		}			
		if(i ==10)
		{
		  n+=1;
			HAL_Delay(500);
		}
		
		HAL_Delay(10);
  }
  /* USER CODE END 3 */

值得注意的是,笔者在每次的按键切换中都加入了延时函数,这个操作是为了方式单片机将我们的按键行为误认为意外抖动而设计,即消抖,可以提高按键操作的稳定性。
在这里插入图片描述

引脚连接

结果展示

在这里插入图片描述
一段正弦波显示了出来,可以看到,效果灰常好啊!感兴趣的读者可以自己设计一段DAC程序,非常有趣。

至此,4*4矩阵键盘配置完成。

  • 11
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: STM32CubeMX支持矩阵键盘4x4的配置,可以通过STM32CubeMX工具进行设置。在工具中选择对应的GPIO引脚,设置为输入模式,并启用内部上拉电阻。然后选择矩阵键盘4x4的模式,并设置对应的行列映射关系。最后生成代码并下载到STM32芯片中即可使用。 ### 回答2: STM32CubeMX是一种由STMicroelectronics公司开发的嵌入式软件配置工具,可帮助软件开发人员更轻松地配置和生成STM32微控制器的初始化代码。其中,矩阵键盘是一种常见的外设,可用于实现用户和嵌入式系统之间的交互。接下来,我们将讨论STM32CubeMX矩阵键盘4x4方案中的应用。 1. 硬件配置 首先,需要通过STM32CubeMX工具在芯片上配置GPIO引脚,将矩阵键盘的按键连接到特定引脚。在4x4矩阵键盘中,有16个按键需要连接。STM32CubeMX支持简单的拖放式界面,使硬件配置更加容易和直观。 2. 码率设置 在完成硬件配置后,需要设置矩阵键盘的扫描速率。这可以通过调整代码中的扫描周期来实现。通常情况下,使用50-100ms左右的扫描周期是比较合适的。在编写代码时,必须确保扫描周期足够长,以确保键盘上的每个按键都有足够的时间进行扫描,并且不会产生抖动。 3. 读取按键状态 在矩阵键盘4x4方案中,需要对按键进行扫描,并读取它们的状态。在代码中,可以使用轮询的方式来扫描按键状态,也可以使用中断方式来响应按键事件。在进行轮询时,通常使用一个循环语句实现,并使用if语句判断按键是否被按下。使用中断方式时,当按键被按下时,会触发一个中断,该中断将被捕获并用于执行相应操作。 4. 处理按键事件 一旦检测到按键事件,需要对其进行处理。在处理按键事件时,可以使用带有标志的变量来标记按键状态。也可以将按键事件添加到一个队列中,在主循环或另一个线程中处理它们。无论采用哪种方法,都需要提供适当的保护措施来防止竞争条件和其他多线程问题的出现。 综上所述,使用STM32CubeMX可以轻松地实现矩阵键盘4x4方案。为了实现有效的按键扫描和事件处理,需要在硬件配置、码率设置、读取按键状态和处理按键事件等方面进行仔细的规划和编程。这也需要开发人员具有嵌入式系统和硬件编程方面的知识和经验。 ### 回答3: STM32CubeMX是一种图形化的配置工具,适用于为STMicroelectronics的STM32微控制器生成初始化代码和配置文件。矩阵键盘是一种常见的输入外设,可以通过连接按键和一个控制器来实现输入的读取。STM32CubeMX支持矩阵键盘配置,其中4x4是指这个矩阵键盘有4行和4列。 具体来说,STM32CubeMX可以生成代码来配置GPIO用作矩阵键盘的行和列。例如,可以选择四个GPIO引脚用于控制键盘的行,再选择另外四个GPIO引脚用于读取键盘的列。这些引脚需要在代码中被配置为输入或输出,并配置到正确的位置上。接下来,可以在代码中实现一个扫描算法,周期性地扫描键盘的每一行,并逐列检查该行上按下的按键。如果发现某个按钮被按下,则可以触发一个事件或者执行一个特定的操作。 STM32CubeMX还可以配置额外的细节,例如按键去抖动和输入电平的滤波等。可以选择不同的算法来处理这些问题,或者使用默认的选项。此外,还可以为矩阵键盘配置中断,以便在按键按下或释放时触发中断服务程序。这是一种高效的方式,以确保键盘操作被及时处理。 总之,STM32CubeMX提供方便易用的工具来配置矩阵键盘4x4,其代码生成功能可以减少开发时间,并且可以确保配置项正确、可靠。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值