stm32—按键(双模式,双函数选择)

不使用CubeMX

一、新建方法不说了,记得将key和led文件封装进去

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_9,color_FFFFFF,t_70,g_se,x_16 

二、ked.c代码:

1、按键初始化部分

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 2、第一个按键函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

注意:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 这个函数提供两种模式(是否连按)

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

注意这个函数存在响应优先级 

3、第二个按键函数

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

三、key.h部分:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

注意:

有两种方式读取电位,一种用位带操作读取,一种用HAL库读取

声明了.c文件里的三个函数,宏定义了一些特殊常量

四、main.c中:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

通过这个KEY_Scan();内的数字来选择扫描模式 

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16 

 0和1


使用CubeMX

一、首先记得先把delay函数和KEY函数封装好

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_7,color_FFFFFF,t_70,g_se,x_16 

二、端口初始化部分都在gpio.c里面完成

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 三、KEY.c里面没了初始化部分watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 四、KEY.h里面少了一个初始化函数声明

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 五、main.c:

这个Delay函数记得加上

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

 定义的8位变量和初始化延时函数调用放到这里面watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

操作部分没啥变化

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETkDljZPliJst55S15o6nLWh5Yg,size_20,color_FFFFFF,t_70,g_se,x_16

### STM32按键切换模式的设计 #### 软件部分:按键切换模式的实现 为了实现按键切换功能,可以通过读取GPIO引脚的状态来检测按键按下事件。当检测到按键状态变化时,执行相应的操作逻辑。以下是基于STM32的一个简单示例代码: ```c #include "stm32f1xx_hal.h" #define MODE_PIN GPIO_PIN_0 #define MODE_PORT GPIOA volatile uint8_t current_mode = 0; // 当前模式变量 // 初始化GPIO void GPIO_Init(void) { __HAL_RCC_GPIOA_CLK_ENABLE(); // 启用GPIOA时钟 GPIO_InitTypeDef GPIO_InitStruct = {0}; // 配置MODE_PIN为输入浮空模式 GPIO_InitStruct.Pin = MODE_PIN; GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Pull = GPIO_NOPULL; HAL_GPIO_Init(MODE_PORT, &GPIO_InitStruct); } // 按键中断服务函数 void EXTI0_IRQHandler(void) { if (__HAL_GPIO_EXTI_GET_IT(MODE_PIN)) { __HAL_GPIO_EXTI_CLEAR_IT(MODE_PIN); // 清除中断标志位 // 切换当前模式 current_mode++; if (current_mode > 2) { // 假设有三种模式 current_mode = 0; } // 执行对应模式的操作 switch (current_mode) { case 0: /* 进入模式0 */ break; case 1: /* 进入模式1 */ break; case 2: /* 进入模式2 */ break; } } } int main(void) { HAL_Init(); GPIO_Init(); // 配置EXTI线用于外部中断触发 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); while (1) { // 主循环处理其他任务 } } ``` 上述代码实现了通过按键切换不同工作模式的功能[^1]。 --- #### 硬件部分:电路设计说明 对于硬件设计而言,需要考虑以下几个方面: 1. **按键连接方式** 将按键的一端接地(GND),另一端连接至STM32的某个GPIO引脚(如PA0),并设置该引脚为上拉或下拉输入模式。 2. **去抖动电路** 按键开关通常存在机械反弹现象,因此建议加入软件延时或者硬件RC滤波器进行消抖处理。如果采用纯硬件方法,则可以在按键两端串联一个小电阻和电容形成简单的RC网络。 3. **电源管理** 如果设备运行于电池供电环境,应优先选用低功耗器件,并合理利用STM32内置的省电机制,比如进入睡眠模式减少不必要的电流消耗[^2]。 4. **PCB布局优化** 在实际制作过程中还需注意信号走线长度尽量短以减小干扰;同时保持良好的电气隔离措施防止噪声影响正常通信。 --- ### 总结 以上展示了如何编写一段基础程序以及规划配套的基础外围元件构成整个系统的框架图。此方案能够满足基本的应用场景需求——即通过物理按钮控制目标单片机改变其行为特性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Level-6

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值