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

战舰开发板V4——按键输入

战舰开发板V4——按键输入

image-20260730191128890

image-20260730195246471

#include "Key.h"
#include "Delay.h"/*** @brief  按键初始化函数* @param  无* @retval 无*/
void Key_Init(void)
{GPIO_InitTypeDef GPIO_Init_Struct;KEY0_GPIO_CLK_ENABLE();                            /* KEY0时钟使能 */KEY1_GPIO_CLK_ENABLE();                            /* KEY1时钟使能 */	KEY2_GPIO_CLK_ENABLE();                            /* KEY2时钟使能 */	WKUP_GPIO_CLK_ENABLE();                            /* WKUP时钟使能 */GPIO_Init_Struct.Pin = KEY0_GPIO_PIN;              /* KEY0引脚 */GPIO_Init_Struct.Mode = GPIO_MODE_INPUT;           /* 输入 */GPIO_Init_Struct.Pull = GPIO_PULLUP;               /* 上拉 */GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;     /* 高速 */HAL_GPIO_Init(KEY0_GPIO_PORT, &GPIO_Init_Struct);  /* KEY0引脚模式设置,上拉输入 */GPIO_Init_Struct.Pin = KEY1_GPIO_PIN;              /* KEY1引脚 */GPIO_Init_Struct.Mode = GPIO_MODE_INPUT;           /* 输入 */GPIO_Init_Struct.Pull = GPIO_PULLUP;               /* 上拉 */GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;     /* 高速 */HAL_GPIO_Init(KEY1_GPIO_PORT, &GPIO_Init_Struct);  /* KEY1引脚模式设置,上拉输入 */GPIO_Init_Struct.Pin = KEY2_GPIO_PIN;              /* KEY2引脚 */GPIO_Init_Struct.Mode = GPIO_MODE_INPUT;           /* 输入 */GPIO_Init_Struct.Pull = GPIO_PULLUP;               /* 上拉 */GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;     /* 高速 */HAL_GPIO_Init(KEY2_GPIO_PORT, &GPIO_Init_Struct);  /* KEY2引脚模式设置,上拉输入 */GPIO_Init_Struct.Pin = WKUP_GPIO_PIN;              /* WKUP引脚 */GPIO_Init_Struct.Mode = GPIO_MODE_INPUT;           /* 输入 */GPIO_Init_Struct.Pull = GPIO_PULLDOWN;             /* 下拉 */GPIO_Init_Struct.Speed = GPIO_SPEED_FREQ_HIGH;     /* 高速 */HAL_GPIO_Init(WKUP_GPIO_PORT, &GPIO_Init_Struct);  /* WKUP引脚模式设置,下拉输入 */
}/*** @brief  按键扫描函数* @note   该函数有响应优先级(同时按下多个按键):WK_UP > KEY2 > KEY1 > KEY0 !!* @param  mode:0 / 1,具体含义如下:*	 @arg  0,不支持连续按(当按键按下不放时,只有第一次调用会返回值,*         必须松开以后,再次按下才会返回其他键值)*   @arg  1,支持连续按(当按键按下不放时,每次调用该函数都会返回键值)* @retval 键值,定义如下:*         KEY0_PRES, 1, KEY0按下*         KEY1_PRES, 2, KEY1按下*         KEY2_PRES, 3, KEY2按下*         WKUP_PRES, 4, WKUP按下*/
uint8_t Key_Scan(uint8_t mode)
{static uint8_t Key_Up = 1;                                      /* 按键按松开标志 */uint8_t KeyVal = 0;if(mode)  Key_Up = 1;                                           /* 支持连按 */if(Key_Up && (KEY0 == 0 || KEY1 == 0 || KEY2 == 0 || WK_UP == 1)/* 按键松开标志为1,且有任意一个按键按下了  */{delay_ms(10);                                               /* 去抖动 */Key_Up = 0;if(KEY0 == 0)  KeyVal = KEY0_PRES;if(KEY1 == 0)  KeyVal = KEY1_PRES;	if(KEY2 == 0)  KeyVal = KEY2_PRES;if(WK_UP == 1) KeyVal = WKUP_PRES;}else if(KEY0 == 1 && KEY1 == 1 && KEY2 == 1 && WK_UP == 0)      /* 没有任何按键按下, 标记按键松开 */{Key_Up = 1;}return KeyVal;                                                  /* 返回键值 */}
#ifndef __KEY_H
#define __KEY_H#include "main.h"/* 定义 引脚 */#define KEY0_GPIO_PORT               GPIOE
#define KEY0_GPIO_PIN                GPIO_PIN_4
#define KEY0_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口时钟使能 */#define KEY1_GPIO_PORT               GPIOE
#define KEY1_GPIO_PIN                GPIO_PIN_3
#define KEY1_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口时钟使能 */#define KEY2_GPIO_PORT               GPIOE
#define KEY2_GPIO_PIN                GPIO_PIN_2
#define KEY2_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOE_CLK_ENABLE(); }while(0)   /* PE口时钟使能 */#define WKUP_GPIO_PORT               GPIOA
#define WKUP_GPIO_PIN                GPIO_PIN_0
#define WKUP_GPIO_CLK_ENABLE()       do{ __HAL_RCC_GPIOA_CLK_ENABLE(); }while(0)   /* PA口时钟使能 */#define KEY0          HAL_GPIO_ReadPin(KEY0_GPIO_PORT, KEY0_GPIO_PIN)   /* 读取KEY0引脚 */
#define KEY1          HAL_GPIO_ReadPin(KEY1_GPIO_PORT, KEY1_GPIO_PIN)   /* 读取KEY1引脚 */
#define KEY2          HAL_GPIO_ReadPin(KEY2_GPIO_PORT, KEY2_GPIO_PIN)   /* 读取KEY2引脚 */
#define WK_UP         HAL_GPIO_ReadPin(WKUP_GPIO_PORT, WKUP_GPIO_PIN)   /* 读取WKUP引脚 */#define KEY0_PRES     1          /* KEY0按下 */
#define KEY1_PRES     2          /* KEY1按下 */
#define KEY2_PRES     3          /* KEY2按下 */
#define WKUP_PRES     4          /* KEY_UP按下(即WK_UP) */void Key_Init(void);             /* 按键初始化函数 */
uint8_t Key_Scan(uint8_t mode);  /* 按键扫描函数 */#endif
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)   //无限主循环,程序主体在这里循环执行
{/* USER CODE END WHILE *//* USER CODE BEGIN 3 *///循环内部,所有业务逻辑写这里Key = Key_Scan(0);                /* 得到键值 */if(Key){switch(Key){case WKUP_PRES:           /* 控制蜂鸣器 */BEEP_TOGGLE();        /* BEEP 状态取反 */break;case KEY2_PRES:           /* 控制LED0(RED)翻转 */LED0_TOGGLE();        /* LED0 状态取反 */break;case KEY1_PRES:           /* 控制LED1(GREEN)翻转 */LED1_TOGGLE();        /* LED1 状态取反 */break;case KEY0_PRES:           /* 同时控制LED0,LED1翻转 */LED0_TOGGLE();        /* LED0 状态取反 */LED1_TOGGLE();        /* LED1 状态取反 */break;default: break;}	}	else{delay_ms(10);}
}
http://www.jsqmd.com/news/1296518/

相关文章:

  • 2026云浮活动拍摄公司排行榜TOP5 | 会议拍摄 | 活动跟拍 | 视频直播 | 照片直播 | 年会拍摄服务商评测对比 - 政企影像扫地僧
  • 大模型时代来临!小白程序员必备技能,收藏这份转型指南,高薪等你来拿!
  • 免费的AI图片生成工具推荐:2026年6款主流工具实测横评 - 企业新闻快传
  • asynq快速上手:5分钟掌握Python异步函数装饰器@asynq()
  • 2026荆门企业宣传片制作公司排行榜TOP5 | 品牌形象片 | 产品宣传片 | 招商宣传片 | TVC广告 | 企业年会片服务商评测对比 - 政企影像扫地僧
  • 2026张家界活动拍摄公司排行榜TOP5 | 会议拍摄 | 活动跟拍 | 视频直播 | 照片直播 | 年会拍摄服务商评测对比 - 政企影像扫地僧
  • 2026佛山政企宣传片制作公司排行榜TOP5 | 党建宣传片 | 政府汇报片 | 会议拍摄 | 视频直播 | 招商宣传片服务商评测对比 - 政企影像扫地僧
  • 运维转网安别丢老本事!自动化脚本,安全工程师的效率利器
  • 2026年七夕海报用什么AI工具?中文乱码、产品变形、改稿重抽,一次解决 - 企业新闻快传
  • 精准控本、清晰算利!4款中小企业成本利润管理系统实测推荐
  • 2026出国使用的身份证英文翻译件有效办理渠道测评+详细流程
  • 从0到1打造优雅时间选择器:react-timekeeper组件设计与实现原理
  • 2026年英语阅读常见误区:背了不少单词,为什么一读文章还是容易卡住?
  • 一人公司效率神话:技术工具与组织熵增解析
  • 我的视频下载神器:Video Download Helper使用体验分享
  • 炉石传说HsMod终极指南:55项功能全面解锁你的游戏体验
  • AI重构经典叙事:知识图谱与生成式AI在传统文化创新中的应用
  • 抖音直播数据抓取:零门槛解锁实时互动分析的黑科技
  • 2026年七夕海报用什么AI工具?中文乱码、产品变形、改稿重抽,一次解决 - 小随科技
  • 终极指南:5分钟掌握Scrcpy-iOS远程控制安卓手机
  • 2026菏泽政企宣传片制作公司排行榜TOP5 | 党建宣传片 | 政府汇报片 | 会议拍摄 | 视频直播 | 招商宣传片服务商评测对比 - 政企影像扫地僧
  • RuCaptcha 性能测试:526 张/秒生成速度背后的优化技巧
  • CC2022标准详解:Common Criteria 2022版本更新与过渡指南
  • TactiReader:革新PDF阅读体验的智能工具
  • 终极指南:3种简单方法快速解密RPG Maker MV加密资源文件
  • AI外文论文工具使用指南与评测 - 逢君学术-AI论文写作
  • Delegated高级用法:手动管理委托与自定义生命周期
  • Mermaid Live Editor:5分钟掌握实时图表编辑,告别Visio和Draw.io的复杂流程
  • Gitee Team:打通 DevSecOps 全链路,替代 Excel 碎片化项目管理的国产研发流水线平台
  • 完全掌握OpenArk:Windows系统安全与逆向分析终极指南