news 2026/4/3 3:08:13

基于STM32F103VET6外部中断的矩阵键盘高精度计算器实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32F103VET6外部中断的矩阵键盘高精度计算器实现

文章目录

    • 1. 项目概述
      • 1.1 设计目标
      • 1.2 技术选型
      • 1.3 成果展示
    • 2. 硬件设计
      • 2.1 矩阵键盘电路
      • 2.2 硬件连接
    • 3. 开发环境搭建
      • 3.1 软件清单
      • 3.2 CubeMX配置步骤
    • 4. 核心代码实现
      • 4.1 外部中断配置 (exti.c)
      • 4.2 键盘扫描算法 (keypad.c)
      • 4.3 高精度计算引擎 (calculator.c)
    • 5. 系统整合与调试
      • 5.1 主程序框架 (main.c)
      • 5.2 常见问题解决
    • 6. 完整技术图谱

1. 项目概述

1.1 设计目标

实现基于STM32的外部中断触发矩阵键盘扫描,构建支持加减乘除、括号运算的高精度浮点计算器,精度达小数点后8位。

1.2 技术选型

模块技术方案
主控芯片STM32F103VET6
键盘扫描EXTI外部中断+行列扫描
计算核心自定义大数运算库
显示输出LCD1602液晶屏

1.3 成果展示

矩阵键盘输入

EXTI中断捕获

键值解码

计算引擎处理

LCD显示结果


2. 硬件设计

2.1 矩阵键盘电路

4x4 Matrix Keyboard

ROW1-PA0

COL1-PB0

COL2-PB1

ROW2-PA1

ROW3-PA2

COL3-PB2

ROW4-PA3

COL4-PB3

2.2 硬件连接

STM32引脚键盘接口功能
PA0-PA3ROW1-4中断输入
PB0-PB3COL1-4扫描输出
PC13LED状态指示

3. 开发环境搭建

3.1 软件清单

  • STM32CubeMX v6.8.0
  • Keil MDK v5.37
  • ST-Link Utility

3.2 CubeMX配置步骤

  1. 配置PA0-PA3为EXTI中断模式
  2. 设置PB0-PB3为GPIO输出
  3. 启用SYSTICK定时器
  4. 生成MDK工程代码

4. 核心代码实现

4.1 外部中断配置 (exti.c)

/* 文件名:exti.c */#include"stm32f10x.h"voidEXTI_Config(void){EXTI_InitTypeDef EXTI_InitStruct;NVIC_InitTypeDef NVIC_InitStruct;// 配置PA0-PA3为中断源RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource0);// ... 其他引脚配置// 中断线参数设置EXTI_InitStruct.EXTI_Line=EXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3;EXTI_InitStruct.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_Trigger=EXTI_Trigger_Falling;// 下降沿触发EXTI_InitStruct.EXTI_LineCmd=ENABLE;EXTI_Init(&EXTI_InitStruct);// 配置NVICNVIC_InitStruct.NVIC_IRQChannel=EXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=0x00;NVIC_InitStruct.NVIC_IRQChannelSubPriority=0x00;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_InitStruct);}

4.2 键盘扫描算法 (keypad.c)

/* 文件名:keypad.c */#defineDEBOUNCE_TIME20// 消抖时间20msconstuint8_tKeyMap[4][4]={{'7','8','9','/'},{'4','5','6','*'},{'1','2','3','-'},{'C','0','=','+'}};uint8_tGetKeyValue(void){staticuint32_tlast_tick=0;if(HAL_GetTick()-last_tick<DEBOUNCE_TIME)return0xFF;// 消抖处理for(uint8_tcol=0;col<4;col++){// 设置当前列为低电平GPIO_WriteBit(GPIOB,GPIO_Pin_0<<col,Bit_RESET);// 检测行状态for(uint8_trow=0;row<4;row++){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0<<row)==RESET){GPIO_WriteBit(GPIOB,GPIO_Pin_0<<col,Bit_SET);// 恢复列状态last_tick=HAL_GetTick();returnKeyMap[row][col];}}GPIO_WriteBit(GPIOB,GPIO_Pin_0<<col,Bit_SET);// 恢复列状态}return0xFF;// 无按键}

4.3 高精度计算引擎 (calculator.c)

/* 文件名:calculator.c */#defineMAX_DIGITS16// 最大支持16位数typedefstruct{doubleoperand1;doubleoperand2;charoperator;uint8_tinput_mode;// 0:等待操作数1, 1:等待操作数2}CalcState;voidProcessInput(CalcState*calc,charkey){staticcharnum_buffer[MAX_DIGITS+1];staticuint8_tbuf_index=0;switch(key){case'0'...'9':if(buf_index<MAX_DIGITS){num_buffer[buf_index++]=key;num_buffer[buf_index]='\0';}break;case'+':case'-':case'*':case'/':if(calc->input_mode==0){calc->operand1=atof(num_buffer);calc->operator=key;calc->input_mode=1;buf_index=0;}break;case'=':if(calc->input_mode==1){calc->operand2=atof(num_buffer);switch(calc->operator){case'+':calc->operand1+=calc->operand2;break;case'-':calc->operand1-=calc->operand2;break;case'*':calc->operand1*=calc->operand2;break;case'/':if(calc->operand2!=0)calc->operand1/=calc->operand2;break;}calc->input_mode=0;}break;}}

5. 系统整合与调试

5.1 主程序框架 (main.c)

#include"stm32f10x.h"#include"lcd.h"intmain(void){HAL_Init();EXTI_Config();LCD_Init();CalcState calculator={0};while(1){charkey=GetKeyValue();if(key!=0xFF){ProcessInput(&calculator,key);LCD_DisplayResult(calculator.operand1);}}}

5.2 常见问题解决

问题现象解决方案
按键连击增加防抖延时至50ms
浮点运算精度丢失使用sprintf格式化为%.8f输出
LCD显示乱码检查时序配置,调整延时
中断无响应确认NVIC优先级配置正确

6. 完整技术图谱

STM32F103VET6

EXTI外部中断

GPIO矩阵扫描

高精度浮点运算

按键事件捕获

键值解码

计算引擎

LCD1602显示

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/29 7:48:25

【项目开源】一个基于Spring Cloud Alibaba的充电桩运营管理后台

先上代码&#xff01;Gitee平台 温馨提示&#xff1a;文末有资源获取方式 一、简述 SpringBoot 框架&#xff0c;充电桩平台充电桩系统充电平台充电桩互联互通协议云快充协议1.5新能源汽车电动自行车公交车-四轮车充电充电源代码充电平台源码Java源码无加密项目 二、介绍 云…

作者头像 李华
网站建设 2026/3/27 8:57:20

[特殊字符]_网络IO性能优化:从TCP到HTTP的层层优化[20260126041432]

作为一名专注于网络性能优化的工程师&#xff0c;我在过去的项目中积累了丰富的网络IO优化经验。最近&#xff0c;我参与了一个对网络性能要求极高的项目——实时视频流平台。这个项目让我重新审视了Web框架在网络IO方面的表现。今天我要分享的是基于真实项目经验的网络IO性能优…

作者头像 李华
网站建设 2026/3/27 15:34:41

Qwen-Image-Edit-2511让AI绘画更有逻辑,空间关系更准

Qwen-Image-Edit-2511让AI绘画更有逻辑&#xff0c;空间关系更准 你有没有试过这样编辑一张图&#xff1a;想把照片里沙发左边的绿植换成一盏落地灯&#xff0c;结果AI不仅把灯放歪了&#xff0c;还让灯罩朝向窗外、影子却打在天花板上&#xff1f;或者给产品图换背景时&#…

作者头像 李华
网站建设 2026/4/2 18:35:57

机械制造Vue大文件分段上传DEMO?

第一章&#xff1a;毕业设计の终极挑战 "同学&#xff0c;你这毕业设计要做文件管理系统&#xff1f;还要支持10G大文件上传&#xff1f;"导师推了推眼镜&#xff0c;我仿佛看到他头顶飘着"这届学生真难带"的弹幕。 "是的老师&#xff01;还要兼容I…

作者头像 李华
网站建设 2026/3/28 3:37:22

Vue 常用的调试启动命令和编译命令

在 Vue 项目里&#xff0c;常用的调试启动命令和编译命令如下&#xff1a;开发环境调试启动要是你用的是 Vue CLI 创建的项目&#xff0c;可在项目根目录下运行下面的命令来启动开发服务器&#xff1a;npm run serve执行该命令后&#xff0c;项目会进入热更新模式&#xff0c;只…

作者头像 李华