文章目录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 KeyboardROW1-PA0COL1-PB0COL2-PB1ROW2-PA1ROW3-PA2COL3-PB2ROW4-PA3COL4-PB32.2 硬件连接STM32引脚键盘接口功能PA0-PA3ROW1-4中断输入PB0-PB3COL1-4扫描输出PC13LED状态指示3. 开发环境搭建3.1 软件清单STM32CubeMX v6.8.0Keil MDK v5.37ST-Link Utility3.2 CubeMX配置步骤配置PA0-PA3为EXTI中断模式设置PB0-PB3为GPIO输出启用SYSTICK定时器生成MDK工程代码4. 核心代码实现4.1 外部中断配置 (exti.c)/* 文件名exti.c */#includestm32f10x.hvoidEXTI_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_LineEXTI_Line0|EXTI_Line1|EXTI_Line2|EXTI_Line3;EXTI_InitStruct.EXTI_ModeEXTI_Mode_Interrupt;EXTI_InitStruct.EXTI_TriggerEXTI_Trigger_Falling;// 下降沿触发EXTI_InitStruct.EXTI_LineCmdENABLE;EXTI_Init(EXTI_InitStruct);// 配置NVICNVIC_InitStruct.NVIC_IRQChannelEXTI0_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority0x00;NVIC_InitStruct.NVIC_IRQChannelSubPriority0x00;NVIC_InitStruct.NVIC_IRQChannelCmdENABLE;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_tick0;if(HAL_GetTick()-last_tickDEBOUNCE_TIME)return0xFF;// 消抖处理for(uint8_tcol0;col4;col){// 设置当前列为低电平GPIO_WriteBit(GPIOB,GPIO_Pin_0col,Bit_RESET);// 检测行状态for(uint8_trow0;row4;row){if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0row)RESET){GPIO_WriteBit(GPIOB,GPIO_Pin_0col,Bit_SET);// 恢复列状态last_tickHAL_GetTick();returnKeyMap[row][col];}}GPIO_WriteBit(GPIOB,GPIO_Pin_0col,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_DIGITS1];staticuint8_tbuf_index0;switch(key){case0...9:if(buf_indexMAX_DIGITS){num_buffer[buf_index]key;num_buffer[buf_index]\0;}break;case:case-:case*:case/:if(calc-input_mode0){calc-operand1atof(num_buffer);calc-operatorkey;calc-input_mode1;buf_index0;}break;case:if(calc-input_mode1){calc-operand2atof(num_buffer);switch(calc-operator){case:calc-operand1calc-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_mode0;}break;}}5. 系统整合与调试5.1 主程序框架 (main.c)#includestm32f10x.h#includelcd.hintmain(void){HAL_Init();EXTI_Config();LCD_Init();CalcState calculator{0};while(1){charkeyGetKeyValue();if(key!0xFF){ProcessInput(calculator,key);LCD_DisplayResult(calculator.operand1);}}}5.2 常见问题解决问题现象解决方案按键连击增加防抖延时至50ms浮点运算精度丢失使用sprintf格式化为%.8f输出LCD显示乱码检查时序配置调整延时中断无响应确认NVIC优先级配置正确6. 完整技术图谱STM32F103VET6EXTI外部中断GPIO矩阵扫描高精度浮点运算按键事件捕获键值解码计算引擎LCD1602显示