尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

战舰开发板V4——按键输入
📅 发布时间:2026/7/30 22:48:16

战舰开发板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);}
}

相关新闻

  • 2026出国使用的身份证英文翻译件有效办理渠道测评+详细流程
  • 2026佛山政企宣传片制作公司排行榜TOP5 | 党建宣传片 | 政府汇报片 | 会议拍摄 | 视频直播 | 招商宣传片服务商评测对比 - 政企影像扫地僧
  • 运维转网安别丢老本事!自动化脚本,安全工程师的效率利器

最新新闻

  • LangChain 的 Tools 是什么?手把手带你写一个
  • 2026 上海抖音代运营公司实测榜单|企业如何筛选短视频拓客服务商
  • AI配音重音标注实战指南(附ISO/ITU标准对照表+可落地标注模板)
  • 院线赛道竞争白热化,花多芙凭系统化问题肌管理方案,助力美业门店突破经营瓶颈 - 优企甄选
  • Marshal操作符详解:<|符号如何简化数据提取代码
  • AI如何提升科研论文写作效率:Paperxie实战解析

日新闻

  • 终极TeamSpeak3音乐机器人搭建指南:5分钟实现语音聊天室音频播放
  • 广州海珠区内搬家攻略,平价靠谱搬家服务商推荐,专业打包搬运省心避坑全流程指南 - 厚道搬家
  • 大语言模型入门指南:从零到精通掌握AI核心技术的5大步骤

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号