STM32--按键矩阵--扫描法

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

一、按键矩阵原理

1.原理图

STM32--按键矩阵--扫描法

2.原理图讲解

按键矩阵其实是通过八根引脚来检测按下按键,常规按键一个按键对应一个引脚口的输入,而按键矩阵通过8根引脚,4根为输入模块,4根为输出模式,输出模块式依次输出,输入模式依次扫描,从而确定按键矩阵按下的按键所处位置,从而节省引脚资源的使用,理论上来说按键矩阵做的越多按键,引脚资源的利用率越高,但是正常来说也没人会用到36键啥的按键吧哈哈哈哈哈哈哈。所以4X4的按键矩阵用的是最广泛的。
STM32--按键矩阵--扫描法

二、按键矩阵实现思路

实现思路很简单,用到了扫描法去扫描按键矩阵的四根输入引脚,四根输出引脚依次输出高电平。从而确定按下按键的位置,为了方便后面的二次开发,设置了全局结构体变量去保存这次扫描按键是否有检测到按键按下,按下的行,列位置和将按键转换成1到16的数值按下的是哪个数值,整体的难度不大,但是写起来有点繁琐,接来下上代码,源码链接我会放在下面有想要下载来二次开发的可以去下载看看哈,没有的也可以自己根据下面部分代码去实现大家想要的功能。

三、按键矩阵实现代码

main.c

/*
	项目功能:按键矩阵按下通过串口发送按下的行、列、位数到调试助手
	时间:2022.05.04
	作者:嘻嘻子的呢
	项目设备:STM32F103C8T6、按键矩阵、USB转TTL
	项目接线:
		USB转TTL
			PA9	---- RX
			PA10---- TX
		按键矩阵:
			COL:
				PA1--COL1
				PA2--COL2
				PA3--COL3
				PA4--COL4
			ROW:
				PB1--ROW1
				PB2--ROW2
				PB3--ROW3
				PB4--ROW4
*/

int main(void)
{	
	//系统功能,设备,硬件初始化
	delay_init();
	NVIC_Configuration();
	USARTX_Init(USART1, 115200);
	KEY_MATRIX_Init();
	while(1) 
	{		
		KEY_MATRIX_Scan();
		if(xKEY_MATRIX.res_flag == 1)		
			printf("按下第 %d 行 \t 第 %d 列 \t 第 %d 个按键\r\n",xKEY_MATRIX.res_row,xKEY_MATRIX.res_col,xKEY_MATRIX.res);
	}	  
	
}

key_matrix.h


/*****************************************************************************
 ** 声明 全局变量
****************************************************************************/
typedef struct {
	GPIO_TypeDef* 	GPIOx;	//所用的GPIO端口
	uint16_t 		Pinx;	//所用的Pin引脚	
}GPIO_GROUP;

typedef struct 
{
	uint8_t 	res_flag;			// 检测结果  0:没有按下	1:有按下
	uint8_t 	res_row;			// 第几行
	uint8_t		res_col;			// 第几列
	uint8_t		res;				// 1-16 	从左到右从上到下
}xKEY_MATRIX_TypeDef;

extern xKEY_MATRIX_TypeDef xKEY_MATRIX;

/*****************************************************************************
 ** 声明  全局函数
****************************************************************************/
void KEY_MATRIX_Init(void);	// 按键矩阵初始化函数

void KEY_MATRIX_Scan(void);	// 按键矩阵扫描函数

key_matrix.c


static void KEY_ROW_Init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
static void KEY_COL_Init(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);

//控制某行电压
static void Activate_ROW(uint8_t row, uint8_t status);
//按键矩阵全部行的电压全部设置
static void Activate_ALL_ROW(uint8_t status);
/******************************************************************************
 * 函  数: KEY_MATRIX_Init
 * 功  能: 按键矩阵初始化    
 * 参  数: 无
 ******************************************************************************/  
void KEY_MATRIX_Init(void)
{
	u8 i = 0;
	//开启时钟
	RCC_APB2PeriphClockCmd(KEY_MATRIX_APB2PERIPH,ENABLE);	
	
	//配置引脚
	//KEY ROW  	推挽输出电压
	for(i = 0; i < 4; i++) 	KEY_ROW_Init(GPIO_KEY_ROW[i].GPIOx, GPIO_KEY_ROW[i].Pinx);
	
	//KEY COL	下拉输入
	for(i = 0; i < 4; i++)	KEY_COL_Init(GPIO_KEY_COL[i].GPIOx, GPIO_KEY_COL[i].Pinx);
}



/******************************************************************************
 * 函  数: Activate_ROW
 * 功  能: 按键矩阵行电压变化
 * 参  数: 无
 ******************************************************************************/ 
void Activate_ROW(uint8_t row, uint8_t status)
{
	if (status) 	GPIO_SetBits(GPIO_KEY_ROW[row].GPIOx, GPIO_KEY_ROW[row].Pinx);
	else 			GPIO_ResetBits(GPIO_KEY_ROW[row].GPIOx, GPIO_KEY_ROW[row].Pinx);
}

/******************************************************************************
 * 函  数: Activate_ROW
 * 功  能: 按键矩阵全部行电压一起变化
 * 参  数: 无
 ******************************************************************************/ 
void Activate_ALL_ROW(uint8_t status)
{
	int row;
	for (row = 0; row < 4; row++) 		Activate_ROW(row, status);
}

/******************************************************************************
 * 函  数: KEY_MATRIX_Scan
 * 功  能: 从按键矩阵中读取按下按键的位置数据       
 * 参  数: 无
 * 说  明: 调用后,获取到的数据,保存到结构体xKEY_MATRIX中
 ******************************************************************************/  
void KEY_MATRIX_Scan(void)
{
	u8 row = 0,col = 0;
	//所有行电平置零复位
	Activate_ALL_ROW(0);
	//结构体res_flag清零
	xKEY_MATRIX.res_flag = 0;
	//每行电压变化 每次电压变化完检查列是否有读取到电压
	//当读取到的时候即按键按下
	for(row = 0; row < 4 ; row++)
	{
		//行电压变化
		Activate_ROW(row, 1);
		delay_ms(1);
		for(col = 0; col < 4; col++)
		{
			//检测到高电平
			if(GPIO_ReadInputDataBit(GPIO_KEY_COL[col].GPIOx,GPIO_KEY_COL[col].Pinx) == 1)
			{
				// 结构体赋值
				xKEY_MATRIX.res_flag = 1;
				xKEY_MATRIX.res_row = row + 1;
				xKEY_MATRIX.res_col = col + 1;
				xKEY_MATRIX.res = row * 4 + col + 1;
			} 
		}
		Activate_ROW(row, 0);
	}
	//所有行电平置零复位
	Activate_ALL_ROW(0);
}

以上就是关于按键矩阵的源码展示啦,有需要下面链接下载哈,因为下载积分好像会动态的调整吧,如果觉得不着急的,可以下面留下邮箱或者私聊我哈,我发你也可以的,大家互相学习交流呀。

源文件链接

https://download.csdn.net/download/qq_45488746/85284058文章来源地址https://www.toymoban.com/news/detail-511286.html

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

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

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

相关文章

  • STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析

    本文基于标准函数库的工程实现stm32F103C8T6使用4*4的矩阵按键控制LED灯的亮灭及闪烁等功能。 程序源码:链接:https://pan.baidu.com/s/1_MPhvMduKCTP0MPG-Gtw3A?pwd=2syk  提取码:2syk 文章目录 一、矩形键盘介绍 1、硬件电路基本原理 2、两种识别方法介绍 3、硬件接线即使用 二、程序源码

    2024年02月04日
    浏览(32)
  • 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日
    浏览(23)
  • stm32矩阵按键状态机(可快速移植)

    首先声明,所写内容是协会成员集体成果。其中过程艰难坎坷,寻找过大量资料,失败过无数次,最终成功运行。其中仍有不足,欢迎大佬批评指正! 目录 一、扫描按键思路 二、状态机思路 三、代码部分 四、小结   1.原理图  2.使用引脚的选择 IO口的选择很重要, 一定要

    2024年02月11日
    浏览(21)
  • STM32控制矩阵按键,HAL库,cubeMX配置

    我使用的是STM32F103RCT6这款单片机,HAL库,使用cubeMX配置。 使用矩阵按键实现功能的方法为轮询法 1.首先矩阵键盘原理图如下: 2.实物图 按照矩阵键盘接法,16个按键需要8个io口,我选择了PC口的0~7号引脚,前四个依次接矩阵键盘的行,后四个依次接矩阵键盘的列;矩阵键盘的

    2023年04月17日
    浏览(52)
  • 【按键扫描】独立按键与矩阵按键

    我们通常提到按键,一般是指按键开关,也称为轻触开关。轻触开关是最常用的几种电子元器件之一,被各种电子产品广泛使用。 轻触开关与普通开关类似,但又略有不同。普通开关有闭合与断开两种状态,切换后状态会锁定,直到下次操作前不改变;而轻触开关内部有弹簧

    2024年02月04日
    浏览(27)
  • 正点原子STM32F103精英版+HAL库实现4×4矩阵按键检测

    首先声明,本人小白一枚,所做的工作都是借鉴网上的大佬+自己摸索,但是都是亲测实际有效的。 因为所需要的功能开发板自带按键不够用,所以购买了4×4矩阵按键,当时购买的时候以为一个按键对应一个IO口,后来发现不是这样的,会浪费太多的IO口,4×4矩阵键盘用8个

    2024年02月06日
    浏览(43)
  • 【STM32扫描4x4矩阵键盘模块】 4x4 matrix keypad interface

    矩阵键盘是将多个按键排布成类似矩阵形式的键盘组。为了减少IO资源的占用,将键盘组的每一行和每一列接入到GPIO。如下图的薄膜型键盘模块,第一个键盘组是3行x4列,所以共使用了3+4=7个GPIO口,即用7个GPIO表现了12个按键的状态;第二个键盘组是4行x4列,共使用了4+4=8个

    2024年01月18日
    浏览(36)
  • STM32_SPI总线驱动OLED详细原理讲解

    目录 13.1.1 SPI总线介绍 SPI(Serial Peripheral interface):是由Motorola公司开发的串行外围设备接口,是一种高速的,全双工,同步的通信总线。主要应用在 EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器等器件。 UART:异步串行全双工 SPI:同步串行全双工

    2024年01月20日
    浏览(32)
  • 32单片机按键扫描 实现长短按

    key.c key.h

    2024年02月03日
    浏览(28)
  • ‍☠️stm32Cubemx欠采样原理讲解与实现 采集高频信号

    本文主要讲解ADC借助欠采样采集高频信号,比如使用100k左右的采样率去采集1M的信号。 所需工具: 开发板:STM32F103RCT6 STM32CubeMX IDE: Keil-MDK 相关文章: STM32HAL ADC+TIM+DMA采集交流信号 STM32cubeHAL ADC+TIM+DMA (二) stm32cubemx ADC+TIM+DMA超频采样_ STM32ADC同步采样 看过本文最一开始的“相

    2024年02月08日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包