基于stm32Cubemx的矩阵键盘配置

这篇具有很好参考价值的文章主要介绍了基于stm32Cubemx的矩阵键盘配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

矩阵键盘的选择

基于stm32Cubemx的矩阵键盘配置
我这里使用的是某宝一块四包邮的4*4矩阵键盘,感觉对大部分简单工程的实现绰绰有余

Cubemx工程的配置

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

基于stm32Cubemx的矩阵键盘配置

一般设置为最大速率,之后点击OK可以实现一键配置,时钟源这里选择的是高速外部时钟源(HSE)
基于stm32Cubemx的矩阵键盘配置

引脚配置

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

代码生成

基于stm32Cubemx的矩阵键盘配置
设置工程名、文件路径(切记不要出现中文路径,笔者帮你们试过了,代码会被吞);IDE选择MDK-ARM,此时系统会在keil中生成代码

基于stm32Cubemx的矩阵键盘配置
点击生成代码,打开工程

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 */

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

引脚连接

结果展示

基于stm32Cubemx的矩阵键盘配置
一段正弦波显示了出来,可以看到,效果灰常好啊!感兴趣的读者可以自己设计一段DAC程序,非常有趣。

至此,4*4矩阵键盘配置完成。文章来源地址https://www.toymoban.com/news/detail-476049.html

到了这里,关于基于stm32Cubemx的矩阵键盘配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32CubeMX驱动4x4键盘模块

    4x4键盘模块是一种常用的电子组件,它由16个按钮或开关以矩阵方式排列而成,可以与微控制器或其他数字电路设备一起使用。该模块通常用于数据输入、操作界面等各种应用场合。 如果你的单片机已经有足够的GPIO引脚可供使用,可以把4x4键盘模块中的16个按键分别连接到

    2024年01月21日
    浏览(56)
  • STM32 CubeMX USB_(HID 鼠标和键盘)

    STM32 CubeMX 自动生成的USB_HID是鼠标类型的:键盘类型要做一点小修改; 参考: STM32CubeMX学习笔记 USB鼠标HID描述符以及数据格式

    2024年02月14日
    浏览(38)
  • STM32F1基于STM32CubeMX配置硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕

    📌相关篇《【STM32CubeIDE】STM32F103硬件SPI驱动1.8寸TFT LCD128X160 ST7735S屏幕》 ✨驱动效果就不做演示了,和上面的相关篇一样,主要是为了方便使用MDK Keil开发的使用。所以花了点时间从上面的工程当中做了分离,重新使用STM32CubeMX配置一个方便二次开发移植使用和配置的工程。本

    2024年02月03日
    浏览(50)
  • RFID课程设计--基于STM32F103RCT6的智能门禁系统,STM32RCT6+RC522+OLED+DHT11+4*4矩阵键盘

      本次课程设计要求如下,我们团队两人完成了90%的功能。   其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)   然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没

    2024年01月16日
    浏览(81)
  • STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标

    正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 野火DAP仿真器 XCOM V2.6串口助手 使用STM32CubeMX软件配置STM32F407开发板 USB_OTG_FS为工作在Human Interface Device Class (HID)(人机接口设备类)模式下的USB_DEVICE(USB从机),利用上下左右四

    2024年02月19日
    浏览(44)
  • 【STM32-矩阵键盘】

    1.矩阵键盘简介 2.原理描述 3.代码编写 4.自我总结 1.矩阵键盘简介 此处我们采用4*4的矩阵键盘,需要 8个端口 与单片机连接 4个控制行,4个控制列 2.原理描述 很多人不清楚八个引脚怎么连接,这里我采取PD0-PD7 PD0-PD3 控制 1-4行 , PD4-PD7 控制 1-4列 如何确定我们按下的是哪个按

    2024年02月16日
    浏览(40)
  • stm32矩阵键盘(扫描模式)

    因为最近开发一个项目需要用到3*4的矩阵键盘,所以我就写了一下相关的矩阵键盘的内容,分享出来供大家参考。 特别感谢:Yeah__binbin 我所用到的矩阵键盘是3*4的矩阵键盘实物图如下 其中是4行3列,示意图如下 采用循环扫描的方式主要是应用while循环来进行,优点是可以进

    2024年02月02日
    浏览(35)
  • stm32 USB复合设备 cubeMX库一键生成 多路CDC串口 HID鼠标键盘 Composite Device

    最近有个需求,需要同时用usb键盘鼠标和虚拟串口等,因为平时没怎么研究过usb协议,所以自己写复合设备一直没有成功,然后正巧在github上看到了一个stm32的一个usb复合设备库,可以快速配置usb组合设备,并且支持超级多路串口 Gihub地址 https://github.com/alambe94/I-CUBE-USBD-Compo

    2024年02月09日
    浏览(68)
  • stm32 4*4矩阵键盘 中断扫描

    找了很多4*4矩阵键盘的资料和代码,很多都用的是扫描的方式,还有一些看不太明白。我理想中的方式是中断,所以自己写了一个。 这是某宝上的实物和电路图  用的GPIO口是B0、1、3、4、5、6、7、8  B0、1、3、4上拉输入,B5、6、7、8推挽输出 从右到左为第1234列,从上到下为

    2024年02月06日
    浏览(34)
  • 【STM32】4x4矩阵键盘

    key.c   key.h

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包