STM32CubeMX驱动4x4键盘模块

这篇具有很好参考价值的文章主要介绍了STM32CubeMX驱动4x4键盘模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 4x4键盘模块简介

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

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

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

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

4x4键盘实物图:
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
4x4键盘原理图:
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例

2. 4x4键盘模块原理

2.1 独立按键的原理

stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
在按键没按下时,IO口接一个上拉电阻,IO口始终输出高电平。在按键按下时,IO口与地之间由断路变为短路,此时IO口输出低电平。按键松开时,IO口又变为高电平。因此,IO口由高电平变为低电平的过程代表按键被按下;IO口由低电平恢复为高电平的过程代表按键松开。程序实现:先将这个IO口设置为上拉输入,如果检测到这个IO口变为低电平,说明按键被按下。
对GPIO工作模式有疑问的点击这里
(当然有些按键左端连接的是VCC,右端连接的IO口应该被设置为下拉输入,因此程序实现是先将这个IO口设置为下拉输入,如果检测到这个IO口变为高电平,说明按键被按下)

2.2 矩阵键盘的原理

矩阵键盘的原理是通过在行和列之间建立一个矩阵连接来实现的。每个按键都被分配给矩阵中的一个行和一个列,这意味着你可以通过扫描每个行和列的交点来确定哪个按键正在被按下。对于16个按键的矩阵键盘,需要4行和4列的矩阵来表示,因此只需要8个引脚就可扫描这个矩阵。
与独立按键不同,矩阵键盘按键,它两端都是IO口。我们可以代码设置输入端口为低电平,输出端口为上拉输入,如下图:
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
此时这个按键就与独立按键基本相同。
以检测下面黄色按键为例讲解其扫描原理。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
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。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
使能HSE和LSE,配置时钟频率为72M。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
根据矩阵键盘原理知矩阵键盘只需要将四个行配置为推挽输出,四个列配置为上拉输入即可。
这里将E0,E2,E4,E6配置为推挽输出(因为需要这四个引脚既能输出高电平也能输出低电平),将F0,F2,F4,F6配置为上拉输入。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
由于要使用OLED模块显示按键值来确定是否驱动成功,因此配置硬件IIC,这里使能IIC1,对应STM32F103ZET6引脚为PB6和PB7。
对STM32CubeMX驱动OLED有疑问的点击这里(内含OLED驱动源码提取方式)
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
创建工程名,配置编译环境。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
这里用keil5编译,因此选择MDK-ARM-V5。
点击配置代码生成器并生成代码。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
点击GENERATE CODE即可生成代码。
打开工程存放的位置。
移植oled和矩阵键盘相关的.h和.c文件到工程中。

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

说明:key_4x4.h中是一些宏定义和键盘扫描相关的函数声明,key_4x4.c中是键盘扫描相关函数的定义。
将oled.h、oledfont.h和key_4x4.h文件复制到工程文件目录Key_4x4_test\Core\Inc中
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
将oled.c和key_4x4.c文件复制到工程文件目录Key_4x4_test\Core\Src中
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
双击打开Key_4x4_test\MDK-ARM目录中UVPROJX文件,按下图提示操作。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
编译后oled.h和oledfont.h将被包含在oled.c目录下,key_4x4.h将被包含在key_4x4.c目录下。
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,c语言,测试用例
stm32矩阵键盘cube,STM32外设模块的驱动与使用,stm32,单片机,计算机外设,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_实验文章来源地址https://www.toymoban.com/news/detail-812606.html

到了这里,关于STM32CubeMX驱动4x4键盘模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • Arduino UNO 4X4矩阵键盘

    目录 一,硬件 二,原理 三,电路图 四,代码  五,实物图 Arduino UNO 4X4矩阵键盘         连接矩阵键盘的8个IO全部上拉,先使行线变为输入,列线变为输出并为低电平,若有按键按下,则对应的行线接地,判断哪个行线为低电平,则可读出第几行有按键被按下;然后使列

    2024年02月16日
    浏览(44)
  • 基于FPGA的4x4矩阵键盘控制器verilog开发实现

    欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 一、理论基础 二、核心程序 三、测试结果        基于FPGA的4x4矩阵键盘控制器是一种使用FPGA(现场可编程门阵列)来实现对4x4矩阵键盘进行控制的设备。该控制器能够有效地降低硬件资源的使用,提高系

    2024年02月11日
    浏览(43)
  • C51单片机-按下K0至K15,显示按键标号(4x4矩阵键盘电路,1个数码管)

    keil uVision4界面: proteus仿真界面:

    2024年02月04日
    浏览(44)
  • word 如何编写4x4矩阵

    百度上给的教程,打印出来没有对齐 https://jingyan.baidu.com/article/6b182309995f8dba58e159fc.html 百度上的方式试了一下,不会对齐。导致公式看起来很奇怪。 下面方式会自动对齐 摸索了一下发现可以用下面这种方式编写 4x4 矩阵。先创建一个 3x3矩阵,然后选择其中一个矩阵,右键插入

    2024年02月04日
    浏览(49)
  • 矩阵乘法优化:4x4矩阵块优化方法

    MMult_4x4_3.h 一次计算C中的4x4小块 0.24gflops 2.1% 1 MMult_4x4_4.h 一次计算C中的4x4小块 0.24gflops 2.1% 1 MMult_4x4_5.h 一次计算C中的4x4小块,将16个循环合并一个 0.25gflops 2.2% 1 MMult_4x4_6.h 一次计算C中的4x4小块(我们在寄存器中累加C的元素,并对a的元素使用寄存器) 1.75gflops 16.0% 1 MMult_4x4_7.h 在

    2024年02月15日
    浏览(49)
  • STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4

    STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4 Proteus 仿真小实验: STC15WProteus仿真HX711电子秤串口计价称重4x4键盘STC15W4K32S4 功能: 硬件组成:STC15W4K32S4单片机 +LCD12864显示器+4x4矩阵键盘+HX711电子秤 1.单片机通过HX711读取称重传感器数据计算出重量,重量乘于单价可以

    2024年02月12日
    浏览(45)
  • UG\NX二次开发 获取部件的4x4矩阵

    文章作者:里海 来源网站: https://blog.csdn.net/WangPaiFeiXingYuan 输入部件occ,获取矩阵。用函数UF_ASSEM_ask_transform_of_occ(),比较直接。 输入部件的实例或事例,获取矩阵。用函数UF_ASSEM_ask_component_data()。 通过部件事例获取实例的方法

    2024年02月14日
    浏览(47)
  • UG\NX二次开发 获取部件的4x4矩阵的方法

    文章作者:里海 来源网站: https://blog.csdn.net/WangPaiFeiXingYuan 方法1: 输入部件occ,获取矩阵。用函数UF_ASSEM_ask_transform_of_occ(),比较直接。 方法2: 输入部件的实例或事例,获取矩阵。用函数UF_ASSEM_ask_component_data()。 通过部件事例获取实例的方法 相关函数:    

    2024年02月12日
    浏览(53)
  • 基于stm32Cubemx的矩阵键盘配置

    我这里使用的是某宝一块四包邮的4*4矩阵键盘,感觉对大部分简单工程的实现绰绰有余 一般设置为最大速率,之后点击OK可以实现一键配置,时钟源这里选择的是高速外部时钟源(HSE) 随便找几个引脚 根据自己单片机的引脚数量和操作的方便性配置矩阵键盘的引脚 一般为四

    2024年02月08日
    浏览(41)
  • 多轴机械臂运动控制:4x4坐标变换矩阵该用C语言的二维数组还是一维数组?

            做多轴机械臂的运动控制,免不了要对4x4的坐标变换矩阵进行乘法,C语言中可以用二维数组或者一维数组来实现矩阵,下面来比较一下二维数组和一维数组的性能差异。         开发环境:Visual Studio 2022,分别在Debug和Release模式下测试函数Multi4x4和Multi16,Re

    2024年03月25日
    浏览(59)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包