STM32矩阵按键

article/2025/1/17 6:03:15

矩阵按键原理

本实验使用STM32F103单片机,主题代码通用的。

如果每个按键占用一个GPIO引脚,对于使用多个按键来说就是一种资源的浪费,因此当我们在设计时,可以考虑矩阵这种方式。本实验使用4*4也就是16个按键。
矩阵按键相对于独立按键稍微麻烦一点。4x4矩阵按键按照矩阵方式分别分为4行4列。主要有两种方式,一种是逐行扫描、一种是行列扫描。
原理图:
在这里插入图片描述

逐行扫描

通过在矩阵按键的每一条行线上轮流输出低电平,检测矩阵按键的列线,当检测到的列线不全为高电平的时候,说明有按键按下。然后,根据当前输出低电平的行号和检测到低电平的列号组合,判断是哪一个按键被按下。

行列扫描

首先,在全部行线上输出低电平,检测矩阵按键的列线,当检测到的列线不全为高电平的时候,说明有按键按下,并判断是哪一列有按键按下。
然后,反过来,在全部列线上输出低电平,检测矩阵按键的行线,当检测到的行线不全为高电平的时候,说明有按键按下,并判断是哪一行有按键按下。
最后,根据检测到的行号和检测的列号组合,以判断是哪一个按键被按下。

流程

矩阵按键程序实现

根据是国内棉矩阵按键电路图,编写矩阵按键应用程序,轮徇K1~K8按键动作,当对应的按键按下后,返回对应的值:

矩阵按键:
/************************************
按键表盘为: 1 2 3 10
4 5 6 11
7 8 9 12
13 0 14 15
/K1-K4(行)/
/K5-K8(列)/
/************************************
K1—>PC0
K2—>PC1
K3—>PC2
K4—>PC3
K5—>PC4
K6—>PC5
K7—>PC6
***********************************************************************/

编程要点

(1)使能LED灯和矩阵按键的GPIO时钟。调用函数:
RCC_AHB1PeriphClockCmd();
(2)编写矩阵按键扫描程序。
(3)同2-STM32GPIO输入之按键

矩阵按键初始化

/************************************************************************* @brief KEY_Config 按键初始化配置* @brief 列检测初始化* @param  无* @retval 无***********************************************************************/static void KEY_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*开启RCC时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);/*K1-K4(行)*/GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);//设置引脚为GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//设置引脚速度50MHZGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);/*K5-K8(列)*/GPIO_InitStructure.GPIO_Pin = (GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);//设置引脚为推挽输出模式GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//设置引脚速度50MHZGPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);
}

矩阵按键扫描程序

/************************************************************************* @brief KEY_4_4_Scan 扫描函数  矩阵按键扫描,返回一个键值* @brief 列检测初始化* @param  无* @retval uint8_t***********************************
按键表盘为:  1   2  3   104   5  6   117   8  9   1213  0  14  15
************************************矩阵按键:/************************************
按键表盘为:  1   2  3   104   5  6   117   8  9   1213  0  14  15
/************************************K1--->PC0K2--->PC1K3--->PC2K4--->PC3K5--->PC4K6--->PC5K7--->PC6***********************************************************************/
uint8_t KEY_4_4_Scan(void)
{u8 KeyVal = 0;GPIO_Write(GPIOC, (GPIOC->ODR & 0xff00 | 0x000f)); // PC0-PC3全部输出高。if (((GPIOC->IDR & 0X00F0)) == 0x0000)             // PC4-PC7为0则没有按键按下(第一次检测按键是否有按下){return 0xFF;}else{Delay_ms(10);                          //软件延时if (((GPIOC->IDR & 0X00F0)) == 0x0000) // PC4-PC7为0则没有按键按下(第二次检测按键是否有按下){return 0xFF;}}GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0001)); //仅将PC0置高switch ((GPIOC->IDR & 0X00f0))                       //第一行,从PC4开始拉高,其余为0,PC5-PC7一样{case 0x0010:KeyVal = 1; // PC4break;case 0x0020:KeyVal = 2; // PC5break;case 0x0040:KeyVal = 3; // PC6break;case 0x0080:KeyVal = 10; // PC7break;}while (((GPIOC->IDR & 0X00F0)) > 0) //等待按键释放,GPIO_Write(GPIOC, 0x0000);      //重新让PC0到PC3全部输出低。GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0002)); //仅将PC1置高switch ((GPIOC->IDR & 0X00F0))                       //第一行,从PC4开始拉高,其余为0,PC5-PC7一样{case 0x0010:KeyVal = 4;break;case 0x0020:KeyVal = 5;break;case 0x0040:KeyVal = 6;break;case 0x0080:KeyVal = 11;break;}while (((GPIOC->IDR & 0X00F0)) > 0) //等待按键释放GPIO_Write(GPIOC, 0x0000);      //重新让PC0到PC3全部输出低。GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0004)); //仅将PC2置高switch ((GPIOC->IDR & 0X00F0)){case 0x0010:KeyVal = 7;break;case 0x0020:KeyVal = 8;break;case 0x0040:KeyVal = 9;break;case 0x0080:KeyVal = 12;break;}while (((GPIOC->IDR & 0X00F0)) > 0)GPIO_Write(GPIOC, 0x0000); //重新让PC0到PC3全部输出低。GPIO_Write(GPIOC, ((GPIOC->ODR & 0xfff0) | 0x0008)); //仅将PC3置高switch ((GPIOC->IDR & 0X00F0)){case 0x0010:KeyVal = 13;break;case 0x0020:KeyVal = 0;break;case 0x0040:KeyVal = 15;break;case 0x0080:KeyVal = 16;break;}while (((GPIOC->IDR & 0X00F0)) > 0) //等待按键释放GPIO_Write(GPIOC, 0x0000);      //重新让PC0到PC3全部输出低。return KeyVal;
}

主函数

int main(void)
{uint8_t Key_value = 0;// 来到这里的时候,系统的时钟已经被配置成72M。LED_Config();BEEP_Config();SysTick_InitUP(); //配置10us中断一次USART_Config();KEY_Init();//矩阵按键代码测试while (1){Key_value = KEY_4_4_Scan();if (Key_value != 0xFF){Delay_ms(200);printf("Key_value=%d\r\n", Key_value);}Delay_ms(200);}
}

实验现象


http://chatgpt.dhexx.cn/article/y7rteUB9.shtml

相关文章

【按键扫描】独立按键与矩阵按键

按键介绍 我们通常提到按键,一般是指按键开关,也称为轻触开关。轻触开关是最常用的几种电子元器件之一,被各种电子产品广泛使用。 轻触开关与普通开关类似,但又略有不同。普通开关有闭合与断开两种状态,切换后状态会…

矩阵按键实验

矩阵按键简介 以 4*4 矩阵键盘为例。 16 个按键被排成 4 行 4 列,第一行将每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有 4 行 4 列共 8 根线,如图所示: 将这 8 根线连接…

51单片机学习记录(五)矩阵按键

文章目录 1、矩阵按键的控制原理2、矩阵按键实现1、行列式法实现矩阵按键2、线翻转法实现矩阵按键3、按键实战 1、矩阵按键的控制原理 独立按键与单片机连接时, 每一个按键都需要单片机的一个 I/O 口, 若某单片机系统需较多按键, 如果用独立…

51单片机矩阵键盘扫描及使用方法

一、矩阵键盘简介 矩阵键盘,也称矩阵按键,是为了节约单片机IO口占用所引入的一种外设。 (图片截取至普中A2开发板原理图) (图片截取至普中A2开发板实物图) 我们知道,一个独立按键需要1个IO口。但…

单片机编辑库四之矩阵按键

单片机编辑库一之延时与led灯 单片机编辑库二之按键 单片机编辑库三之蜂鸣器 单片机编辑库四之矩阵按键 之前为大家介绍了独立按键的原理和使用方法,这一章给大家带来一个升级体验——矩阵按键,话不多说,直接开始今天的内容。 一、矩阵按键…

51单片机——矩阵按键实验,小白讲解,相互学习

矩阵按键介绍: 独立按键与单片机连接时,每一个按键都需要单片机的一个I/O 口,若某单片机系统需较多按键,如果用独立按键便会占用过多的I/O 口资源.单片机系统中I/O 口资源往往比较宝贵,当用到多个按键时为了减少I/O 口…

STM32----矩阵按键

一、实物图 二、开发流程 分析:对于矩阵按键,我们一般采用行列扫描反转的方法进行开发,分别把每一个引脚连接一个GPIO口并设置一半成通用推挽输出模式,一半为上拉输入模式,行列扫描反转进行判断按击的按键来判断行列从…

(五)矩阵按键

本章我们主要是写矩阵键盘的内容,矩阵键盘的原理和独立按键的按键原理基本是类似的,只是关于整个的原理还是要有些介绍,本章我们通过矩阵按键的某个按键按下,然后在数码管上输出对应的按键值。 1.关于按键 可以看前面按键的内容…

【STM32 基础实验矩阵按键】

文章目录 一、元器件矩阵键盘说明二、基于stm32f10c8t6 基础实验矩阵按键(1)实验功能实现说明(2)矩阵键盘原理(3)代码部分(4)效果展示 三、总结与扩展附上参考文献链接与视频链接出处…

51单片机入门——矩阵按键

文章目录 1.按键1.1.独立按键1.2.矩阵按键 2.按键的扫描与抖动2.1.独立按键的扫描2.2.按键抖动与消抖2.3.矩阵按键的扫描 3.简易计算器 1.按键 1.1.独立按键 常用的按键电路有两种形式,独立式按键和矩阵式按键,独立式按键比较简单,它们各自…

mac怎么给移动硬盘分区

我们经常用Windows系统给移动硬盘分区,对于Windows系统的操作我们是非常熟悉的,但是现在很多人都在使用苹果电脑,那么如何用Mac给硬盘分区呢?这个可是需要技术的。如果我们不会用Mac系统给移动硬盘分区,当我们在Mac上插…

ntfs格式的移动硬盘如何在mac电脑写入?

随着照片视频等技术的进步,这类文件越发清晰的同时,占用内存也越来越大,人们逐渐将其中不常用到的存入移动硬盘中,以此减少电脑空间占用。目前国内大多数移动硬盘均为Windows自研的NTFS格式,对于这类NTFS格式的移动硬盘…

mac怎么删除硬盘里面的东西?为什么苹果电脑无法删除移动硬盘文件?

mac怎么删除硬盘里面的东西?由于移动硬盘的文件系统是NTFS格式的,而这种格式与Mac电脑是不兼容的,Mac电脑没有权限对移动硬盘上的数据进行操作,Mac上不能把移动硬盘的数据删除了,那么,有没有什么操作方法&a…

苹果电脑怎么用移动硬盘ntfs?快速读取和编辑Mac外置移动硬盘

苹果电脑怎么用移动硬盘ntfs?如果你对电脑比较熟悉的话,可能知道NTFS磁盘格式。该格式专门为Windows系统设计的,也称为Windows NT文件系统。从Windows系统迁移到Mac可能是一项相当困难的任务,因为NTFS格式的硬盘在Mac上不能正常工…

如何在Mac上给移动硬盘加密

随着人们的安全意识越来越强,手机加密、Wi-Fi加密,甚至平时工作的U盘、移动硬盘也要加密。在Mac上对移动硬盘加密并不是很难,通过磁盘工具对硬盘进行格式化处理,并重新选择磁盘格式便可实现加密。下面就让我们来看具体的操作吧&am…

mac无法在移动硬盘上新建文件夹 mac如何在移动硬盘新建文件夹

明明是新买的硬盘,为什么把移动硬盘插入Mac后,Mac无法在移动硬盘上新建文件夹呢?相信很多Mac用户都曾遇到过Mac无法在移动硬盘上新建文件夹的问题。为什么会出现这样的问题呢?用户应该怎么解决呢?本文就来为大家介绍ma…

Mac无法写入移动硬盘 这些软件帮你解决

疫情期间因工作需要,从淘宝上买了一个移动硬盘,将公司的文件拷贝到这个移动硬盘上,并没有发现什么问题,一拿回到家里就懵圈了,突然发现里面的文件都无法进行修改或剪切粘贴。 一番百度之后,我找到了原因&a…

Mac如何拷贝文件到移动硬盘

haha~ 看到这个标题不要以为博主这是傻了: “切, 往移动硬盘拷文件谁不会啊~”, “又在故弄玄虚, 就这也写博客~” … 确实, 我要把这个写成博客了. 因为今天要拷贝MacOS Sierra安装包到另外一台电脑上, 安装包有4.7个G, U盘果断不行, 于是换上移动硬盘, 连上电脑, 将安装包拖入…

Mac下如何把iphone资料备份到移动硬盘

一般的备份方法 首先新系统的iphone备份已经转到了访达 连接iphone后在访达左边栏会看到你的手机 在终端输入下面这段命令行 ln -s /Volumes/Data/ios_backup ~/Library/Application\ Support/MobileSync/Backup /Volumes/Data/ios_backup 这行是你想要指定的目…

怎样将iphone照片通过MAC导入移动硬盘?

iMazing是一款第三方的苹果iOS设备管理软件,大家使用数据线或Wi-Fi将苹果设备与电脑进行连接以后,就可以用它进行音乐传输、照片传输和数据备份等操作。 它支持Windows系统和Mac系统,下面通过一篇教程,教大家如何通过Mac系统的iM…