单片机基础——使用EXIT检测按键状态

本文介绍了如何使用STM32CubeMX配置单片机进行外部中断检测按键,包括选择芯片型号、配置时钟源、设置GPIO为中断引脚、NVIC中断优先级设置,以及编写中断处理函数,实现按键按下的LED控制功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 准备工作

硬件准备

  • 开发板
    首先需要准备一个小熊派IoT开发板,并通过USB线与电脑连接。

mark

2.生成MDK工程

选择芯片型号

打开STM32CubeMX,打开MCU选择器:

mark

搜索并选中芯片STM32L431RCT6:

mark

配置时钟源

  • 如果选择使用外部高速时钟(HSE),则需要在System Core中配置RCC;
  • 如果使用默认内部时钟(HSI),这一步可以略过;

这里我都使用外部时钟:

mark

配置LED的GPIO引脚

查看小熊派开发板的原理图,如下:

mark

所以接下来我们选择配置PC13引脚:

mark

设置用户标签为LED:

mark

配置GPIO引脚为外部中断引脚

查看小熊派开发板的原理图,如下:

mark

所以接下来我们选择配置PB2引脚和PB3引脚为外部中断引脚:

mark

因为没有设置硬件上拉,所以我们配置开启上拉电阻,并设置用户标签为KEY1KEY2,接下来是最重要的一步:

  • 开启下降沿触发中断:即在按下按键时电平由高变为低时触发
  • 开启上升沿触发中断:即在按下按键后松开时电平由低变为高时触发
  • 开启下降沿上升沿都触发中断:即在按下时触发,松开时再次触发

这里我选择开启下降沿触发中断:

mark

配置NVIC设置中断优先级

知识小卡片 —— NVIC

NVIC全称Nested vectored interrupt controller,即嵌套向量中断控制器,用来决定中断的优先级

NVIC在 ARM Conrtex-M 内核中,用一个 8 位的寄存器来配置,总共可以配置28=2562^8=2562

### 使用普中51单片机开发板A2 实现简易计算器 #### 矩阵键盘与数码管简介 矩阵键盘是一种高效的按键输入设备,能够减少所需的I/O端口数量。对于4×4的矩阵键盘来说,可以通过行列扫描的方式检测按下的键值[^3]。 数码管用于显示数据,其工作方式取决于所使用的类型——共阴极或共阳极。为了使特定段亮起,需向相应的引脚施加合适的电平信号[^2]。 #### 示例代码结构说明 针对此项目,程序被拆分成多个源文件以便管理和维护: - `main.c`:负责系统的初始化以及主循环中的逻辑处理; - `calculator.c`:实现了基本运算符解析及其对应的数学操作; - `delay.c`:提供精确延时功能支持其他模块的时间需求; - `lcd1602.c` 或者 数码管驱动部分(如果采用LCD则为前者); - `time.c`: 设定定时器参数并定义中断服务例程; - `uart.c` (可选): 如果涉及串行通信,则在此处编写相应协议栈; - `Infrared.c`(本案例不适用); - `EXIT.c` (外部硬件触发事件响应)[^4]. 下面是简化版的C语言代码片段展示如何利用上述组件构建一个简单的四则运算计算器应用程序: ```c // main.c 文件内容概览 #include "reg52.h" #include "calculator.h" void InitSystem(void){ // 初始化系统资源, 如IO配置、定时器设置等... } int main(){ unsigned char key=0; float result=0; InitSystem(); // 调用初始化函数 while(1){ key = GetKeyInput(); // 获取当前按下按钮编号 ProcessKeyPress(key,&result); // 将按键映射成数值/命令执行对应动作 DisplayResult(result); // 更新显示屏上的结果显示给用户看 } } ``` ```c // calculator.c 中的部分实现细节 float CalculateExpression(unsigned char op,float operand1,unsigned char operand2){ switch(op){ case '+':return operand1+operand2;break; case '-':return operand1-operand2;break; case '*':return operand1*operand2;break; case '/': if(operand2!=0)return operand1/operand2; else return ERROR_DIV_ZERO;// 防止除数为零错误发生 default : return ERROR_INVALID_OP; } } ``` 请注意这只是一个非常基础的例子,在实际应用当中还需要考虑更多因素比如异常情况处理、用户体验优化等方面的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值