在线客服:
亚博电子竞技 亚博电子竞技
全国服务热线:010-93914935
您的位置:首页 > 新闻中心 >

在STM32f4日记7中使用外部矩阵键盘(4X4矩阵键盘可释放板上的资源)

浏览 146次 来源:【jake推荐】 作者:-=Jake=-    时间:2021-02-14 02:12:53
[摘要] 核心模块:4X4矩阵键盘矩阵键盘16个按键,一共被8根线连接P30,P31,P32,P33连接四行,P34,P35,P36,P37连接四列。按照上面给出的那个矩阵键盘的图:

//

如果您认为这对您有帮助yobo体育 ,请同意,这对我非常重要,谢谢。

//

一、设备介绍

核心模块:4X4矩阵键盘

在这里插入图片描述

示意图如下:

在这里插入图片描述

二、原理说明

研究过51单片机的朋友必须对矩阵键盘有更多的了解,但是对于刚开始使用STM32的朋友来说,矩阵键盘可能是一个难题。让我简要介绍一下(使用非标准语言)。

只需使用以下示意图:

在这里插入图片描述

矩阵键盘的16个键通过8条线连接到P30,P31,P32,P33,以连接四行,而P34,P3532 矩阵键盘,P36,P37,以连接四列。

首先,我们将P30,P31亚博直播 ,P32,P33初始化为输入IO,并将P34,P35,P36,P37初始化为输出IO

例如:如果我们按S1

首先将P30设为高电平,然后检测P34,P35,P36,P37,然后发现P34较高

再次将P31设为高电平,这时我们检测到P34,P35,P36,P37并发现它们都是低电平。

再次将P32设为高,这时我们检查P34钱柜体育 ,P35,P36,P37,发现它们都为低

再次将P33设为高电平,这时我们检查P34,P35,P36,P37,发现它们都是低电平。

这时32 矩阵键盘,我们确定与P34和P30相关的键是被按下的键。这是S1,通常称为矩阵键盘的扫描。

对于其他按钮等,您会发现与每个按钮相对应的两行都是唯一的。

三、硬件连接

我们使用PF的2、3、4、5 IO端口和PC的0、1、2、3 IO端口(PF输出,PC输入)

根据上面给出的矩阵键盘的图片:

PF的2,3,4,5个IO端口对应于R1,2,3,4。

PC的0,1,2,3对应于C1,2,3,4。

四、代码编写

key.c

有两个函数void KEY_Init(void)用于配置底层

u8 KEY_Scan(void)用于矩阵键盘检测

#include "key.h"
#include "sys.h" 
#include "usart.h"
u8 tem;
void KEY_Init(void) 
{ 
 GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOF,ENABLE);
 
	GPIO_InitStructure.GPIO_Pin  =      GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; 
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
 	GPIO_Init(GPIOC, &GPIO_InitStructure);//输入
 
 
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;   
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOF, &GPIO_InitStructure);//输出 
}
 
 
u8 KEY_Scan(void)
{	
	static u8 key_flag1=1,key_flag2=1,key_flag3=1,key_flag4=1;     
	u8 KeyVal;
  GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFFC3 )|0x0004));	//0100     1111 1111 1100 0011  检测第一行
	if(key_flag1&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
	{
		 key_flag1=0;
		     if (Read_Lie1==1){ KeyVal= 1; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie2==1) {KeyVal= 2; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie3==1) {KeyVal= 3; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie4==1) {KeyVal= 4; printf("key:%d\r\n",KeyVal);}
	}
	else if(Read_Lie1==0&&Read_Lie2==0&&Read_Lie3==0&&Read_Lie4==0)key_flag1=1;
	else return 0;
	
 
		GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFFC3 )|0x0008));//1000检测第二行
	if(key_flag2&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
	{
		 key_flag2=0;
		     if (Read_Lie1==1){ KeyVal= 5; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie2==1) {KeyVal= 6; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie3==1) {KeyVal= 7; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie4==1) {KeyVal= 8; printf("key:%d\r\n",KeyVal);}
	}
	else if(Read_Lie1==0&&Read_Lie2==0&&Read_Lie3==0&&Read_Lie4==0)key_flag2=1;
	else return 0;
	
	GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFFC3 )|0x0010));//   0001  0000检测第三行
	if(key_flag3&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
	{
		key_flag3=0;
		     if (Read_Lie1==1){ KeyVal= 9; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie2==1) {KeyVal= 10; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie3==1) {KeyVal= 11; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie4==1) {KeyVal= 12; printf("key:%d\r\n",KeyVal);}
	}
	else if(Read_Lie1==0&&Read_Lie2==0&&Read_Lie3==0&&Read_Lie4==0)key_flag3=1;
	else return 0;
	
	
				
	 GPIO_Write(GPIOF,(( GPIOF->ODR & 0xFFC3 )|0x0020));//0010 0000检测第四行
   if(key_flag4&&(Read_Lie1==1||Read_Lie2==1||Read_Lie3==1||Read_Lie4==1))
	 {
		 key_flag4=0;
		     if (Read_Lie1==1){ KeyVal= 13; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie2==1) {KeyVal= 14; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie3==1) {KeyVal= 15; printf("key:%d\r\n",KeyVal);}
		else if (Read_Lie4==1) {KeyVal= 16; printf("key:%d\r\n",KeyVal);}
	 }
	 else if(Read_Lie1==0 &&Read_Lie2==0 &&Read_Lie3==0 &&Read_Lie4==0 )key_flag4=1;
	 else return 0;
	 return KeyVal;
 
}

GPIO_Write(GPIOF,(((GPIOF-> ODR&0xFFC3)| 0x000 8));这是位操作,所以我们画出关键点。让我们理解。

key.h内部

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"
 
#define Read_Lie1 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_0)
#define Read_Lie2 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_1)
#define Read_Lie3 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_2)
#define Read_Lie4 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)
 
 
void KEY_Init(void);
u8 KEY_Scan(void);  	
#endif

只需在主函数中循环KEY_Scan()

五、实验结果

打开串行端口yb体育 ,然后依次按下键以查看数据

在这里插入图片描述

六、实际上,比赛的输入和显示可以集成为一个

使用串行端口屏幕

您可以阅读我在STM32f4 Diary 4 HMI智能串行屏幕和MCU串行通信实验之前发布的文章

只需单击上面的链接

老王
本文标签:矩阵,矩阵键盘,外设

推荐阅读

最新评论