STM32CubeMX驱动4x4键盘模块_4*4键盘模块介绍-程序员宅基地

技术标签: 计算机外设  stm32  c语言  测试用例  STM32外设模块的驱动与使用  单片机  

1. 4x4键盘模块简介

4x4键盘模块是一种常用的电子组件,它由16个按钮或开关以矩阵方式排列而成,可以与微控制器或其他数字电路设备一起使用。该模块通常用于数据输入、操作界面等各种应用场合。

如果你的单片机已经有足够的GPIO引脚可供使用,可以把4x4键盘模块中的16个按键分别连接到8个GPIO引脚上,并通过软件编程实现对按键的控制和读取。在这种情况下,不需要为4x4键盘模块提供额外的电源。

需要注意的是,在将4x4键盘模块与单片机相连时,要根据模块中按键的排列顺序和引脚定义表格来正确地接线。同时,还需要在程序设计时实现正确的按键扫描算法,以便能够准确地检测每个按键的状态并作出相应的响应。

总之,4x4键盘模块是一个功能强大、易于使用的电子元件,广泛应用于各种机械化、自动化系统中,可以大大提高工作效率和准确性。对于电子爱好者来说,学习和实践4x4键盘模块也是很好的锻炼机会。

4x4键盘实物图:
在这里插入图片描述
4x4键盘原理图:
在这里插入图片描述

2. 4x4键盘模块原理

2.1 独立按键的原理

在这里插入图片描述
在按键没按下时,IO口接一个上拉电阻,IO口始终输出高电平。在按键按下时,IO口与地之间由断路变为短路,此时IO口输出低电平。按键松开时,IO口又变为高电平。因此,IO口由高电平变为低电平的过程代表按键被按下;IO口由低电平恢复为高电平的过程代表按键松开。程序实现:先将这个IO口设置为上拉输入,如果检测到这个IO口变为低电平,说明按键被按下。
对GPIO工作模式有疑问的点击这里
(当然有些按键左端连接的是VCC,右端连接的IO口应该被设置为下拉输入,因此程序实现是先将这个IO口设置为下拉输入,如果检测到这个IO口变为高电平,说明按键被按下)

2.2 矩阵键盘的原理

矩阵键盘的原理是通过在行和列之间建立一个矩阵连接来实现的。每个按键都被分配给矩阵中的一个行和一个列,这意味着你可以通过扫描每个行和列的交点来确定哪个按键正在被按下。对于16个按键的矩阵键盘,需要4行和4列的矩阵来表示,因此只需要8个引脚就可扫描这个矩阵。
与独立按键不同,矩阵键盘按键,它两端都是IO口。我们可以代码设置输入端口为低电平,输出端口为上拉输入,如下图:
在这里插入图片描述
此时这个按键就与独立按键基本相同。
以检测下面黄色按键为例讲解其扫描原理。
在这里插入图片描述
R2C3:首先先将输入端R1-R4的电平分别设置为1011,再将输出端C1-C4输出模式设置为上拉输入,那么当检测到输出端C3为低电平时,表示按键R2C3被按下。同理,当检测到C1\C2\C4为低电平时,表示按键R2C1\R2C2\R2C4被按下。
R3C2:首先先将输入端R1-R4的电平分别设置为1101,再将输出端C1-C4输出模式设置为上拉输入,那么当检测到输出端C2为低电平时,表示按键R3C2被按下。同理,当检测到C1\C3\C4为低电平时,表示按键R2C1\R2C3\R2C4被按下。
其它按键与此相似。

3. 移植源码到工程

提前创建一个文件夹,用来存放工程(文件夹路径建议全英文)
打开STM32CubeMX,选择芯片(这里选择STM32F103ZET6),配置Debug,ST-LINK选择Serial Wire。
在这里插入图片描述
使能HSE和LSE,配置时钟频率为72M。
在这里插入图片描述
在这里插入图片描述
根据矩阵键盘原理知矩阵键盘只需要将四个行配置为推挽输出,四个列配置为上拉输入即可。
这里将E0,E2,E4,E6配置为推挽输出(因为需要这四个引脚既能输出高电平也能输出低电平),将F0,F2,F4,F6配置为上拉输入。
在这里插入图片描述
由于要使用OLED模块显示按键值来确定是否驱动成功,因此配置硬件IIC,这里使能IIC1,对应STM32F103ZET6引脚为PB6和PB7。
对STM32CubeMX驱动OLED有疑问的点击这里(内含OLED驱动源码提取方式)
在这里插入图片描述
创建工程名,配置编译环境。
在这里插入图片描述
这里用keil5编译,因此选择MDK-ARM-V5。
点击配置代码生成器并生成代码。
在这里插入图片描述
点击GENERATE CODE即可生成代码。
打开工程存放的位置。
移植oled和矩阵键盘相关的.h和.c文件到工程中。

相关文件提取方式:
关注微信公众号:码上芯路人
私信:模块驱动

说明:key_4x4.h中是一些宏定义和键盘扫描相关的函数声明,key_4x4.c中是键盘扫描相关函数的定义。
将oled.h、oledfont.h和key_4x4.h文件复制到工程文件目录Key_4x4_test\Core\Inc中
在这里插入图片描述
将oled.c和key_4x4.c文件复制到工程文件目录Key_4x4_test\Core\Src中
在这里插入图片描述
双击打开Key_4x4_test\MDK-ARM目录中UVPROJX文件,按下图提示操作。
在这里插入图片描述
在这里插入图片描述
编译后oled.h和oledfont.h将被包含在oled.c目录下,key_4x4.h将被包含在key_4x4.c目录下。
在这里插入图片描述
在这里插入图片描述
这个模块的驱动函数只有一个——按键扫描函数,这个函数的实现细节已在源码的注释中给出,这里不做赘述。

4. 实验

按下键盘对应的数字、符号或字母显示在OLED屏上。
主函数内容如下:

#include "main.h"
#include "i2c.h"
#include "gpio.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "key_4x4.h"
#include "oled.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
//初始显示:按下对应按键
void OLED_DisplayInit()
{
    
    OLED_ShowCHinese(16,3,2);
    OLED_ShowCHinese(32,3,3);
    OLED_ShowCHinese(48,3,4);
    OLED_ShowCHinese(64,3,5);
    OLED_ShowCHinese(80,3,6);
    OLED_ShowCHinese(96,3,7);
    
}
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
    
  /* USER CODE BEGIN 1 */
int key;
  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
    OLED_Init();
    OLED_Clear();
    OLED_DisplayInit();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
//说明:行(row),列(column)
/********************************************
C4_R1 1		C4_R2 2     C4_R3 3     C4_R4 13A
C3_R1 4		C3_R2 5	    C3_R3 6		C3_R4 14B
C2_R1 7		C2_R2 8     C2_R3 9     C2_R4 11C
C1_R1 10*	C1_R2 0		C1_R3 15#   C1_R4 12D
********************************************/      
      key=key4x4scan();
      if(key>-1)
      {
    
          if(key>=0&&key<=9){
    
              OLED_Clear();
              OLED_ShowNum(64,3,key,1,16);
          }
          else if(key==10){
    
              OLED_Clear();
              OLED_ShowChar(64,3,'*',16);
          }
          else if(key==11){
    
              OLED_Clear();
              OLED_ShowChar(64,3,'C',16);
          }
          else if(key==12){
    
              OLED_Clear();
              OLED_ShowChar(64,3,'D',16);
          }
          else if(key==13){
    
              OLED_Clear();
              OLED_ShowChar(64,3,'A',16);
          }
          else if(key==14){
    
              OLED_Clear();
              OLED_ShowChar(64,3,'B',16);
          }
          else if(key==15){
    
              OLED_Clear();
              OLED_ShowChar(64,3,'#',16);
          }
              
        }
  }
  /* USER CODE END 3 */
}

效果如下:

KEY_4x4_实验

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_52158753/article/details/130276484

智能推荐

Docker 快速上手学习入门教程_docker菜鸟教程-程序员宅基地

文章浏览阅读2.5w次,点赞6次,收藏50次。官方解释是,docker 容器是机器上的沙盒进程,它与主机上的所有其他进程隔离。所以容器只是操作系统中被隔离开来的一个进程,所谓的容器化,其实也只是对操作系统进行欺骗的一种语法糖。_docker菜鸟教程

电脑技巧:Windows系统原版纯净软件必备的两个网站_msdn我告诉你-程序员宅基地

文章浏览阅读5.7k次,点赞3次,收藏14次。该如何避免的,今天小编给大家推荐两个下载Windows系统官方软件的资源网站,可以杜绝软件捆绑等行为。该站提供了丰富的Windows官方技术资源,比较重要的有MSDN技术资源文档库、官方工具和资源、应用程序、开发人员工具(Visual Studio 、SQLServer等等)、系统镜像、设计人员工具等。总的来说,这两个都是非常优秀的Windows系统镜像资源站,提供了丰富的Windows系统镜像资源,并且保证了资源的纯净和安全性,有需要的朋友可以去了解一下。这个非常实用的资源网站的创建者是国内的一个网友。_msdn我告诉你

vue2封装对话框el-dialog组件_<el-dialog 封装成组件 vue2-程序员宅基地

文章浏览阅读1.2k次。vue2封装对话框el-dialog组件_

MFC 文本框换行_c++ mfc同一框内输入二行怎么换行-程序员宅基地

文章浏览阅读4.7k次,点赞5次,收藏6次。MFC 文本框换行 标签: it mfc 文本框1.将Multiline属性设置为True2.换行是使用"\r\n" (宽字符串为L"\r\n")3.如果需要编辑并且按Enter键换行,还要将 Want Return 设置为 True4.如果需要垂直滚动条的话将Vertical Scroll属性设置为True,需要水平滚动条的话将Horizontal Scroll属性设_c++ mfc同一框内输入二行怎么换行

redis-desktop-manager无法连接redis-server的解决方法_redis-server doesn't support auth command or ismis-程序员宅基地

文章浏览阅读832次。检查Linux是否是否开启所需端口,默认为6379,若未打开,将其开启:以root用户执行iptables -I INPUT -p tcp --dport 6379 -j ACCEPT如果还是未能解决,修改redis.conf,修改主机地址:bind 192.168.85.**;然后使用该配置文件,重新启动Redis服务./redis-server redis.conf..._redis-server doesn't support auth command or ismisconfigured. try

实验四 数据选择器及其应用-程序员宅基地

文章浏览阅读4.9k次。济大数电实验报告_数据选择器及其应用

随便推点

灰色预测模型matlab_MATLAB实战|基于灰色预测河南省社会消费品零售总额预测-程序员宅基地

文章浏览阅读236次。1研究内容消费在生产中占据十分重要的地位,是生产的最终目的和动力,是保持省内经济稳定快速发展的核心要素。预测河南省社会消费品零售总额,是进行宏观经济调控和消费体制改变创新的基础,是河南省内人民对美好的全面和谐社会的追求的要求,保持河南省经济稳定和可持续发展具有重要意义。本文建立灰色预测模型,利用MATLAB软件,预测出2019年~2023年河南省社会消费品零售总额预测值分别为21881...._灰色预测模型用什么软件

log4qt-程序员宅基地

文章浏览阅读1.2k次。12.4-在Qt中使用Log4Qt输出Log文件,看这一篇就足够了一、为啥要使用第三方Log库,而不用平台自带的Log库二、Log4j系列库的功能介绍与基本概念三、Log4Qt库的基本介绍四、将Log4qt组装成为一个单独模块五、使用配置文件的方式配置Log4Qt六、使用代码的方式配置Log4Qt七、在Qt工程中引入Log4Qt库模块的方法八、获取示例中的源代码一、为啥要使用第三方Log库,而不用平台自带的Log库首先要说明的是,在平时开发和调试中开发平台自带的“打印输出”已经足够了。但_log4qt

100种思维模型之全局观思维模型-67_计算机中对于全局观的-程序员宅基地

文章浏览阅读786次。全局观思维模型,一个教我们由点到线,由线到面,再由面到体,不断的放大格局去思考问题的思维模型。_计算机中对于全局观的

线程间控制之CountDownLatch和CyclicBarrier使用介绍_countdownluach于cyclicbarrier的用法-程序员宅基地

文章浏览阅读330次。一、CountDownLatch介绍CountDownLatch采用减法计算;是一个同步辅助工具类和CyclicBarrier类功能类似,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。二、CountDownLatch俩种应用场景: 场景一:所有线程在等待开始信号(startSignal.await()),主流程发出开始信号通知,既执行startSignal.countDown()方法后;所有线程才开始执行;每个线程执行完发出做完信号,既执行do..._countdownluach于cyclicbarrier的用法

自动化监控系统Prometheus&Grafana_-自动化监控系统prometheus&grafana实战-程序员宅基地

文章浏览阅读508次。Prometheus 算是一个全能型选手,原生支持容器监控,当然监控传统应用也不是吃干饭的,所以就是容器和非容器他都支持,所有的监控系统都具备这个流程,_-自动化监控系统prometheus&grafana实战

React 组件封装之 Search 搜索_react search-程序员宅基地

文章浏览阅读4.7k次。输入关键字,可以通过键盘的搜索按钮完成搜索功能。_react search