当前位置: 首页 > news >正文

基于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显示

http://www.jsqmd.com/news/302802/

相关文章:

  • 存储服务器大流量写入由于 Ring Buffer 设置不合理导致丢包、断流的处理
  • 【日记】或许我只是接受不了要求(2543 字)
  • 冰雪聚贤,智启新局——2026崇礼论坛凝聚AI长期主义共识
  • A2UI 技术原理深度解析:AI Agent 如何安全生成富交互 UI
  • A2UI vs 传统模式:AI Agent UI 生成方案对比与 Token 消耗分析
  • 量子计算机的实用性为何依赖经典计算
  • 2026灵活用工新趋势:技术人才如何抓住“碎片化”就业红利?
  • 【源码可参考】开源能源数据监控平台:使用Spring Boot + Vue + 时序数据库开发实践
  • 基于非对称算法的资料下载安全方案设计
  • CMOS版图分析
  • 分析全国专业的少儿专注力培训公司,天使英才费用贵吗
  • 盘点专业的少儿大脑潜能开发品牌企业,排名情况如何
  • AI加持的开题报告模板,助你快速完成高质量学术写作
  • 想要加速学术写作?AI定制的开题报告模板不容错过
  • 这份AI优化的开题报告模板,让你的写作更高效精准
  • 这份AI增强的开题报告模板,是学术写作的理想选择
  • 降低AIGC生成内容重复率的最佳网站排名:10大免费与付费平台方案详细对比
  • 从0开始学语音检测:FSMN-VAD新手实战教程
  • 2026年汽车座椅发泡生产线设备厂商性价比排名,选购要点分享
  • 深度测评降低AIGC率的优质网站:10个平台免费版与付费版差异对比
  • 广州有实力的洗发水代加工定制厂家哪家性价比高
  • 借助AI工具,这份开题报告模板能显著提升学术写作效率。
  • 深聊输送链条行业,口碑好的品牌和专业制造厂盘点
  • 解读售后完善的少儿专注力培训公司,北京地区哪家更靠谱
  • 高效学术写作?试试这份AI优化的开题报告模板
  • AI驱动的开题报告模板,让你的学术写作事半功倍
  • 2026年口碑好的户外led大屏广告公司怎么选,上海震旦大厦广告/电视台广告/地铁广告,户外led大屏广告公司怎么选
  • 2026 深圳必吃野生菌火锅 锦上花鲜菌馆实测推荐
  • 2026封箱机行业亮点:全自动机型优质厂家大盘点,圆盘缠绕机/缠绕包装机/自走式缠绕包装机,封箱机源头厂家怎么选
  • 播客内容结构化:用ASR提取章节标题和关键知识点