RP2040 C SDK RTC功能使用

news2024/12/23 11:36:26

RP2040 C SDK RTC功能使用


  • 📍《RP2040 C SDK串口功能使用》
  • 🥕RP2040 RTC API官方文档说明:https://www.raspberrypi.com/documentation/pico-sdk/hardware.html#group_hardware_rtc
  • 🥕官方例程参考:https://github.com/raspberrypi/pico-examples

📑RTC 相关API接口函数介绍

  • 🌿void rtc_init (void):初始化rtc。
  • 🌿bool rtc_set_datetime (const datetime_t *t):设置rtc
  • 形参1:
datetime_t t = {
    .year = 2024,
    .month = 9,//注意这里不能写09,编译会报错,可以用16进制:0x09
    .day = 04,
    .dotw = 3, // 0 is Sunday, so 5 is Friday
    .hour = 23,
    .min = 30,
    .sec = 00};
  • 🌿bool rtc_get_datetime (datetime_t *t):获取时间。
  • 形参1:参考上面的。
  • 🌿bool rtc_running (void):查询rtc运行状态。
  • 🌿void rtc_set_alarm (const datetime_t *t, rtc_callback_t user_callback):设置报警中断
  • 形参1:时间句柄。
  • 形参2:回调函数。
  • 🌿void rtc_enable_alarm (void):使能rtc报警。
  • 🌿void rtc_disable_alarm (void):失能rtc报警
✨使用rtc功能外设,需要在CMakeLists.txt文件中,添加hardware_rtc配置
# Add the standard library to the build
target_link_libraries(RP2040_RTC
        pico_stdlib
        hardware_rtc)

📙例程

  • 📘hello_rtc官方给出的使用例程:
/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include <stdio.h>
#include "hardware/rtc.h"
#include "pico/stdlib.h"
#include "pico/util/datetime.h"

/// \tag::hello_rtc_main[]
int main() {
    stdio_init_all();
    printf("Hello RTC!\n");

    char datetime_buf[256];
    char *datetime_str = &datetime_buf[0];

    // Start on Friday 5th of June 2020 15:45:00
    datetime_t t = {
            .year  = 2020,
            .month = 06,
            .day   = 05,
            .dotw  = 5, // 0 is Sunday, so 5 is Friday
            .hour  = 15,
            .min   = 45,
            .sec   = 00
    };

    // Start the RTC
    rtc_init();
    rtc_set_datetime(&t);

    // clk_sys is >2000x faster than clk_rtc, so datetime is not updated immediately when rtc_get_datetime() is called.
    // tbe delay is up to 3 RTC clock cycles (which is 64us with the default clock settings)
    sleep_us(64);

    // Print the time
    while (true) {
        rtc_get_datetime(&t);
        datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
        printf("\r%s      ", datetime_str);
        sleep_ms(100);
    }
}
  • 📗RTC报警中断使用例程:

每分钟的固定秒数,产生一次报警中断,一次配置重复触发。


/*
  CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program debugprobe.elf verify reset exit"

 jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_RTC.elf verify reset exit"
 */
#include <stdio.h>
#include "pico/stdlib.h"
// #include "hardware/uart.h"
#include "hardware/gpio.h"
#include "hardware/divider.h"
#include "hardware/clocks.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"

// GPIO defines
// Example uses GPIO 2
#define GPIO 25

#define BUILTIN_LED PICO_DEFAULT_LED_PIN

#define ALARM_AT_SECONDS 5
#define ALARM_REPEAT_FOREVER true

volatile bool alarmTriggered = false;
bool setAlarmDone = false;
datetime_t t = {
    .year = 2024,
    .month = 9,
    .day = 04,
    .dotw = 3, // 0 is Sunday, so 5 is Friday
    .hour = 23,
    .min = 30,
    .sec = 00};

datetime_t alarmT;

static volatile bool fired = false;

//

// This is ISR. Be careful. No Serial.print here.
void rtcCallback(void)
{
  alarmTriggered = true;
}

void set_RTC_Alarm(datetime_t *alarmTime)
{
  rtc_set_alarm(alarmTime, rtcCallback);
}

void setAlarmOnce(uint8_t alarmSeconds)
{
  rtc_get_datetime(&alarmT);

  if (alarmSeconds > alarmT.sec)
    alarmT.sec = alarmSeconds;
  else
  {
    // Alarm in next minute
    alarmT.sec = alarmSeconds;
    alarmT.min += 1;
  }

  set_RTC_Alarm(&alarmT);

  printf("Set One-time Alarm @ alarmSeconds = %d\n", alarmSeconds);
}

void setAlarmRepeat(uint8_t alarmSeconds)
{

  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;
  set_RTC_Alarm(&alarmT);
 // irq_set_enabled(RTC_IRQ, true);
   printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);
}

void setAlarm()
{
#if ALARM_REPEAT_FOREVER
  setAlarmRepeat(ALARM_AT_SECONDS);
#else
  setAlarmOnce(ALARM_AT_SECONDS);
#endif

  setAlarmDone = true;
}
static void alarm_callback(void)
{
  alarmTriggered = true;
  // datetime_t t = {0};
  rtc_get_datetime(&t);
  char datetime_buf[256];
  char *datetime_str = &datetime_buf[0];
  datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
  printf("Alarm Fired At %s\n", datetime_str);
  stdio_flush();
  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;


}
int main()
{
  char datetime_buf[256];
  char *datetime_str = &datetime_buf[0];
  stdio_init_all();
  set_sys_clock_khz(133000, true); // 324us
  uint f_clk_rtc = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_RTC);
  uint f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS);
  printf("clk_rtc  = %dkHz\n", f_clk_rtc);
  printf("clk_sys  = %dkHz\n", f_clk_sys);
  // Set up our UART
  //  uart_init(UART_ID, BAUD_RATE);
  // Set the TX and RX pins by using the function select on the GPIO
  // Set datasheet for more information on function select
  //  gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
  //  gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
  printf("Hello RTC!\n");

  // Start the RTC
  rtc_init();
  rtc_set_datetime(&t);
  bool rtc_status = rtc_running(); //
  printf("RTC is running = %d\n", rtc_status);

  // rtc_set_alarm (&alarm, &alarm_callback); // Set an alarm for 5 second from now
  // irq_set_enabled(RTC_IRQ, true);
  // irq_set_priority (RTC_IRQ, 1); //设置中断优先级
  sleep_us(64);

  // GPIO initialisation.
  // We will make this GPIO an input, and pull it up by default
  gpio_init(BUILTIN_LED);
  gpio_set_dir(BUILTIN_LED, 1);
  gpio_pull_up(BUILTIN_LED);
  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
     // if (!setAlarmDone)
    // {
    //   setAlarm();
    //   printf("Set Repeatitive Alarm @ alarmSeconds = %d\n",alarmT.sec );

    // }
  alarmT.sec = 6;//每1分钟的第6秒报警一次,相对于1分报警一次。
set_RTC_Alarm(&alarmT);
  while (true)
  {
    rtc_get_datetime(&t);
    datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
    printf("\r%s \n", datetime_str);
    stdio_flush();
    sleep_ms(1000);
    gpio_xor_mask(1ul << BUILTIN_LED); // Toggle the LED
    if (alarmTriggered)
    {
      alarmTriggered = false;
      printf("clk_sys = %dkHz,clk_rtc = %dkHz,rtc_status:%d\n", f_clk_sys, rtc_running());//57/30
     printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);
    }
  }

  return 0;
}

  • 📗RTC报警中断间隔秒数重复例程:

运行到固定的秒数,产生一次报警中断,如下重复固定秒数,还需要在报警中断后,再次配置一次,下一个间隔时间触发一次。中断后如果不进行配置,则变成每分钟固定秒数触发。


/*
  CMSIS-DAP烧录命令:openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -c  "adapter speed 5000"-c "program debugprobe.elf verify reset exit"

 jlink命令: openocd -f interface/jlink.cfg -f target/rp2040.cfg  -c  "adapter speed 2000" -c  "program RP2040_RTC.elf verify reset exit"
 */
#include <stdio.h>
#include "pico/stdlib.h"
// #include "hardware/uart.h"
#include "hardware/gpio.h"
#include "hardware/divider.h"
#include "hardware/clocks.h"
#include "hardware/rtc.h"
#include "pico/util/datetime.h"

// GPIO defines
// Example uses GPIO 2
#define GPIO 25

#define BUILTIN_LED PICO_DEFAULT_LED_PIN

#define ALARM_AT_SECONDS 5
#define ALARM_REPEAT_FOREVER true

volatile bool alarmTriggered = false;
bool setAlarmDone = false;
datetime_t t = {
    .year = 2024,
    .month = 9,
    .day = 04,
    .dotw = 3, // 0 is Sunday, so 5 is Friday
    .hour = 23,
    .min = 30,
    .sec = 00};

datetime_t alarmT;

static volatile bool fired = false;

//

// This is ISR. Be careful. No Serial.print here.
void rtcCallback(void)
{
  alarmTriggered = true;
}

void set_RTC_Alarm(datetime_t *alarmTime)
{
  rtc_set_alarm(alarmTime, rtcCallback);
}

void setAlarmOnce(uint8_t alarmSeconds)
{
  rtc_get_datetime(&alarmT);

  if (alarmSeconds > alarmT.sec)
    alarmT.sec = alarmSeconds;
  else
  {
    // Alarm in next minute
    alarmT.sec = alarmSeconds;
    alarmT.min += 1;
  }

  set_RTC_Alarm(&alarmT);

  printf("Set One-time Alarm @ alarmSeconds = %d\n", alarmSeconds);
}

void setAlarmRepeat(uint8_t alarmSeconds)
{

  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;
  set_RTC_Alarm(&alarmT);
 // irq_set_enabled(RTC_IRQ, true);
   printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);
}

void setAlarm()
{
#if ALARM_REPEAT_FOREVER
  setAlarmRepeat(ALARM_AT_SECONDS);
#else
  setAlarmOnce(ALARM_AT_SECONDS);
#endif

  setAlarmDone = true;
}
static void alarm_callback(void)
{
  alarmTriggered = true;
  // datetime_t t = {0};
  rtc_get_datetime(&t);
  char datetime_buf[256];
  char *datetime_str = &datetime_buf[0];
  datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
  printf("Alarm Fired At %s\n", datetime_str);
  stdio_flush();
  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;


}
int main()
{
  char datetime_buf[256];
  char *datetime_str = &datetime_buf[0];
  stdio_init_all();
  set_sys_clock_khz(133000, true); // 324us
  uint f_clk_rtc = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_RTC);
  uint f_clk_sys = frequency_count_khz(CLOCKS_FC0_SRC_VALUE_CLK_SYS);
  printf("clk_rtc  = %dkHz\n", f_clk_rtc);
  printf("clk_sys  = %dkHz\n", f_clk_sys);
  // Set up our UART
  //  uart_init(UART_ID, BAUD_RATE);
  // Set the TX and RX pins by using the function select on the GPIO
  // Set datasheet for more information on function select
  //  gpio_set_function(UART_TX_PIN, GPIO_FUNC_UART);
  //  gpio_set_function(UART_RX_PIN, GPIO_FUNC_UART);
  printf("Hello RTC!\n");

  // char datetime_buf[256];
  // char *datetime_str = &datetime_buf[0];

  // Start on Friday 5th of June 2020 15:45:00

  // Start the RTC
  rtc_init();
  rtc_set_datetime(&t);
  bool rtc_status = rtc_running(); //
  printf("RTC is running = %d\n", rtc_status);

  // rtc_set_alarm (&alarm, &alarm_callback); // Set an alarm for 5 second from now
  // irq_set_enabled(RTC_IRQ, true);
  // irq_set_priority (RTC_IRQ, 1); //设置中断优先级
  //  clk_sys is >2000x faster than clk_rtc, so datetime is not updated immediately when rtc_get_datetime() is called.
  //  tbe delay is up to 3 RTC clock cycles (which is 64us with the default clock settings)
  sleep_us(64);

  // GPIO initialisation.
  // We will make this GPIO an input, and pull it up by default
  gpio_init(BUILTIN_LED);
  gpio_set_dir(BUILTIN_LED, 1);
  gpio_pull_up(BUILTIN_LED);
  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;//每间隔5秒钟报警一次
  //alarmT.sec = 6;//每1分钟第6秒报警一次
set_RTC_Alarm(&alarmT);
//setAlarm();
  //rtc_set_alarm(&alarmT, &alarm_callback);
  while (true)
  {
    rtc_get_datetime(&t);
    datetime_to_str(datetime_str, sizeof(datetime_buf), &t);
    printf("\r%s \n", datetime_str);
    stdio_flush();
    sleep_ms(1000);
    gpio_xor_mask(1ul << BUILTIN_LED); // Toggle the LED

    // if (!setAlarmDone)
    // {
    //   setAlarm();
    //   printf("Set Repeatitive Alarm @ alarmSeconds = %d\n",alarmT.sec );

    // }

    if (alarmTriggered)
    {
      alarmTriggered = false;
      printf("clk_sys = %dkHz,clk_rtc = %dkHz,rtc_status:%d\n", f_clk_sys, rtc_running());
      // rtc_set_alarm(&alarmT, &alarm_callback);
      setAlarm();//配置下一次报警时间
    // printf("Set Repeatitive Alarm @ alarmSeconds = %d\n", alarmT.sec);
    }
  }

  return 0;
}

在这里插入图片描述

🔰两者代码配置区别:
  • 🌿每分钟重复触发:
rtc_get_datetime(&alarmT);
  
  alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec =  alarmSeconds;
  set_RTC_Alarm(&alarmT);
  • 🌿间隔秒数重复触发:
 alarmT.min = alarmT.hour = alarmT.day = alarmT.dotw = alarmT.month = alarmT.year = -1;
  alarmT.sec = (t.sec + ALARM_AT_SECONDS)%60;//每间隔5秒钟报警一次

  set_RTC_Alarm(&alarmT);
  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2108826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

su root 提示 Permission denied

今天在某机器上新建了一个test账号&#xff0c;然后使用su root时&#xff0c;居然提示我没有权限&#xff0c;具体如下所示&#xff1a; [testlocalhost ~]$ su root Password: su: Permission denied [testlocalhost ~]$我确定密码是对的&#xff0c;试了好几次&#xff0c;…

彻底解决 node/npm, Electron下载失败相关问题, 从底层源码详解node electron 加速配置

最近玩了一下electron项目, 总是会遇到electron的下载失败问题, 于是看了一下node源码, 做一个记录. node/npm 加速配置 这个配置通过设置node配置里面的registry 这个配置项来完成加速. 配置方法 npm config set registry https://registry.npmmirror.com上面的命令就是将当…

day42-测试平台搭建之前端vue学习-基础1

一、Vue是什么 1.1.一套用于构建用户界面的渐进式JavaScript框架 1.2.渐进式 Vue可以自底向上逐层的应用 1).简单应用&#xff1a;只需一个轻量小巧的核心库 2).复杂应用&#xff1a;可以引ll入各式各样的Vue插件 二、Vue特点 2.1.采用组件化模式&#xff0c;提高代码复用率、…

翻译论文的关键部分 | Parallel Tiled QR Factorization for Multicore Architectures

SSRFB DTSQT2 DLARFB DGEQT2 1, 对角子矩阵分解 DGEQT2 这个例程被开发出来&#xff0c;用于针对对角Tile子矩阵&#xff1a; &#xff0c;执行不分块的QR分解。 这个运算产生&#xff1a; 一个上三角矩阵 一个酉下三角矩阵&#xff0c;这个矩阵包含 b 个 Householder 反光面…

跨平台打印模板转化pdf源码--SAAS本地化及未来之窗行业应用跨平台架构

一、跨平台打印转pdf渲染 pdf渲染模式可以支持国产化系统&#xff0c;和手机系统&#xff0c;安卓&#xff0c;苹果系统&#xff0c;qq浏览器&#xff0c;火狐&#xff0c;谷歌刘安祺 二、代码 /* ///cyberwin_offline_database_printtemp.js未来之窗打印模板解析技术 2024-…

maven的作用

一.什么是maven&#xff1f; maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 关于Apache软件基金会,是目前世界最大的最受欢迎。 二.Maven的作用&#xff1f; 1.依赖管理 方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题。 配置文件(pom.x…

Android UID 和 userID 以及 appID

我们知道Android 操作系统是基于Linux内核的&#xff0c;所以Android 的UID 是基于 Linux UID的。 Linux UID Linux 本身就是一个多用户操作系统&#xff0c;每一个用户都会有一个UID&#xff0c;不同UID 之间的资源访问是受限的。 其中&#xff0c;Linux的DAC权限模型&#…

mysql笔记2(安装配置与连接)

文章目录 1. 社区版两种安装包2. mysql是一个典型的C/S架构的软件3. 编写mysql代码的三个位置① cmd② mysql软件客户端③ 第三方软件Hyper 4. 常见的关系型数据库① myql② sql server③ oracle 5. 连接mysql① 为什么要连&#xff1f;② cmd里怎么连&#xff1f; 6. 清屏与退…

直线上最多的点数

优质博文&#xff1a;IT-BLOG-CN 题目 给你一个数组points&#xff0c;其中points[i] [xi, yi]表示X-Y平面上的一个点。求最多有多少个点在同一条直线上。 示例 1&#xff1a; 输入&#xff1a;points [[1,1],[2,2],[3,3]] 输出&#xff1a;3 示例 2&#xff1a; 输入&am…

中间件解析漏洞(附环境搭建教程)

⼀&#xff1a;IIS解析漏洞 环境资源&#xff1a; https://download.csdn.net/download/Nai_zui_jiang/89717504 环境安装 windows2003iis6 1.创建新的虚拟机 2.在下⼀步中选择我们的iso⽂件镜像 vm已主动识别到windows2003 3.产品密钥⽹上搜⼀个 密码自己设置一个简单的&…

Depop被封如何恢复?如何申诉?可以解封吗?

Depop 是一个受欢迎的在线市场&#xff0c;帮助用户在全球范围内买卖服装、时尚物品和其他配饰。然而&#xff0c;与其他在线平台一样&#xff0c;Depop 有每个用户必须遵守的准则和规则&#xff0c;以确保市场安全公平。其中一条规则是&#xff0c;您不得拥有多个帐户&#xf…

Docker核心原理解读:深度剖析Docker Daemon,掌控容器背后的引擎

容器技术已经成为现代应用程序开发和部署中的核心工具&#xff0c;而在Docker生态系统中&#xff0c;Docker Daemon 扮演着至关重要的角色。它不仅是Docker架构的核心&#xff0c;还负责容器的管理、镜像的操作、资源的分配等复杂任务。本文将深入解读Docker Daemon的工作原理&…

【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码

【2024高教社杯全国大学生数学建模竞赛】ABCDEF题 问题分析、模型建立、参考文献及实现代码 1 比赛时间 北京时间&#xff1a;2024年9月5日 18:00-2024年9月8日20:00 2 思路内容 2.1 往届比赛资料 【2022高教社杯数学建模】C题&#xff1a;古代玻璃制品的成分分析与鉴别方案…

导入word模板的数据到DB,偏自学,可自改套用

GetMapping("/importTestPeople")public void importTestPeople(RequestParam("file") MultipartFile multipartFile) throws IOException {InputStream inputStream null;File file null;try {// 创建临时文件file File.createTempFile("temp&quo…

【2024数模国赛赛题思路公开】国赛C题第二套思路丨附可运行代码丨无偿自提

2024年国赛C题第二套解题思路 第一问&#xff1a;2024~2030年农作物的最优种植方案 【问题分析】 题目要求为某乡村在2024~2030年制定农作物的最优种植方案&#xff0c;目的是最大化收益&#xff0c;并需考虑两种销售情况&#xff1a; 1. 超过预期销售量的部分滞销&#xff0…

首席数据官职位设置流程解析

首席数据官专业能力验证&#xff08;CDO Professional Competency Certification&#xff09;旨在评估并验证那些精通国内外数据安全合规政策、擅长构建数据安全体系以及熟练掌握数据安全管理流程与技术防护手段的专业人士的能力。 为加强数据安全领域的人才队伍建设&#xff…

【网络安全】服务基础第一阶段——第七节:Windows系统管理基础---- Web与FTP服务器

将某台计算机中的⽂件通过⽹络传送到可能相距很远的另⼀台计算机中&#xff0c;是⼀项基本的⽹络应⽤&#xff0c;即⽂件传送。 ⽂件传送协议FTP &#xff08;File Transfer Protocol&#xff09;是因特⽹上使⽤得最⼴泛的⽂件传送协议。 涉及到文件的上传和下载&#xff0c;很…

2024 RustChinaConf 赞助商介绍

2024 RustChinaConf 得到了行业各界的广泛支持&#xff0c;在此向以下赞助商表示感谢&#xff01; 非凸科技 非凸科技是一家全栈使用Rust的金融科技公司&#xff0c;致力于为券商、私募、公募等金融机构及个人投资者提供一站式数智交易领域服务解决方案。作为本次大会的钻石赞助…

常见概念 -- 色度色散与偏振模色散

色度色散(CD) 由于光纤中不同波长对应不同的传输速度&#xff0c;不同波长到达相同距离的光纤的时间不同&#xff0c;从而导致光脉冲展宽。 偏振模色散(PMD) 由于光纤的随机性双折射&#xff0c;不同相位状态的光传播速度不同&#xff0c;使光脉冲展宽。 色散对系统的影响 C…

【办公效率】Axure会议室预订小程序原型图,含PRD需求文档和竞品分析

作品说明 作品页数&#xff1a;共50页 兼容版本&#xff1a;Axure RP 8/9/10 应用领域&#xff1a;中小型企业的会议室在线预订 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为会议室预订小程序原型图&#xff0c;定位于拥有中大型…