STM32CubeMX驱动4x4键盘模块

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文件到工程中。
相关文件链接:
网盘链接:https://pan.baidu.com/s/1-Z0jRwueE1mM9Ocmf61MLQ
提取码:k4x4

说明: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 */
}

效果如下:
矩阵键盘实验效果

posted @ 2023-04-30 14:36  码上芯路人  阅读(146)  评论(0)    收藏  举报