关于STM32的矩阵键盘实现

项目开发或者日常实验中有时候需要用到多个按键,但单片机IO口资源本身并不多,如果为每一个按键都分配一个IO的话未免太过浪费,所以使用矩阵键盘可以尽可能的节省单片机IO口资源。

开发准备:

1.系统:Windows
2.软件:Keil5
3.单片机:STM32F103C8T6

矩阵键盘与普通的一个IO对应一个按键的普通键盘不同。如图所示,16个按键通过图中的电路连接,构成了行和列,而只仅仅引出了8条线路,所以只需要8个IO口就能识别16个按键。与之类似的还有4x2矩阵键盘、3x3矩阵键盘等。
扫描矩阵键盘的键值可以使用逐行(列)扫描法。在STM32中,4个行IO设置为上拉输入,4个列IO设置为推挽输出低电平。当其中一个按键按下时,该按键对应的行IO口会被置为低电平,这时,将4个列IO逐个拉高,每拉高一个的同时检测行IO的电平,如果行IO的电平随着变化的话,就能确定哪个按键按下。当然,设置列IO为输入,或者下拉也是可以的,原理同上。

实验里使用2x4的矩阵键盘检测(原理一样,只是少了两行扫描而已)。

/*****GPIO口配置*****/
static void MX_GPIO_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pins : Rowline1_Pin Rowline2_Pin */     GPIO_InitStruct.Pin = Rowline1_Pin|Rowline2_Pin;   //行IO下拉输入GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLDOWN;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/*Configure GPIO pins : Column1_Pin Column2_Pin Column3_Pin Column4_Pin */GPIO_InitStruct.Pin = Column1_Pin|Column2_Pin|Column3_Pin|Column4_Pin;//列IO推挽输出,无上下拉GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);/*Configure GPIO pin Output Level */HAL_GPIO_WritePin(GPIOB, Column1_Pin|Column2_Pin|Column3_Pin|Column4_Pin, GPIO_PIN_SET);
}
/*********列IO操作宏定义*********/
#define Column1_OUT_Low  HAL_GPIO_WritePin(Column1_GPIO_Port, Column1_Pin, GPIO_PIN_RESET)
#define Column2_OUT_Low  HAL_GPIO_WritePin(Column2_GPIO_Port, Column2_Pin, GPIO_PIN_RESET)
#define Column3_OUT_Low  HAL_GPIO_WritePin(Column3_GPIO_Port, Column3_Pin, GPIO_PIN_RESET)
#define Column4_OUT_Low  HAL_GPIO_WritePin(Column4_GPIO_Port, Column4_Pin, GPIO_PIN_RESET)#define Column1_OUT_High  HAL_GPIO_WritePin(Column1_GPIO_Port, Column1_Pin, GPIO_PIN_SET)
#define Column2_OUT_High  HAL_GPIO_WritePin(Column2_GPIO_Port, Column2_Pin, GPIO_PIN_SET)
#define Column3_OUT_High  HAL_GPIO_WritePin(Column3_GPIO_Port, Column3_Pin, GPIO_PIN_SET)
#define Column4_OUT_High  HAL_GPIO_WritePin(Column4_GPIO_Port, Column4_Pin, GPIO_PIN_SET)/*********行IO操作宏定义*********/
#define Rowline1_INPUT_Read  HAL_GPIO_ReadPin(Rowline1_GPIO_Port, Rowline1_Pin)
#define Rowline2_INPUT_Read  HAL_GPIO_ReadPin(Rowline2_GPIO_Port, Rowline2_Pin)uint8_t key_scan(void){uint8_t i, keynum = 0;if (Rowline1_INPUT_Read == GPIO_PIN_SET){            //当有按键按下        for (i = 1; i <= 4; i++){if (i == 1) Column1_OUT_Low;      //逐个拉低每列的IOelse if (i == 2) Column2_OUT_Low;else if (i == 3) Column3_OUT_Low;else if (i == 4) Column4_OUT_Low;if (Rowline1_INPUT_Read == GPIO_PIN_RESET){   //如果检测到行IO电平跟着变化,则判断为该按键按下           keynum = i;                            if (i == 1) Column1_OUT_High;else if (i == 2) Column2_OUT_High;else if (i == 3) Column3_OUT_High; //每次列IO电平操作之后记得复原else if (i == 4) Column4_OUT_High;break;             }}}else if (Rowline2_INPUT_Read == GPIO_PIN_SET){for (i = 1; i <= 4; i++){if (i == 1) Column1_OUT_Low;else if (i == 2) Column2_OUT_Low;else if (i == 3) Column3_OUT_Low;else if (i == 4) Column4_OUT_Low;if (Rowline2_INPUT_Read == GPIO_PIN_RESET){             KeyValue.keynum = i+4;            if (i == 1) Column1_OUT_High;else if (i == 2) Column2_OUT_High;else if (i == 3) Column3_OUT_High;else if (i == 4) Column4_OUT_High;break;}          }}return keynum;
}

上述代码可以检测到哪个按键按下,但在实际项目开发途中,按下以及松开都需要进行一系列的消抖操作来判断到底是真的按下跟真的松开。关于这个问题,下文STM32–按键抖动问题的探讨会详细的描述。

STM32--矩阵键盘的设计实现相关推荐

  1. LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍

    描述 STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理器内核,整合增强的技术和功能,瞄准超低成本预算的应用.该系列微控制器缩短了采用 8 位和 16 位微控制器的设备与采用 3 ...

  2. 矩阵键盘硬件设计及软件流程

    很多情况下我们芯片的IO口不够用,但是有需要很多按键的话,矩阵键盘是一个很好的选择,通过矩阵键盘的设计我们可以用很少的IO来实现多个按键的功能.下面我们来介绍一下矩阵键盘的相关设计,不多说直接上图 上 ...

  3. 矩阵键盘简易计算机设计报告,矩阵键盘显设计报告..doc

    摘要 在日常生活中,我们经常要用到键盘来实现对电子装置的控制.小到手表手机,中到电视电脑,大到各种复杂仪器,都需要通过各种按键来实现各种操作.本次课程设计以按键控制显示为主题,以MSP430G2553 ...

  4. STM32 矩阵键盘通过串口输出

    STM32F103C8T6 4*4矩阵键盘 通过串口输出,可以用来写密码锁 程序的思路如下: 1.首先需要配置的是矩阵键盘:配置两个函数:  KEY44_Init(矩阵键盘初始化)和key44_Sca ...

  5. c语言数码管加法程序怎么写,拜托大神写数码管与矩阵键盘结合设计简易计算器C语言的程序...

    我和你用的是一样的,给你一个我买板子送的矩阵程序 //4*4键盘检测程序,按下键后相应的代码显示在数码管上 #include sbit beep=P2^3; sbit dula=P2^6; sbit ...

  6. 4x4矩阵键盘(STM32F103C8)

    一.前言 使用STM32F103C8T6最小系统,实现4x4矩阵键盘的键值上报,通过串口调试助手打印相关的键值,使用的是逐行逐列扫描法,通过库函数实现. 二.概述 ( 一)矩阵键盘简述 矩阵键盘是单片 ...

  7. 单片机实验说明<四>矩阵键盘与LCD基本使用

    实验四 矩阵键盘识别设计 设计要求: 对4×4矩阵式键盘电路的键值进行编码,编程实现在LCD液晶显示器上显示每个按键的"0-F"序号 电路设计: 软件代码: #include &q ...

  8. 单片机(二):3个IO扩展n*8个IO,基于74hc595与74hc165的8x8矩阵键盘

    3个IO通过一片74hc595扩展8个输出IO,3个IO通过一片74hc1655扩展8个输入IO,最终成为8X8的矩阵键盘.对于普通的矩阵键盘,再加入防止鬼键.消抖和按下与松开识别. 一.74hc59 ...

  9. 进阶项目(11) 矩阵键盘程序设计讲解

    写在前面的话 在使用按键的时候,如果按键不多的话,我们可以直接让按键与FPGA相连接,但是如果按键比较多的时候,如果还继续使用直接让按键与FPGA相连接的话,会大量增加FPGA端口的消耗,为了减少FP ...

  10. Arduino智能闹钟设计(8x8矩阵键盘+LCD显示)

    Arduino智能闹钟设计(8x8矩阵键盘+LCD显示+蜂鸣器歌曲) 作者:STCode(公众号同名) 1.效果描述: 本设计基于Arduino Nano控制器,主要功能为定时闹钟和环境温湿度显示,使 ...

最新文章

  1. 微信小程序顶部tab切换以及滑动
  2. URLEncoder.encode转译后“空格”变“加号”的问题的解决方案
  3. python hashlib模块
  4. 大数据数据收集数据困难_大数据架构、大数据开发与数据分析的区别
  5. 你或许不了解的C++函数调用(1)
  6. 我是在这里学到的Linux知识的
  7. 编码规范系列(一):Eclipse Code Templates设置
  8. 数据结构上机实践第八周项目7—对称矩阵的压缩存储及基本运算
  9. 如何让你的Linux云服务器更加的安全?
  10. matlab矩阵(一)--如何控制矩阵中小数点的位数
  11. Linux 有问必答: 如何在Linux中加入cron任务
  12. 4600u黑苹果 r5_黑苹果配置 篇四:黑苹果硬件选购指南之m-ATX篇--2019年8月
  13. 基于MATLAB实现四阶龙格库塔法求解一、二阶微分方程实例
  14. java代码混淆工具
  15. Delphi XE8 程序瘦身.编译后EXE最低90KB
  16. Job for named.service failed because the control process exited with error code.
  17. mysql limit acs_Oracle Acs资深顾问罗敏 老罗技术核心感悟:牛! 11g的自动调优和
  18. excel如何快速自动填充空白单元格上一行的内容
  19. web开发要学习什么技术,HTML实体字符列表
  20. Laravel 的 Auth::attempt () 初探及修改 bcrypt 验证为 MD5

热门文章

  1. JS逆向时碰到了恶心的死代码怎么办?手把手教你解决!
  2. 第一章 openEuler 安装指南
  3. 渗透杂记2013-07-31
  4. 微信小程序直播功能来了,然后呢?
  5. 在线教育,异军突起,有一种华丽转身,叫做.NET在线讲师!(全职/兼职皆可)...
  6. autorelease 释放池
  7. 民非企业盈利怎么处理_​民办非企业利息收入如何处理
  8. shell在xcode中涉及到的关键字
  9. 一毫米等于多少像素? - GetDeviceCaps
  10. minu-ui 的 mt-datetime-picker 组件在部分安卓机型上不显示日期只有取消和确认按钮