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

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别

点亮一个LED灯:是直接控制输出引脚,GPIO初始化推挽输出即可

按键控制LED:是按键输入信号从而控制输出引脚,GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入

但是控制GPIO本质还是1.RCC时钟使能  2.结构体配置GPIO寄存器  3.控制GPIO

标准库写法

led.c

1.RCC时钟使能  2.结构体配置GPIO寄存器  3.控制GPIO(我们这里封装成函数ON;OFF;swtich)

#include "stm32f10x.h"                  // Device header
#include "delay.h"
void LED_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//1.RCC时钟使能GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);			 	//2.结构体配置GPIO寄存器GPIO_SetBits (GPIOA,GPIO_Pin_1 | GPIO_Pin_2);			//3.控制GPIO值为1
}/*** @brief  LED1灯亮* @param  无* @retval 无*/
void LED1_ON(void)
{GPIO_ResetBits (GPIOA,GPIO_Pin_1);			//控制LED1亮
}/*** @brief  LED2灯亮* @param  无* @retval 无*/
void LED2_ON(void)
{GPIO_ResetBits (GPIOA,GPIO_Pin_2);			//控制LED2亮
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED1_OFF(void)
{GPIO_SetBits (GPIOA,GPIO_Pin_1);			//控制LED1灭
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED2_OFF(void)
{GPIO_SetBits (GPIOA,GPIO_Pin_2);			//控制LED2灭
}/*** @brief  LED1灯状态切换* @param  无* @retval 无*/
void LED1_switch(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1) == 1){GPIO_ResetBits (GPIOA,GPIO_Pin_1);}else{GPIO_SetBits (GPIOA,GPIO_Pin_1);}
}/*** @brief  LED2灯状态切换* @param  无* @retval 无*/
void LED2_switch(void)
{if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2) == Bit_SET){GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_RESET);}else{GPIO_WriteBit(GPIOA, GPIO_Pin_2, Bit_SET);}
}

led.h

#ifndef __LED_H
#define __LED_Hvoid LED_Init(void);
void LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_switch(void);
void LED2_switch(void);#endif

key.c

这里按键获取函数采用的是delay检测,是阻塞式的函数,这不好等学到定时器中断我们再用定时器定时检测

    if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0)
    {
        Delay_ms(20);    //按下消抖
        while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);
        Delay_ms(20);    //松开消抖
        keynum = 1;
    }

#include "stm32f10x.h"                  // Device header
#include "DELAY.h"
void KEY_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//1.RCC时钟使能GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);			 	//2.结构体配置GPIO寄存器}/*** @brief  按键获取函数* @param  无* @retval 按键值1->PB1,2->pb11*/
uint8_t KEY_Getstate(void)
{uint8_t keynum = 0;if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0){Delay_ms(20);	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0);Delay_ms(20);keynum = 1;}if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0){Delay_ms(20);	while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11) == 0);Delay_ms(20);	keynum = 2;}		return keynum;
}

key.h

#ifndef __KEY_H
#define __KEY_Hvoid KEY_Init(void);
uint8_t KEY_Getstate(void);
#endif

main()

定义一个变量把按键状态接收,通过不同按键值来控制LED状态

#include "stm32f10x.h"                  // Device header
#include "Delay.h"  
#include "LED.h"
#include "KEY.h"uint8_t keynum;
int main ()
{KEY_Init();LED_Init();while(1){keynum = KEY_Getstate();if(keynum == 1){LED1_switch();}else if(keynum == 2){LED2_switch();}}
}

标准库写完了,接下来我们写HAL库

HAL库分三步

1.建工程

2.设配置

3.写代码

HAL库写法

一. 关于建工程请参考:江科大学习笔记之——HAL库点亮一个LED灯-CSDN博客在里面有详细步骤,简单易懂

二.配置设置

这里我设置错了应该是PB11,你们自己注意一下

ctrl+s生成代码

三.写代码

为了方便我们把LED,KEY单独拿出来放在System文件夹下

在cubeIDE里面想建立自己的.C.H文件步骤如下

1.建立文件夹

2.

 鼠标右键点击文件名–Properties

3. 进入Includes 添加文件的路径

同时还要增加源文件的路径

好准备工作做完了,上面cube ide的模块化是我自己在网上找半天才找到的方法:

STM32CubemxIDE 导入自定义的.c和.h文件_stm32cubeide添加源文件-CSDN博客

本想问别人但是想想还是提高自己解决问题的能力吧,所以我就花了更多时间去自己搜索解决方法。

现在开始写代码

模块代码的逻辑都一样只是把标准库的函数我就不多赘述了,换成了HAL库的函数

led.c

这里LED灯的熄灭与点亮有,电平翻转函数HAL_GPIO_TogglePin,关于HAL库的函数可以看:

HAL库函数合集-CSDN博客


#include "gpio.h"/*** @brief  LED1灯亮* @param  无* @retval 无*/
void LED1_ON(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_RESET);//控制LED1亮
}/*** @brief  LED2灯亮* @param  无* @retval 无*/
void LED2_ON(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_RESET);	//控制LED2亮
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED1_OFF(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_1,GPIO_PIN_SET);//控制LED1灭
}/*** @brief  LED灭* @param  无* @retval 无*/
void LED2_OFF(void)
{HAL_GPIO_WritePin(GPIOA,GPIO_PIN_2,GPIO_PIN_SET);//控制LED2灭
}/*** @brief  LED1灯状态切换* @param  无* @retval 无*/
void LED1_switch(void)
{HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_1);
}/*** @brief  LED2灯状态切换* @param  无* @retval 无*/
void LED2_switch(void)
{HAL_GPIO_TogglePin(GPIOA,GPIO_PIN_2);
}

led.h

#ifndef __LED_H
#define __LED_Hvoid LED1_ON(void);
void LED2_ON(void);
void LED1_OFF(void);
void LED2_OFF(void);
void LED1_switch(void);
void LED2_switch(void);#endif

key,c


#include "gpio.h"
/*** @brief  按键获取函数* @param  无* @retval 按键值1->PB1,2->pb11*/
uint8_t KEY_Getstate(void)
{uint8_t keynum = 0;if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0){HAL_Delay(20);while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == 0);HAL_Delay(20);keynum = 1;}if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) == 0){HAL_Delay(20);while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11) == 0);HAL_Delay(20);keynum = 2;}		return keynum;
}

key.h

#ifndef __KEY_H
#define __KEY_Huint8_t KEY_Getstate(void);
#endif

main()

这里就定义了uint8_t keynum;

然后写了while,其他都是生产的代码

  while (1){keynum = KEY_Getstate();if(keynum == 1){LED1_switch();}else if(keynum == 2){LED1_OFF();}
}
/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2024 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
uint8_t keynum;
/* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();/* USER CODE BEGIN 2 *//* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){keynum = KEY_Getstate();if(keynum == 1){LED1_switch();}else if(keynum == 2){LED1_OFF();}/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Initializes the RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI_DIV2;RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses clocks*/RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state */__disable_irq();while (1){}/* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{/* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

编译烧入现象和标准库一致

相关文章:

标准库以及HAL库——按键控制LED灯代码

按键控制LED本质还是控制GPIO,和点亮一个LED灯没什么区别 点亮一个LED灯:是直接控制输出引脚,GPIO初始化推挽输出即可 按键控制LED:是按键输入信号从而控制输出引脚,GPIO初始化推挽输出一个引脚以外还得加一个GPIO上拉输入 但是…...

Echarts+vue电商平台数据可视化——webSocket改造项目

websocket的基本使用,用于测试前端能否正常获取到后台数据 后台代码编写: const path require("path"); const fileUtils require("../utils/file_utils"); const WebSocket require("ws"); // 创建WebSocket服务端的…...

Flink中并行度和slot的关系——任务和任务槽

一、任务槽(task slots) Flink的每一个TaskManager是一个JVM进程,在其上可以运行多个线程(任务task),那么每个线程可以拥有多少进程资源呢?任务槽就是这样一个概念,对taskManager上每个任务运行…...

基于西湖大学强化学习课程的笔记

放在前面 课程链接 2024年12月30日 前言:强化学习有原理部分的学习,也有与实践相关的编程部分。我认为实践部分应该是更适合我的,不过原理部分也很重要,我目前是准备先过一过原理。 应该花多少时间学习这部分呢? 但是这…...

瀚高数据库 问题: ERROR: operator does not exist: character varying = integer

错误信息: ERROR: operator does not exist: character varying integer建议:No operator matches the given name and argument types. You might need to add explicit type casts.位置:1073at 增加瀚高数据库转换函数解决该问题&#xff…...

冷链温度记录仪蓝牙应用案例

在现代冷链物流运输过程中,确保货物在运输过程中保持在适当的温度范围内是至关重要的。例如,水果、蔬菜、肉类、乳制品以及医疗用品等,这些产品对温度的敏感性要求运输过程中必须严格监控温度变化。RAMSUN介绍冷链温度记录仪蓝牙芯片应用案例…...

LeetCode - Google 校招100题 第7天 序列(数据结构贪心) (15题)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/144744418 相关文章: LeetCode 合计最常见的 112 题: 校招100题 第1天 链表(List) (19题)校招100题 第2天 树(Tree) (21…...

深入理解Redis:从理论到实践的Java之旅

Redis,这个开源的内存数据结构存储系统,自2009年诞生以来,凭借其丰富的数据结构、快速的读写性能以及高度的可扩展性,迅速成为了分布式系统和高并发应用中的明星组件。本文将带你深入理解Redis,并通过Java语言的实践示…...

LabVIEW故障诊断中的无故障数据怎么办

在使用LabVIEW进行故障诊断时,可能会面临“无故障数据”的情况。这种情况下,缺乏明确的故障参考,使得系统难以通过传统对比法进行故障识别。本文将介绍应对无故障数据的关键策略,包括数据模拟、特征提取和基于机器学习的方法&…...

基于DIODES AP43781+PI3USB31531+PI3DPX1207C的USB-C PD Video 之全功能显示器连接端口方案

随着USB-C连接器和PD功能的出现,新一代USB-C PD PC显示器可以用作个人和专业PC工作环境的电源和数据集线器。 虽然USB-C PD显示器是唯一插入墙壁插座的交流电源输入设备,但它可以作为数据UFP(上游接口)连接到连接到TCD&#xff0…...

MySQL配置my.ini文件

my.ini文件中存储了数据库的文件地址,数据库数据存储地址以及登录密码等基础信息。在遇到忘记密码或者其他基础问题时,修改my.ini文件很方便。但是部分数据库版本默认不生成my.ini文件,需要自己进行配置。 1.停止数据库服务。在搜索框中输入…...

JVM常见排查问题的命令及可视化工具

前置: RMI协议:java的一个远程调用协议,在不同的JVM之间可以进行接口的调用,但数据不安全,且仅限java; 一、常见命令及用法 1、jps:与Linux的ps命令有点类似,查看系统中在运行的J…...

【python】matplotlib(moon cake)

文章目录 1、Style12、Style23、Style34、Style45、Style56、Style67、Style78、参考的库函数matplotlib.patches.Arcmatplotlib.patches.Wedge 9、参考 1、Style1 """ author: tyran """from numpy import sin, cos, pi import matplotlib.pyp…...

Pytorch使用手册-空间变换网络指南(专题十五)

在本教程中,您将学习如何使用一种称为空间变换网络(Spatial Transformer Networks, STN)的视觉注意力机制来增强您的网络。您可以在DeepMind的论文中了解更多关于空间变换网络的内容。 空间变换网络是可微分注意力的一种推广,可以应用于任何空间变换。空间变换网络(简称S…...

Vue 中el-table-column 进行循环,页面没渲染成功

文章目录 前言效果图代码示例可能出现的问题及原因**解决思路** 前言 实现效果:el-table-column 进行循环,使之代码简化 遇到的问题: data进行默认赋值,操作列的删除都可以出来,其他表格里面的数据没出来 效果图 示例…...

基于单片机的温湿度采集系统(论文+源码)

2.1系统的功能 本系统的研制主要包括以下几项功能: (1)温度检测功能:对所处环境的温度进行检测; (2)湿度检测功能:对所处环境的湿度进行检测; (3)加热和制冷功能:可以完成加热和制冷功能。 (4)加湿和除…...

使用envoyfilter添加请求头

该envoyfilter实现了这样一个功能,如果请求头中含有Sw8,则添加请求头HasSw8: true。 1. 内嵌lua脚本 apiVersion: networking.istio.io/v1alpha3 kind: EnvoyFilter metadata:name: add-header-filternamespace: demo-bookinfo # 可根据实际情况调整命…...

kafka开机自启失败问题处理

前言:在当今大数据处理领域,Kafka 作为一款高性能、分布式的消息队列系统,发挥着举足轻重的作用。无论是海量数据的实时传输,还是复杂系统间的解耦通信,Kafka 都能轻松应对。然而,在实际部署和运维 Kafka 的…...

优化站群SEO:使用苹果CMS泛目录插件实现泛目录页面刷新不变

优化站群SEO:使用苹果CMS泛目录插件实现泛目录页面刷新不变 在当今数字营销环境中,搜索引擎优化(SEO)是提升网站流量和可见性的关键策略。苹果CMS作为一款灵活的内容管理系统,提供了丰富的插件功能,尤其是…...

git clone 和 conda 换源

文章目录 git clone 通过 sshconda 创建虚拟环境通过 env.yml 文件conda 换源 git clone 通过 ssh git clone ssh://用户名IP地址:/仓库名字.gitconda 创建虚拟环境通过 env.yml 文件 conda env create -f environment.ymlconda 换源 Step 1 生成 .bashrc 文件在家目录下。…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...