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

这篇具有很好参考价值的文章主要介绍了STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文基于标准函数库的工程实现stm32F103C8T6使用4*4的矩阵按键控制LED灯的亮灭及闪烁等功能。

程序源码:链接:https://pan.baidu.com/s/1_MPhvMduKCTP0MPG-Gtw3A?pwd=2syk 
提取码:2syk

文章目录

一、矩形键盘介绍

1、硬件电路基本原理

2、两种识别方法介绍

3、硬件接线即使用

二、程序源码

1、矩阵键盘源码说明

2、主函数源码

三、实验现象


一、矩形按键介绍

1、硬件电路基本原理

STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析,STM32入级教程(基于标准库函数),stm32,计算机外设,嵌入式硬件

矩阵键盘意思是指按键的电路排列类似于矩阵的按键,而不是按键的排列外表呈矩阵状。矩阵式键盘用N条I/O线作为行线,N条I/O线作为列线,构成了一个具有N*N个按键的矩阵按键。由图中可见,这个4*4一共16个按键的矩阵按键只需要接8个IO口,若采用单个按键接法,却需要16个IO口,由此可见采用矩阵键盘可以大大提高IO口的利用率。

其原理图如下:

STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析,STM32入级教程(基于标准库函数),stm32,计算机外设,嵌入式硬件

2、两种识别方法介绍

一般对于矩阵键盘,有扫描法和反转法识别按键状态。

2.1  反转法

反转法找出每个按键的码,程序中判断8个引脚的状态,进行对比,判断出是那哪按键被按下,每个按键的码值由行码和列码构成。

我们以行为输入,列为输出。这里行输入端需要使用上拉输入(即四个行引脚均为高电平),输出需要使用推挽输出(输出为低电平),然后读取四个行输入的状态,若读到某一行为低电平时,则对应行被按下,这样就可以获取到行码。

STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析,STM32入级教程(基于标准库函数),stm32,计算机外设,嵌入式硬件

用同样的方法,将行跟列的输出输入对调再进行判断,这样就可以得到行码,结合行列码,我们就可以知道是哪个按钮被按下。

2.2  扫描法

扫描法:令所有的引脚都为高电平(行为输出,使用推挽输出高电平,列为输入,使用上拉电阻输入高电平),这时我们配置第一行为0,然后判断各列的输入状态,如某一列出出现低电平,则可判断出是第一行的某一列被按下;如果没有出现低电平,则令第二行引脚为0其余引脚为高电平,判断各列的输入状态;如此反复,若没有输入没有识别到低电平就继续对三四行进行判断,如此就可以对四行四列进行判断。

3、硬件接线及使用

STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析,STM32入级教程(基于标准库函数),stm32,计算机外设,嵌入式硬件

由上图可知整个4*4的矩阵键盘一共为8个引脚,其中C1、C2、C3、C4为列,R1、R2、R3、R4为行,这里将行接到PA0,PA1,PA2,PA3 ,列接到PA4,PA5,PA6,PA7。

二、程序源码

1、矩阵键盘源码说明

这里我们用扫描法进行矩阵按钮的识别,详细如下:

在函数初始化的时候给矩阵按钮的所有引脚配置成1(高电平),然后在实行逐行扫描,先令第一行为0(低电平),这是第一行的四个按钮进行判断(读取GPIO的引脚电平),若有按钮为0(低电平)时,即按钮被按下。当按钮被按下时,会将对应的键码传送到变量key中。

由于是机械按键,在按钮被按下的时候要进行消抖,然后在按钮按下的状态进行一个循环读取,当按钮松开后再对后面的按钮进行扫描,防止多个按钮同时按下时出现误判的情况。

第一行扫描完成且没有按钮被按下后,按照上面的方法对剩余的三行进行扫描。

将识别的子程序放在while循环函数中,可进行无限循环判断,这样我们对矩阵按钮的识别函数就完成了。详细程序看下方代码即后面的注释

#include "stm32f10x.h"
#include "key.h"
#include "Delay.h"

u8 FLAG = 0;  //FLAG这个变量为1时,证明有按钮正在被按下

void KEY_4x4_Init(void)     //键盘IO口配置及初始化
{
 	GPIO_InitTypeDef GPIO_InitStructure;       	
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);      
	//使用GPIOA的0,1,2,3引脚为行 R1~R4对应矩形按钮的5,6,7,8引脚
	GPIO_InitStructure.GPIO_Pin  = KEY_HANG;  //行  0123
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;     //使用推挽输出
    GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,KEY_HANG);   //令GPIO的0,1,2,3引脚输出为1
	/********************************************************************/
	GPIO_InitStructure.GPIO_Pin  = lie1|lie2|lie3|lie4;         
	//使用GPIOA的4,5,6,7引脚为列  C1~C4对应矩形按钮的4,3,2,1引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;        //使用上拉输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	GPIO_SetBits(GPIOA,lie1|lie2|lie3|lie4);	//令GPIO的4,5,6,7引脚输出为1	
}
//端口配置后,GPIOA的所有端口输出均为高电平
void KEY_Scan(u8 *key) 
{	 	
	GPIO_Write(GPIOA,0x00fe); //第一行  0000 0000 1111 1110   低四位为行   高四位为列
	/*令第一行输出为低电平,这时再判断4个列的输入状态的值,
	在按键没有被按下时,四列输出都是1,如果其中一列变为1,则可以判断S1按钮被按下*/
	if((lie1_Input==0)||(lie2_Input==0)||(lie3_Input==0)||(lie4_Input==0))   
	{
		Delay_ms(10);  //去抖动 
		
		if(lie1_Input==0)   //如果第一列被按下
		{
			FLAG = 1;    //按钮判断变量
			*key = 1;   //输出key的值为1传递到主函数,当值为x时,则说明按钮Sx被按下
				/*在变量前增加*,为c语言中的指针操作,使用指针进行地址传递,在子函数中修改的值在主函数中可以利用地址读取,
				而不需要利用子函数返回值,然后主函数在增加一个变量进行接收*/
			while(!GPIO_ReadInputDataBit(GPIOA,lie1));   
				//当按钮处于被按下的状态的时候,程序一直卡在循环读取按钮的状态,避免多按钮同时按下时读取错误
		}
		else if(lie2_Input==0)
		{
			FLAG = 1;
			*key = 2;
			while(!GPIO_ReadInputDataBit(GPIOA,lie2));
		}
		else if(lie3_Input==0)
		{
			FLAG = 1;
			*key = 3;
			while(!GPIO_ReadInputDataBit(GPIOA,lie3));
		}
		else if(lie4_Input==0)
		{
	    	FLAG = 1;
			*key = 4;
			while(!GPIO_ReadInputDataBit(GPIOA,lie4));
		}
		else  //如果第一行四列中没有按钮被按下
		{
			FLAG = 0;
			GPIO_Write(GPIOA,0x00ff);
		}
	}//第一行判断完成,这是我们判断第二行
	GPIO_Write(GPIOA,0x00fd);    //第二行         
	if((lie1_Input==0)||(lie2_Input==0)||(lie3_Input==0)||(lie4_Input==0))
	{
		Delay_ms(10);//去抖动 
		if(lie1_Input==0)
		{
			FLAG = 1;
			*key = 5;
			while(!GPIO_ReadInputDataBit(GPIOA,lie1));
		}
		else if(lie2_Input==0)
		{
	     	FLAG = 1;
			*key = 6;
			while(!GPIO_ReadInputDataBit(GPIOA,lie2));
		}
		else if(lie3_Input==0)
		{
	    	FLAG = 1;
			*key = 7;
			while(!GPIO_ReadInputDataBit(GPIOA,lie3));
		}
		else if(lie4_Input==0)
		{	 
	    	FLAG = 1;
			*key = 8;
			while(!GPIO_ReadInputDataBit(GPIOA,lie4));
		}
		else 
		{
			FLAG = 0;
			GPIO_Write(GPIOA,0x00ff);
		}
	}
	GPIO_Write(GPIOA,0x00fb);//第三行
	if((lie1_Input==0)||(lie2_Input==0)||(lie3_Input==0)||(lie4_Input==0))
	{
		Delay_ms(10);//去抖动 
		if(lie1_Input==0)
		{
			FLAG = 1;
			*key = 9;
			while(!GPIO_ReadInputDataBit(GPIOA,lie1));
		}
		else if(lie2_Input==0)
		{
	     	FLAG = 1;
			*key = 10;
			while(!GPIO_ReadInputDataBit(GPIOA,lie2));
		}
		else if(lie3_Input==0)
		{
	    	FLAG = 1;
			*key = 11;
			while(!GPIO_ReadInputDataBit(GPIOA,lie3));
		}
		else if(lie4_Input==0)
		{
	    	FLAG = 1;
			*key = 12;
			while(!GPIO_ReadInputDataBit(GPIOA,lie4));
		}
		else 
		{
			FLAG = 0;
			GPIO_Write(GPIOA,0x00ff);
		}
	}
	GPIO_Write(GPIOA,0x00f7);//第四行
	if((lie1_Input==0)||(lie2_Input==0)||(lie3_Input==0)||(lie4_Input==0))
	{
		Delay_ms(10);//去抖动 
		if(lie1_Input==0)
		{
			FLAG = 1;
			*key = 13;
			while(!GPIO_ReadInputDataBit(GPIOA,lie1));
		}
		else if(lie2_Input==0)
		{
	     	FLAG = 1;
			*key = 14;
			while(!GPIO_ReadInputDataBit(GPIOA,lie2));
		}
		else if(lie3_Input==0)
		{
	    	FLAG = 1;
			*key = 15;
			while(!GPIO_ReadInputDataBit(GPIOA,lie3));
		}
		else if(lie4_Input==0)
		{
	    	FLAG = 1;
			*key = 16;
			while(!GPIO_ReadInputDataBit(GPIOA,lie4));
		}
		else 
		{
			FLAG = 0;
			GPIO_Write(GPIOA,0x00ff);
		}
	}
	
}





2、主函数源码

这里用上GPIOB的10,11,12三个引脚接LED彩灯模块,对应为R,G,B(红,绿,蓝)三色,主函数中有两个子函数段,一个为端口初始化,另一个则是LED闪烁变换的程序段,其中函数的参数为闪烁间隔的时间。其现象为:按下S1,红灯亮;按下S2,绿灯亮;按下S3,蓝灯亮;按下S4,熄灭所有灯;按下S5,以0.3s的间隔RGB轮流闪烁一次;按下S6,以0.5s的间隔RGB循坏闪烁3次

#include "stm32f10x.h"                  // Device header
#include "Delay.H"
#include "key.H"

/****************************************************/
/*引脚使用说明:									*/
/*				矩形键盘: C1~C4对应GPIOA 4,5,6,7   */  
/*						   R1~R4对应GPIOA 0,1,2,3   */
/*				LED中的R,G,B对应GPIOB 10,11,12      */
/****************************************************/


void GPIO_Config(void)    //对GPIOB进行配置初始化
{
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOB,ENABLE );
	GPIO_InitTypeDef GPIO_Initstructure;
	GPIO_Initstructure .GPIO_Mode =GPIO_Mode_Out_PP;
	GPIO_Initstructure .GPIO_Pin=0X1D00 ;    //0001 1100 0000 0000
	GPIO_Initstructure .GPIO_Speed =GPIO_Speed_50MHz ;
	GPIO_Init (GPIOB ,&GPIO_Initstructure );
}

void LED_RGB(float  time)
{	
	u16 t =time *1000;		
	GPIO_Write (GPIOB ,0X0400);  // 0000 0100 0000 0000
	Delay_ms (t);
	GPIO_Write (GPIOB ,0X0800);  // 0000 1000 0000 0000
	Delay_ms (t);
	GPIO_Write (GPIOB ,0X1000);  // 0001 0000 0000 0000
	Delay_ms (t);
	GPIO_Write (GPIOB ,0X0000);
}

u8 key=0;
u8 k =0;
int main(void)
{
	GPIO_Config ();
	KEY_4x4_Init();
	while(1)
	{
		KEY_Scan (&key);
		if(FLAG == 1)    //按键按下
		{
			FLAG = 0;
			if(key==1)  //按下S1,亮红灯	
			{
				GPIO_SetBits (GPIOB ,GPIO_Pin_10 );
			}	
			else if(key==2)  //按下S2,亮绿灯
			{
				GPIO_SetBits(GPIOB,GPIO_Pin_11 );
			}
			else if(key==3)		//按下S3,亮蓝灯
			{
				GPIO_SetBits(GPIOB,GPIO_Pin_12 );
			}
			else if(key==4)   //按下S4,关闭所有灯
			{
				GPIO_Write (GPIOB,0X0000);   //0000 0000 0000 0000
			}
			else if(key==5)
			{
				LED_RGB (0.3);   //子函数参数为时间,单位为s
			}
			else if(key==6)
			{
				for(k=0;k<3;k++)
				{
				LED_RGB (0.5);
				}
			}		
		}
	}
}

三、实验现象展示

矩阵按键

本人也是初学STM32,在学习的同时以初学者的角度来理解说明,如果文章有错误的地方,请大家多多指正,谢谢!!!文章来源地址https://www.toymoban.com/news/detail-759323.html

到了这里,关于STM32矩形(矩阵)按键(键盘)输入控制LED灯 ——4*4矩阵按键源码解析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • stm32按键控制LED灯亮灭(中断法)

    stm32按键控制LED灯亮灭(中断法)

    用按键控制STM32上的LED灯亮灭,可以采用轮询法和中断法。轮询法需要不断检测按键的状态,消耗MCU;而中断法只是在按下的那一刻触发中断,控制灯亮灭。轮询法相对于更常规,容易操作。因此我们这里讲的用中断法。关于中断的概述,这里不作介绍,只讲操作,分析代码

    2024年02月07日
    浏览(13)
  • STM32之通过按键控制LED灯亮灭

    STM32之通过按键控制LED灯亮灭

    之前我们已经实现了LED灯的亮灭,我们对LED灯的结构应该有一个大致的了解。接下来我们对按键控制led进行学习。 首先我们要了解一下按键的结构。按键结构如图。  由此可知,此处我们有两种按键,一种是普通的按键KEY0, KEY1(KEY2),他们连接的串口分别是PE4, PE3(PE2),对应

    2024年02月08日
    浏览(9)
  • 【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

    【STM32】STM32学习笔记-按键控制LED 光敏传感器控制蜂鸣器(08)

    led.h led.c key.h key.c main.c 电路图: 实物图: buzzer.h buzzere.c lightsensor.h lightsensor.cpp main.c 04-Key控制LED.rar 05-光敏传感器控制蜂鸣器.rar 参考: 【STM32】江科大STM32学习笔记汇总

    2024年04月23日
    浏览(19)
  • STM32——05-按键、时钟控制、中断复位 点亮LED灯

    STM32——05-按键、时钟控制、中断复位 点亮LED灯

    如何点亮一颗LED灯   编程实现点灯 常用的 GPIO HAL 库函数: void HAL_GPIO_Init ( GPIO_TypeDef * GPIOx , GPIO_InitTypeDef * GPIO_Init ); void HAL_GPIO_WritePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin , GPIO_PinState PinState ); void HAL_GPIO_TogglePin ( GPIO_TypeDef * GPIOx , uint16_t GPIO_Pin );  结构体  GPIO_InitTypeDef  定义:

    2024年02月08日
    浏览(10)
  • 【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    【STM32】按键控制LED亮灭实验——GPIO、LED、KEY、SYS

    无锁存时:当按下独立按钮时LED亮,松开LED灭。 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。 硬件部分 软件部分 1、引入头文件 2、主函数 首先时钟、led、按键初始化 锁存时:当按下独立按钮时LED亮,松开LED仍亮,再按下独立按钮时LED熄灭。常

    2024年02月08日
    浏览(17)
  • 【STM32】控制LED灯和蜂鸣器的按键实验

    【STM32】控制LED灯和蜂鸣器的按键实验

    🐱作者:一只大喵咪1201 🐱专栏:《STM32学习》 🔥格言: 你只管努力,剩下的交给时间! 本喵这次介绍的实验是按键实验,同样使用STM32F103ZE型号的芯片,在开发板上有4个按键,实验目的是每按一个按键就会让LED灯或者是蜂鸣器的工作状态发生反转,下面本喵来详细介绍。

    2024年02月03日
    浏览(9)
  • STM32F103系列之按键控制LED灯

    STM32F103系列之按键控制LED灯

    上篇已经介绍了点灯的操作了,本篇主要介绍按键控制LED灯进行相关操作。 同样,我们需要对GPIO进行相关的初始化配置,这里我们将LED相关的代码全部放在LED.C和LED.H文件里面。 LED.C文件: LED.H文件: 然后我们开始写KEY.C和KEY.H文件里面的相关代码: 首先我们需要知道按键的

    2024年02月05日
    浏览(8)
  • STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器

    STM32第三课:按键控制LED灯,光敏传感器控制蜂鸣器

            STM32的第三课,我们来学习如何使用按键来控制LED灯的亮灭。上一节课我们通过代码控制了LED的状态,但是还是处于一种较为低级的方式控制LED灯,缺少交互性,用按键进行控制属于更高的一个层次。然后我们将学习通过光敏传感器控制蜂鸣器的通断,让我们的学

    2024年04月29日
    浏览(9)
  • 【江科大STM32合集】day2按键控制LED&光敏传感器控制峰鸣器

    【江科大STM32合集】day2按键控制LED&光敏传感器控制峰鸣器

    运算放大器-在江科大51单片机b站视频(AD/DA)复习 原理:两个极端 同相输入端电压 》反相输入端 电压输出最大值 接Vcc 同相输入端电压《 反向输入端 电压输出最小值 接GNd LED.c用来存放驱动程序的主体代码 (ps:逻辑运算代码都在这 LED.h用来存放驱动程序可以 对外 提供的函

    2024年01月17日
    浏览(15)
  • 【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

    【stm32】hal库学习笔记-GPIO按键控制LED和蜂鸣器(超详细!)

    注:本学习笔记基于stm32f4系列 使用的开发板为正点原子stmf407ZGT6探索者开发板 GPIO引脚使用时,可输入或输出数字信号 例如: 检测按键输入信号(Read_Pin)输出信号(Write_Pin) 输出信号点亮或熄灭LED GPIO引脚内部结构图 GPIO状态 输入浮空状态 :上拉下拉电阻均不使用(复位时

    2024年01月20日
    浏览(9)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包