找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 73|回复: 0
打印 上一主题 下一主题
收起左侧

关于STM32单片机PCF8563 IIC驱动 pcf8563.c pcf8563.h文件

[复制链接]
跳转到指定楼层
楼主
代码直接贴出来嗷 需要的友友直接下载就好了

pcf8563.c
  1. /**
  2.   *****************************************************************************
  3.   *                            时钟芯片PCF8563驱动
  4.   * @File    : pcf8563.c
  5.   * @By      : shun
  6.   * @Version : V1.0
  7.   * @Date    : 2018 / 12 / 13
  8.   *
  9.   *****************************************************************************
  10. **/


  11. #include "pcf8563.h"


  12. /******************************************************************************
  13.                             定义相关的变量函数
  14. ******************************************************************************/

  15. unsigned char buffer[4];   //年月日周
  16. unsigned char buffer1[4];  //时分秒

  17. /**
  18.   *****************************************************************************
  19.   * @Name   : 将BIN转换为BCD
  20.   *
  21.   * @Brief  : none
  22.   *
  23.   * @Input  : BINValue: 输入BIN
  24.   *
  25.   * @Output : none
  26.   *
  27.   * @Return : BCD格式数值
  28.   *****************************************************************************
  29. **/
  30. static unsigned char RTC_BinToBcd2(unsigned char BINValue)
  31. {
  32.         unsigned char bcdhigh = 0;
  33.         
  34.         while (BINValue >= 10)
  35.         {
  36.                 bcdhigh++;
  37.                 BINValue -= 10;
  38.         }
  39.    
  40.         return ((unsigned char)(bcdhigh << 4) | BINValue);
  41. }

  42. /**
  43.   *****************************************************************************
  44.   * @Name   : 将BCD转换为BIN
  45.   *
  46.   * @Brief  : none
  47.   *
  48.   * @Input  : BCDValue: 输入BCD
  49.   *
  50.   * @Output : none
  51.   *
  52.   * @Return : BIN格式数值
  53.   *****************************************************************************
  54. **/
  55. static unsigned char RTC_Bcd2ToBin(unsigned char BCDValue)
  56. {
  57.         unsigned char tmp = 0;
  58.         
  59.         tmp = ((unsigned char)(BCDValue & (unsigned char)0xF0) >> (unsigned char)0x04) * 10;
  60.         return (tmp + (BCDValue & (unsigned char)0x0F));
  61. }

  62. /******************************************************************************
  63.   * @Name   : PCF8563某寄存器写入一个字节数据
  64.   *
  65.   * @Brief  : none
  66.   *
  67.   * @Input  : REG_ADD:要操作寄存器地址
  68.   *           dat:    要写入的数据
  69.   *
  70.   * @Output : none
  71.   *
  72.   * @Return : none
  73. **/
  74. void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat)
  75. {
  76.         IIC_Start();                          //启动IIC
  77.         if(!(IIC_Write_Byte(PCF8563_Write)))  //发送写命令并检查应答位
  78.         {
  79.                 IIC_Write_Byte(REG_ADD);          //写入地址
  80.                 IIC_Write_Byte(dat);              //发送数据
  81.         }
  82.         IIC_Stop();                           //关闭IIC
  83. }

  84. /******************************************************************************
  85.   * @Name   : PCF8563某寄存器读取一个字节数据
  86.   *
  87.   * @Brief  : none
  88.   *
  89.   * @Input  : REG_ADD:要操作寄存器地址
  90.   *
  91.   * @Output : none
  92.   *
  93.   * @Return : 读取得到的寄存器的值
  94.   *****************************************************************************
  95. **/
  96. unsigned char PCF8563_Read_Byte(unsigned char REG_ADD)
  97. {
  98.         unsigned char ReData;                 //定义变量接收数据
  99.         
  100.         IIC_Start();                          //启动IIC
  101.         if(!(IIC_Write_Byte(PCF8563_Write)))  //发送写命令并检查应答位
  102.         {
  103.                 IIC_Write_Byte(REG_ADD);          //确定要操作的寄存器
  104.                 IIC_Start();                      //重启总线
  105.                 IIC_Write_Byte(PCF8563_Read);     //发送读取命令
  106.                 ReData = IIC_Read_Byte( );        //读取数据
  107.                 IIC_Ack(1);                       //发送非应答信号结束数据传送
  108.         }
  109.         IIC_Stop();                           //关闭IIC
  110.         return ReData;
  111. }

  112. /******************************************************************************
  113.   * @Name   : PCF8563写入多组数据
  114.   *
  115.   * @Brief  : none
  116.   *
  117.   * @Input  : REG_ADD:要操作寄存器起始地址
  118.   *           num:    写入数据数量
  119.   *           *WBuff: 写入数据缓存
  120.   *
  121.   * @Output : none
  122.   *
  123.   * @Return : none
  124.   *****************************************************************************
  125. **/
  126. void PCF8563_Write_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff)
  127. {
  128.         unsigned char i = 0;                  //定义i辅助循环发送
  129.                         
  130.         IIC_Start();                          //启动IIC
  131.         if(!(IIC_Write_Byte(PCF8563_Write)))  //发送写命令并检查应答位
  132.         {
  133.                 IIC_Write_Byte(REG_ADD);          //定位起始寄存器地址
  134.                 for(i = 0;i < num;i++)            //循环num次,达到多个数据写入
  135.                 {
  136.                         IIC_Write_Byte(*pBuff);       //写入数据
  137.                         pBuff++;                      //数据缓存地址增加
  138.                 }
  139.         }
  140.         IIC_Stop();                           //关闭IIC
  141. }

  142. /******************************************************************************
  143.   * @Name   : PCF8563读取多组数据
  144.   *
  145.   * @Brief  : none
  146.   *
  147.   * @Input  : REG_ADD:要操作寄存器起始地址
  148.   *           num:    读取数据数量
  149.   *
  150.   * @Output : *WBuff: 读取数据缓存
  151.   *
  152.   * @Return : none
  153.   *****************************************************************************
  154. **/
  155. void PCF8563_Read_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff)
  156. {
  157.         unsigned char i = 0;                  //定义变量i辅助多次读取
  158.         
  159.         IIC_Start();                          //启动IIC
  160.         if(!(IIC_Write_Byte(PCF8563_Write)))  //发送写命令并检查应答位
  161.         {
  162.                 IIC_Write_Byte(REG_ADD);          //定位起始寄存器地址
  163.                 IIC_Start();                      //重启总线
  164.                 IIC_Write_Byte(PCF8563_Read);     //发送读取命令
  165.                 for(i = 0;i < num;i++)            //循环num次完成多次读取
  166.                 {
  167.                         *pBuff = IIC_Read_Byte();     //读取数据
  168.                         if(i == (num - 1)) IIC_Ack(1);//发送非应答信号,知道完成数据量
  169.                         else IIC_Ack(0);              //发送应答信号
  170.                         pBuff++;                      //读取缓冲区地址增加
  171.                 }
  172.         }
  173.         IIC_Stop();                                  //关闭IIC
  174. }

  175. /******************************************************************************
  176.   * @Name   : PCF8563检测是否存在
  177.   *
  178.   * @Brief  : 向定时器倒计时寄存器写入一个数值再读取出来做对比,相同正确,不同则错误
  179.   *
  180.   * @Input  : none
  181.   *
  182.   * @Output : none
  183.   *
  184.   * @Return : 0: 正常
  185.   *           1: PCF8563错误或者损坏
  186.   *****************************************************************************
  187. **/
  188. unsigned char PCF8563_Check(void)
  189. {
  190.         unsigned char test_value = 0;
  191.         unsigned char Time_Count = 0;          //定时器倒计时数据缓存

  192.         if(PCF8563_Read_Byte(PCF8563_Address_Timer) & 0x80)             //如果打开了定时器,则先关闭
  193.         {
  194.                 PCF8563_Write_Byte(PCF8563_Address_Timer, PCF_Timer_Close); //先关闭定时器
  195.                 Time_Count = PCF8563_Read_Byte(PCF8563_Address_Timer_VAL);  //先保存计数值
  196.         }

  197.         PCF8563_Write_Byte(PCF8563_Address_Timer_VAL, PCF8563_Check_Data);  //写入检测值
  198.         for(test_value = 0;test_value < 50;test_value++)  {}  //延时一定时间再读取
  199.         test_value = PCF8563_Read_Byte(PCF8563_Address_Timer_VAL);  //再读取回来

  200.         if(Time_Count != 0)  //启动了定时器功能,则恢复
  201.         {
  202.                 PCF8563_Write_Byte(PCF8563_Address_Timer_VAL, Time_Count);  //恢复现场
  203.                 PCF8563_Write_Byte(PCF8563_Address_Timer, PCF_Timer_Open);  //启动定时器
  204.         }

  205.         if(test_value != PCF8563_Check_Data)  return 1;  //器件错误或者损坏
  206.         
  207.         return 0;  //正常
  208. }

  209. /**
  210.   *****************************************************************************
  211.   * @Name   : PCF8563启动
  212.   *
  213.   * @Brief  : none
  214.   *
  215.   * @Input  : none
  216.   *
  217.   * @Output : none
  218.   *
  219.   * @Return : none
  220.   *****************************************************************************
  221. **/
  222. void PCF8563_Start(void)
  223. {
  224.         unsigned char temp = 0;
  225.         
  226.         temp = PCF8563_Read_Byte(PCF8563_Address_Control_Status_1);  //读取控制/状态寄存器1
  227.         if (temp & PCF_Control_ChipStop)
  228.         {
  229.                 temp &= PCF_Control_ChipRuns;  //运行芯片
  230.         }
  231.         if ((temp & (1<<7)) == 0)  //普通模式
  232.         {
  233.                 temp &= PCF_Control_TestcClose;  //电源复位模式失效
  234.         }
  235.         PCF8563_Write_Byte(PCF8563_Address_Control_Status_1, temp);  //再写入数值
  236. }

  237. /**
  238.   *****************************************************************************
  239.   * @Name   : PCF8563停止
  240.   *
  241.   * @Brief  : 时钟频率输出CLKOUT 在 32.768kHz 时可用
  242.   *
  243.   * @Input  : none
  244.   *
  245.   * @Output : none
  246.   *
  247.   * @Return : none
  248.   *****************************************************************************
  249. **/
  250. void PCF8563_Stop(void)
  251. {
  252.         unsigned char temp = 0;
  253.         
  254.         temp = PCF8563_Read_Byte(PCF8563_Address_Control_Status_1);  //读取控制/状态寄存器1
  255.         temp |= PCF_Control_ChipStop;  //停止运行
  256.         PCF8563_Write_Byte(PCF8563_Address_Control_Status_1, temp);  //再写入数值
  257. }

  258. /**
  259.   *****************************************************************************
  260.   * @Name   : PCF8563设置运行模式
  261.   *
  262.   * @Brief  : none
  263.   *
  264.   * @Input  : Mode: 运行模式
  265.   *                 = PCF_Mode_Normal
  266.   *                 = PCF_Mode_EXT_CLK
  267.   *
  268.   * @Output : none
  269.   *
  270.   * @Return : none
  271.   *****************************************************************************
  272. **/
  273. void PCF8563_SetMode(unsigned char Mode)
  274. {
  275.         unsigned char temp = 0;
  276.         
  277.         temp = PCF8563_Read_Byte(PCF8563_Address_Control_Status_1);  //读取寄存器值
  278.         if (Mode == PCF_Mode_EXT_CLK)  //EXT_CLK测试模式
  279.         {
  280.                 temp |= PCF_Control_Status_EXT_CLKMode;
  281.         }
  282.         else if (Mode == PCF_Mode_Normal)
  283.         {
  284.                 temp &= PCF_Control_Status_NormalMode;
  285.                 temp &= ~(1<<3);  //电源复位功能失效
  286.         }
  287.         PCF8563_Write_Byte(PCF8563_Address_Control_Status_1, temp);
  288. }

  289. /**
  290.   *****************************************************************************
  291.   * @Name   : PCF8563设置电源复位功能开启与关闭
  292.   *
  293.   * @Brief  : none
  294.   *
  295.   * @Input  : NewState: 状态,PCF8563_PowerResetEnablePCF8563_PowerResetDisable
  296.   *
  297.   * @Output : none
  298.   *
  299.   * @Return : none
  300.   *****************************************************************************
  301. **/
  302. void PCF8563_SetPowerReset(unsigned char NewState)
  303. {
  304.         unsigned char TestC = 0;
  305.         
  306.         TestC = PCF8563_Read_Byte(PCF8563_Address_Control_Status_1);  //获取寄存器值
  307.         TestC &= ~(1<<3);  //清除之前设置
  308.         if (NewState == PCF8563_PowerResetEnable)  //复位功能有效
  309.         {
  310.                 TestC |= PCF8563_PowerResetEnable;
  311.         }
  312.         else if (NewState == PCF8563_PowerResetDisable)
  313.         {
  314.                 TestC &= ~PCF8563_PowerResetEnable;  //失效,普通模式是值逻辑0,即失效
  315.         }
  316.         PCF8563_Write_Byte(PCF8563_Address_Control_Status_1, TestC);  //写入数值
  317. }

  318. /**
  319.   *****************************************************************************
  320.   * @Name   : PCF8563设置输出频率
  321.   *
  322.   * @Brief  : none
  323.   *
  324.   * @Input  :*PCF_CLKOUTStruct: 频率结构指针
  325.   *
  326.   * @Output : none
  327.   *
  328.   * @Return : none
  329.   *****************************************************************************
  330. **/
  331. void PCF8563_SetCLKOUT(_PCF8563_CLKOUT_Typedef* PCF_CLKOUTStruct)
  332. {
  333.         unsigned char tmp = 0;
  334.         
  335.         tmp = PCF8563_Read_Byte(PCF8563_Address_CLKOUT);  //读取寄存器值
  336.         tmp &= 0x7c;  //清除之前设置
  337.         if (PCF_CLKOUTStruct->CLKOUT_NewState == PCF_CLKOUT_Open)
  338.         {
  339.                 tmp |= PCF_CLKOUT_Open;
  340.         }
  341.         else
  342.         {
  343.                 tmp &= PCF_CLKOUT_Close;
  344.         }
  345.         tmp |= PCF_CLKOUTStruct->CLKOUT_Frequency;
  346.         
  347.         PCF8563_Write_Byte(PCF8563_Address_CLKOUT, tmp);
  348. }

  349. /**
  350.   *****************************************************************************
  351.   * @Name   : PCF8563设置定时器
  352.   *
  353.   * @Brief  : none
  354.   *
  355.   * @Input  :*PCF_TimerStruct: 定时器结构指针
  356.   *
  357.   * @Output : none
  358.   *
  359.   * @Return : none
  360.   *****************************************************************************
  361. **/
  362. void PCF8563_SetTimer(_PCF8563_Timer_Typedef* PCF_TimerStruct)
  363. {
  364.         unsigned char Timer_Ctrl = 0;
  365.         unsigned char Timer_Value = 0;
  366.         
  367.         Timer_Ctrl = PCF8563_Read_Byte(PCF8563_Address_Timer);  //获的控制寄存器值
  368.         Timer_Value = PCF8563_Read_Byte(PCF8563_Address_Timer_VAL);  //获取倒计时数值
  369.         //
  370.         //先停止定时器
  371.         //
  372.         Timer_Ctrl &= PCF_Timer_Close;
  373.         PCF8563_Write_Byte(PCF8563_Address_Timer, Timer_Ctrl);
  374.         
  375.         Timer_Ctrl &= 0x7c;  //清除定时器之前设置
  376.         
  377.         if (PCF_TimerStruct->RTC_Timer_NewState == PCF_Timer_Open)  //开启
  378.         {
  379.                 Timer_Ctrl |= PCF_Timer_Open;
  380.                 Timer_Ctrl |= PCF_TimerStruct->RTC_Timer_Frequency;  //填上新的工作频率
  381.                 if (PCF_TimerStruct->RTC_Timer_Value)  //需要填上新的计数值
  382.                 {
  383.                         Timer_Value = PCF_TimerStruct->RTC_Timer_Value;  //填上新的计数值
  384.                 }
  385.         }
  386.         else
  387.         {
  388.                 Timer_Ctrl &= PCF_Timer_Close;
  389.         }
  390.         PCF8563_Write_Byte(PCF8563_Address_Timer_VAL, Timer_Value);  //写入倒计时数值
  391.         
  392.         if (PCF_TimerStruct->RTC_Timer_Interrupt == PCF_Time_INT_Open)  //开启了中断输出
  393.         {
  394.                 Timer_Value = PCF8563_Read_Byte(PCF8563_Address_Control_Status_2);  //获取控制/状态寄存器2数值
  395.                 Timer_Value &= PCF_Time_INT_Close;  //清除定时器中断使能
  396.                 Timer_Value &= ~(1<<2);  //清除定时器中断标志
  397.                 Timer_Value &= ~(1<<4);  //当 TF 有效时 INT 有效 (取决于 TIE 的状态)
  398.                 Timer_Value |= PCF_Time_INT_Open;  //开启定时器中断输出
  399.                 PCF8563_Write_Byte(PCF8563_Address_Control_Status_2, Timer_Value);
  400.         }
  401.         else
  402.         {
  403.                 Timer_Value = PCF8563_Read_Byte(PCF8563_Address_Control_Status_2);  //获取控制/状态寄存器2数值
  404.                 Timer_Value &= PCF_Time_INT_Close;  //清除定时器中断使能
  405.                 Timer_Value |= PCF_Time_INT_Open;  //开启定时器中断输出
  406.                 PCF8563_Write_Byte(PCF8563_Address_Control_Status_2, Timer_Value);
  407.         }
  408.         
  409.         PCF8563_Write_Byte(PCF8563_Address_Timer, Timer_Ctrl);  //设置定时器控制寄存器
  410. }

  411. /**
  412.   *****************************************************************************
  413.   * @Name   : 设置时间,主要用于后台调用,或者初始化时间用
  414.   *
  415.   * @Brief  : 秒默认就设置成0x00了,形参里面不体现,星期值范围:0 ~ 6
  416.   *
  417.   * @Input  : PCF_Format:  数据格式
  418.   *                        = PCF_Format_BIN
  419.   *                        = PCF_Format_BCD
  420.   *           PCF_Century: 世纪位设定
  421.   *                        = PCF_Century_19xx
  422.   *                        = PCF_Century_20xx
  423.   *           Year:        年
  424.   *           Month:       月
  425.   *           Date:        日
  426.   *           Week:        星期
  427.   *           Hour:        时
  428.   *           Minute:      分
  429.   *
  430.   * @Output : none
  431.   *
  432.   * @Return : none
  433.   *****************************************************************************
  434. **/
  435. void PCF8563_Set_Times(unsigned char PCF_Format,\
  436.                        unsigned char PCF_Century,\
  437.                            unsigned char Year, unsigned char Month, unsigned char Date, unsigned char Week,\
  438.                        unsigned char Hour, unsigned char Minute)
  439. {
  440.         _PCF8563_Time_Typedef Time_InitStructure;
  441.         _PCF8563_Date_Typedef Date_InitStructure;
  442.         
  443.         if (PCF_Format == PCF_Format_BIN)
  444.         {
  445.                 //
  446.                 //判断数据是否符合范围
  447.                 //
  448.                 if (Year > 99)   Year  = 0;  //恢复00年
  449.                 if (Month > 12)  Month = 1;  //恢复1月
  450.                 if (Date > 31)   Date  = 1;  //恢复1日
  451.                 if (Week > 6)    Week  = 1;  //恢复星期一
  452.                
  453.                 if (Hour > 23)    Hour   = 0;  //恢复0小时
  454.                 if (Minute > 59)  Minute = 0;  //恢复0分钟
  455.                
  456.                 //
  457.                 //转换一下
  458.                 //
  459.                 Date_InitStructure.RTC_Years    = RTC_BinToBcd2(Year);
  460.                 Date_InitStructure.RTC_Months   = RTC_BinToBcd2(Month);
  461.                 Date_InitStructure.RTC_Days     = RTC_BinToBcd2(Date);
  462.                 Date_InitStructure.RTC_WeekDays = RTC_BinToBcd2(Week);
  463.                
  464.                 Time_InitStructure.RTC_Hours    = RTC_BinToBcd2(Hour);
  465.                 Time_InitStructure.RTC_Minutes  = RTC_BinToBcd2(Minute);
  466.         }
  467.         Time_InitStructure.RTC_Seconds = 0x00;  //恢复0秒
  468.         Time_InitStructure.RTC_Seconds &= PCF_Accuracy_ClockYes;  //保证准确的时间
  469.         //
  470.         //判断世纪位
  471.         //
  472.         if (PCF_Century == PCF_Century_19xx)
  473.         {
  474.                 Date_InitStructure.RTC_Months |= PCF_Century_SetBitC;
  475.         }
  476.         else
  477.         {
  478.                 Date_InitStructure.RTC_Months &= ~PCF_Century_SetBitC;
  479.         }
  480.         //
  481.         //写入信息到寄存器
  482.         //
  483.         buffer[0] = Time_InitStructure.RTC_Seconds;
  484.         buffer[1] = Time_InitStructure.RTC_Minutes;
  485.         buffer[2] = Time_InitStructure.RTC_Hours;
  486.         PCF8563_Write_nByte(PCF8563_Address_Seconds, 3, buffer);  //写入时间信息
  487.         
  488.         buffer[0] = Date_InitStructure.RTC_Days;
  489.         buffer[1] = Date_InitStructure.RTC_WeekDays;
  490.         buffer[2] = Date_InitStructure.RTC_Months;
  491.         buffer[3] = Date_InitStructure.RTC_Years;
  492.         PCF8563_Write_nByte(PCF8563_Address_Days,    4, buffer);  //写入日期信息
  493. }

  494. /**
  495.    ============================================================================
  496.                      #### 所有寄存器全部操作功能函数 ####
  497.    ============================================================================
  498. **/

  499. /**
  500.   *****************************************************************************
  501.   * @Name   : 判断时间信息是否符合范围,超出将恢复初值
  502.   *
  503.   * @Brief  : 星期值范围:0 ~ 6
  504.   *
  505.   * @Input  : PCF_DataStruct: 寄存器结构指针
  506.   *
  507.   * @Output : none
  508.   *
  509.   * @Return : none
  510.   *****************************************************************************
  511. **/
  512. static void IS_PCF8563_Data(_PCF8563_Register_Typedef* PCF_DataStruct)
  513. {
  514.         if (PCF_DataStruct->Years > 99)           PCF_DataStruct->Years          = 0;  //恢复00年
  515.         if (PCF_DataStruct->Months_Century > 12)  PCF_DataStruct->Months_Century = 1;  //恢复1月
  516.         if (PCF_DataStruct->Days > 31)            PCF_DataStruct->Days           = 1;  //恢复1日
  517.         if (PCF_DataStruct->WeekDays > 6)         PCF_DataStruct->WeekDays       = 1;  //恢复星期一
  518.         
  519.         if (PCF_DataStruct->Hours > 23)           PCF_DataStruct->Hours          = 0;  //恢复0小时
  520.         if (PCF_DataStruct->Minutes > 59)         PCF_DataStruct->Minutes        = 0;  //恢复0分钟
  521.         if (PCF_DataStruct->Seconds > 59)         PCF_DataStruct->Seconds        = 0;  //恢复0秒
  522. }

  523. /**
  524.   *****************************************************************************
  525.   * @Name   : PCF8563写入寄存器
  526.   *
  527.   * @Brief  : 星期数值范围是: 0 ~ 6,十进制格式
  528.   *
  529.   * @Input  : PCF_Format:     数据格式
  530.   *                           = PCF_Format_BIN
  531.   *                           = PCF_Format_BCD
  532.   *           PCF_Century:    世纪位设定
  533.   *                           = PCF_Century_19xx
  534.   *                           = PCF_Century_20xx
  535.   *           PCF_DataStruct: 寄存器结构指针
  536.   *
  537.   * @Output : none
  538.   *
  539.   * @Return : none
  540.   *****************************************************************************
  541. **/
复制代码

这边有点乱码 我就直接上传文件了  有什么问题欢迎讨论

注意代码里面只有上图2个文件,请自行移植到各MCU系统中去:
c文件和h文件下载.7z (9.45 KB, 下载次数: 1)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表