STM32F103 矩阵键盘4*4 16*16等任意矩阵 按键扫描程序

基于STM32的按键扫描测试程序(学习记录):

目录:

  1. 源码;
  2. 4x4按键原理;
  3. 按键扫描逻辑;

Tips:

  1. 粘贴代码时,粘贴在源文件存放的位置中(如:HARDWARE中的.c和.h文件),用C++编译器打开,而不是kei;最后keil会正常显示中文字符;
  2. 程序使用嵌套循环实现4x4按键扫描,如果IO口设置过乱时,将循环拆分即可;

key4x4.h源文件

#ifndef __KEY4x4_H
#define __KEY4x4_H	 
#include "sys.h"
 
#define KEY_X(X)	PEin(X)				// 尽量避免使用PD以上GPIO,便于移植;
#define KEY_Y(Y)	PEout(Y)

#define ALL_DOWN_KEY_Y	{	KEY_Y(11) = 0; KEY_Y(12) = 0; KEY_Y(13) = 0; KEY_Y(14) = 0;}
 
void KEY4x4_Init(void);		// IO口初始化
u8 KEY4x4_Scan(void);  		// 矩阵按键反馈函数	// 可配置任意矩阵按键使用!!
u8 KEY16_Scan(void);

/**************
其他按键扫描方案:
按键使用8个输入IO口, 且所有IO口一端接VCC/VSS;

程序框架:	
	扫描检测哪两个IO口输入高/低电平;VCC/VSS
	根据对应坐标,return对应编号;
**************/

#endif

key4x4.c源文件

#include "stm32f10x.h"
#include "key4x4.h"
#include "sys.h" 
#include "delay.h"
#include "usart.h"


/*************************
X:
	PEin	7-10
Y:
	PEout	11-14
*************************/


// 矩阵按键初始化函数
void KEY4x4_Init(void)
{
		GPIO_InitTypeDef GPIO_InitStructure;

		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);

		GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;//KEY0-KEY1
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置成下拉输入
		GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE

		GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14;				 //LED0-->PB.5 端口配置
		GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 //推挽输出
		GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
		GPIO_Init(GPIOE, &GPIO_InitStructure);					 		//根据设定参数初始化GPIOE
}

// 使所有输出拉低;初始化;		// 可以使用define宏定义,执行速度更快,不用跳转函数!!
static void KEY_ALL_Pull_Down(void)
{
	KEY_Y(11) = 0;
	KEY_Y(12) = 0;
	KEY_Y(13) = 0;
	KEY_Y(14) = 0;
}

// 4x4按键扫描函数
// 使用一个嵌套循环,完成扫描X和Y;
// 原理: 通过Y 依次输出高电平,
//				扫描X 那个IO口输入高电平;
// X轴:输入检查、扫描;
// Y轴:设置输出状态;
// 该函数适合任意排列矩阵按键,只需修改循环中对应编号!!
// 注意: 1. 改变IO口时,该函数还需要改变循环中IO口编号;(可以定义好IO口编号,便于修改)
//				2. 该函数同样有优先级问题! 即同时按下时,只反馈先被扫描到的(0-15标号最小的)
//				3. 函数同一坐标轴的IO口编号必须相邻或能有 规律递增可寻;(否则无法用循环判断)
//				4. 暂时未添加功能(模式):	按键复用 和 长按;
// 2020-11-13		返回值调整为:1-16
// 11/14 不支持连按;解决重复反馈的问题;
u8 KEY4x4_Scan(void)
{
	int i,j;
	u8 IO_Sign = 0;				// 很简便的一个IO反馈方式标签!!!  且嵌套循环特有!!  // 能返回0-15,适合任意排列矩阵按键
	static key_up = 1;
	
	//KEY_ALL_Pull_Down();										// 初始化所有按键输出拉低;
	
	for (i = 11; i <= 14; i++)							// Y输出IO口编号;
		for (j = 7; j <= 10; j++,IO_Sign++)		// X输出IO口编号;  // 递增IO_Sign,反馈对应值(0-15);
		{
			KEY_Y(i) = 1;			// 使PEout(i)输出高电平;
			
			if (KEY_Y(i))			// 扫描Y输出高电平, 可以取消此判断; 因为必须输出高电平时,才能正常判断!!
			{
				if (KEY_X(j) && key_up)		// 当输入检查到高电平时;
				{
					key_up = 0;
					printf("按键扫描反馈: %d  \r\n",IO_Sign);
					return IO_Sign;
				}
				else if (!KEY_X(7)&&!KEY_X(8)&&!KEY_X(9)&&!KEY_X(10))			// 当所有输入检测到低电平时,再次使能按键; 防止重复反馈
				{
					key_up = 1;
					KEY_ALL_Pull_Down();										// 初始化所有按键输出拉低(低电平);必须在此位置;
				}
			}
			else
				printf("PEout:IO口%d输出异常!  \r\n ", i);
		}
		
	delay_ms(10);					// 按键防抖;
}


/******************************************标准扫描函数*********************************************/
// 支持连按
u8 KEY16_Scan(void)
{
	int i,j;
	u8 IO_Sign = 0;				// 很简便的一个IO反馈方式标签!!!  且嵌套循环特有!!  // 能返回0-15,适合任意排列矩阵按键
	
	ALL_DOWN_KEY_Y													// 初始化所有按键输出拉低;
	
	for (i = 11; i <= 14; i++)							// Y输出IO口编号;
		for (j = 7; j <= 10; j++,IO_Sign++)		// X输出IO口编号;  // 递增IO_Sign,反馈对应值(0-15);
		{
			KEY_Y(i) = 1;			// 使PEout(i)输出高电平;

			if (KEY_X(j))			// 当输入检查到高电平时;
				return IO_Sign;
		}
		
	delay_ms(20);					// 按键防抖;		// 连按延时;
}

*4x4按键原理图
在这里插入图片描述

  1. 按键工作原理:
    当按键被按下时,相连的电路导通;即S1按下时,位于0行0列的线短路,使标号4和5对应的IO口相连(导通);
    最后通过扫描检测输入输出状态即可判断出对应按键被按下;

  2. 程序设计思路:
    程序通过依次使标号1、2、3、4(列0-3)输出高电平,判断5/6/7/8(行0-3)状态;完成按键扫描;

  • 22
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 17
    评论
### 回答1: 您好!关于 stm32f103 所对应的 4x4 矩阵键盘程序,您可以参考以下代码: ``` #include "stm32f10x.h" #define ROWS 4 #define COLS 4 GPIO_InitTypeDef GPIO_InitStructure; // 按键映射表 const char keymap[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; // 初始化 GPIO void GPIO_Config(void) { // 使能 GPIOA 时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 初始化行引脚 PA0 - PA3,设置为推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure); // 初始化列引脚 PA4 - PA7,设置为浮空输入 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } // 读取按键状态 char getKey(void) { int row, col; // 将行引脚设置为高电平,列引脚设置为输入 for (row = 0; row < ROWS; row++) { GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_SetBits(GPIOA, GPIO_Pin_0 << row); for (col = 0; col < COLS; col++) { if (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4 << col) == Bit_RESET) { // 等待按键释放 while (GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4 << col) == Bit_RESET); // 返回按键对应字符 return keymap[row][col]; } } } // 没有按键按下,返回空字符 return '\0'; } int main(void) { char key; GPIO_Config(); while (1) { key = getKey(); if (key != '\0') { // 按键被按下,执行相应操作 // 这里可以添加自己的代码 } } } ``` 该程序使用 GPIOA 的 4 个引脚作为矩阵键盘的行引脚,使用 GPIOA 的另外 4 个引脚作为列引脚。程序首先将行引脚设置为高电平,列引脚设置为输入,然后检测每个按键是否被按下,如果检测到按键被按下,则返回按键对应的字符。您可以根据需要修改 keymap 数组以映射不同的按键。 ### 回答2: STM32F103是一款功能强大的微控制器,能够轻松实现4*4矩阵键盘的数据读取。实现这个功能的关键在于矩阵键盘的工作原理。矩阵键盘通常由一个行和列的矩阵组成,因此需要读取每一行和每一列的数据。对于STM32F103微控制器来说,需要先将每一列与悬空引脚相连,同时将每一行与输入引脚相连。 在程序开发中,首先需要声明引脚的输入和输出,然后开始扫描矩阵键盘。对于每一列引脚,需要将其设置为输出模式,同时输出高电平。然后再读取每一行的电平状态,如果有电平变化,则说明该行对应的按键按下,程序相应地记录下按键的状态。接着,对于下一列,需要将其输出低电平,然后重新读取每一行状态,以便继续记录按键状态。当所有列都扫描完毕,程序就能够得到整个矩阵键盘的按键状态,并可以进行相应的操作。 实现4*4矩阵键盘程序的关键在于代码的编写和调试,需要仔细分析引脚和按键的连接方式,并逐一调试程序,确保能够准确地读取矩阵键盘的按键状态。此外,还需要注意程序的实时性和可靠性,避免由于程序出现问题导致按键读取不准确或程序崩溃等情况。因此,在编写程序时,需要加入各种保护机制和异常处理机制,保证程序的稳定性和可靠性。 总之,STM32F103微控制器可以轻松实现4*4矩阵键盘程序,能够广泛应用于各种嵌入式系统中,为产品的功能提升和应用拓展提供了极大的便利。 ### 回答3: stm32f103矩阵键盘程序4*4的实现可以采用按键扫描的方式。主控芯片通过按键矩阵的行列脚引脚完成与按键的连接,同时,程序需要设置行列的扫描方式,这是因为按键所在的矩阵,需要在一定的时间间隔内进行周期性扫描,以判断当前是否有按键按下,相应地进行按键的收发动作。 在实现矩阵键盘程序的过程中,需要进行如下步骤: 1. 配置主控芯片的引脚,将矩阵键盘的行列脚连接到主控芯片。 2. 编写键盘扫描程序,使主控芯片能够周期性扫描按键矩阵,以判断是否有按键动作产生。键盘扫描程序一般采用轮询方式扫描,也可以使用中断方式进行扫描。 3. 编写按键检测程序,将扫描到的按键编码进行处理,使得按键对应的信息能够被主控芯片识别并处理。按键检测程序需要采用状态机的方式进行编写,以实现较为灵活和可靠的按键检测和处理功能。 4. 进行按键的反馈操作,将按键的信息进行发送或接收处理。 总之,实现stm32f103矩阵键盘程序4*4的过程较为繁琐,需要掌握一定的硬件和软件知识,同时,需要充分了解所采用的主控芯片的特性和编程方法,以保证程序的正确性和可靠性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值