這是一個(gè)DSP28335驅(qū)動(dòng)Lcd12864顯示Ds18b20采集到的溫度,并通過(guò)Sci方式傳輸至PC,使用Matlab制作上位機(jī)軟件進(jìn)行數(shù)據(jù)保存與顯示的文章。
首先主要是為了彌補(bǔ) CCS無(wú)法實(shí)時(shí)捕捉數(shù)據(jù)至上位機(jī)的缺陷(可能CCS有,但是我卻沒(méi)找到,如果有讀者知道具體答案,請(qǐng)留言告訴我。)。當(dāng)然串口傳輸來(lái)的數(shù)據(jù)也有不足的地方,就是這些數(shù)據(jù)只能讓我們感性的觀看,如果想做數(shù)據(jù)分析,如FFT等,可能數(shù)據(jù)的采樣精度就不夠了。所以這也是一個(gè)不足的地方,希望日后能有解決的辦法。下面開(kāi)始正文部分吧!
廢話不多說(shuō),先來(lái)張效果圖:
圖1是DSP_demo板加Lcd12864的顯示。顯示的比較粗糙,026.56就是26.56℃,一些細(xì)節(jié)沒(méi)有做好,主要是功能的實(shí)現(xiàn)。
圖2是使用Matlab2017b的AppDesigner制作的串口通信上位機(jī)軟件,具體功能有:發(fā)送(TX)、接收(RX)、實(shí)時(shí)繪圖、數(shù)據(jù)實(shí)時(shí)保存等。其中COM口和波特率需要設(shè)置,其他的如:數(shù)據(jù)位、校驗(yàn)位、停止位等等,已經(jīng)在代碼中默認(rèn)設(shè)置了,因?yàn)橹皇沁@個(gè)小設(shè)計(jì)的定制版本,也沒(méi)有高興將所有功能都全部放置在界面上。
圖像中,出現(xiàn)了34℃,那是我用手拿住了 Ds18b20。目前是6月底,江蘇黃梅天,今天室溫就是27℃左右。
圖3是采集到的數(shù)據(jù)。只是展示了部分,剛開(kāi)機(jī)的時(shí)候是沒(méi)有打開(kāi)文本存儲(chǔ)按鈕的,因此第一個(gè)數(shù)據(jù)與圖2中接收數(shù)據(jù)框中前幾個(gè)數(shù)據(jù)不是對(duì)應(yīng)的。
效果展示完了,那么接下來(lái)就是代碼部分:
- /*
- * 功能:1.DS18B20進(jìn)行溫度采集,并使用12864進(jìn)行顯示
- * 2.將采集到的溫度 通過(guò)SCIA傳輸,因?yàn)镾CIB的9口被12864占用,所以不能用SCIB
- * 3.SCIA使用CpuTimer0中斷,1s傳輸一次溫度數(shù)據(jù)給PC,未使用FIFO中斷
- * 波特率:9600 8位數(shù)據(jù)位,1位停止位,無(wú)校驗(yàn)位
- */
-
- #include "DSP2833x_Project.h"
- #include "math.h"
-
- #include "lcd12864.h"
- #include "ds18b20_para.h"
-
- #define uchar unsigned char
-
- void init_port(void);
- uchar Init_DS18B20();
- uchar ReadOneChar(void);
- void WriteOneChar(uchar dat);
- float ReadTemperature();
- void lcd_init(void);
- void lcd_write_cmd(uchar cmd);
- void lcd_write_dat(uchar dat);
- void LCD12864SetAddress_f( uchar x, uchar y ); //地址轉(zhuǎn)換
- void show(uchar x, uchar y, uchar * data);
-
- void scia_init(void);
- void GPIO_init();
- interrupt void Timer0_ISR(void);
-
- uchar table[7];
-
- int main(void)
- {
-
- float tt;
- int tt1;
-
- InitSysCtrl();
-
- init_port(); //ds18b20 & 12864 端口初始化
-
- DINT;
- InitPieCtrl(); //初始化中斷控制
- IER = 0x0000;
- IFR = 0x0000;
- InitPieVectTable();//初始化中斷矢量表
-
- GPIO_init(); //配置端口為SCI
-
- EALLOW; // This is needed to write to EALLOW protected registers
- PieVectTable.TINT0 = &Timer0_ISR;//將定時(shí)器0中斷服務(wù)函數(shù)入口放入中斷向量表
- EDIS; // This is needed to disable write to EALLOW protected registers
-
- InitCpuTimers();
- ConfigCpuTimer(&CpuTimer0, 150, 1000000); //定時(shí)器0定時(shí)時(shí)間為 1s
-
- scia_init(); //SCIA端口初始化
-
- lcd_init();
-
- PieCtrlRegs.PIECTRL.bit.ENPIE = 1; // Enable the PIE block
- PieCtrlRegs.PIEIER1.bit.INTx7=1; // PIE Group 1, INT7
- IER = 0x001;
- EINT;
-
-
- CpuTimer0Regs.TCR.bit.TSS = 0; // 啟動(dòng)定時(shí)器0
-
- while (1)
- {
- tt=ReadTemperature();
- tt1=tt*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
-
- table[0]=tt1/10000+0x30; //百位
- table[1]=tt1%10000/1000+0x30;//十位
- table[2]=tt1%1000/100+0x30;//個(gè)位
- table[3]='.';
- table[4]=tt1%100/10+0x30;//十分位;
- table[5]=tt1%10+0x30;//百分位;
- table[6]='\0'; //用來(lái)中止一組顯示數(shù)據(jù)
- show(0,0,table);
- }
-
- }
-
- //----------------------
- //--- 12864 及 DS18B20 的初始化
- //----------------------
- void init_port(void)
- {
- EALLOW;
- GpioCtrlRegs.GPBPUD.bit.GPIO40 = 0; // 使能GPIO10 引腳內(nèi)部上拉
-
- GpioCtrlRegs.GPBMUX1.bit.GPIO40 =0; // 配置GPIO10為通用I/O口
-
- GpioCtrlRegs.GPBQSEL1.bit.GPIO40 = 0; // GPIO40與系統(tǒng)時(shí)鐘SYSCLKOUT 同步
-
- //lcd12864 use
- GpioCtrlRegs.GPAPUD.bit.GPIO0 = 0; // 使能GPIO0 引腳內(nèi)部上拉
-
- GpioCtrlRegs.GPAPUD.bit.GPIO1 = 1; // 禁止GPIO1 引腳內(nèi)部上拉
- GpioCtrlRegs.GPAQSEL1.all = 0x0000; // GPIO0-GPIO15與系統(tǒng)時(shí)鐘SYSCLKOUT 同步
-
- GpioCtrlRegs.GPADIR.all = 0x003FF;// 配置GPIO0-GPIO9為輸出引腳
-
- //輸出數(shù)據(jù)LCD_RW和LCD_EN清零
- GpioDataRegs.GPADAT.bit.GPIO0 = 1;
- GpioDataRegs.GPADAT.bit.GPIO1 = 0;
- EDIS;
- }
-
- //----------------------
- //---SCI的初始化
- //----------------------
- void GPIO_init()
- {
- EALLOW;
- GpioCtrlRegs.GPBPUD.bit.GPIO35 = 0; // Enable pull-up for GPIO35 (SCITXDA)
- GpioCtrlRegs.GPBMUX1.bit.GPIO35 = 1; // GPIO35 for SCITXDA operation
-
- GpioCtrlRegs.GPBPUD.bit.GPIO36 = 0; // Enable pull-up for GPIO36 (SCIRXDA)
- GpioCtrlRegs.GPBQSEL1.bit.GPIO36 = 3; // Asynch input GPIO36 (SCIRXDA)
- GpioCtrlRegs.GPBMUX1.bit.GPIO36 = 1; // GPIO36 for SCIRXDA operation
-
- EDIS;
- }
-
-
-
- void scia_init(void)
- {
- SciaRegs.SCICCR.all =0x0007; // 1 stop bit,
- // No parity,8 char bits,
- // async mode, idle-line protocol
- SciaRegs.SCICTL1.all =0x0003; // enable TX, RX, internal SCICLK,
- // Disable RX ERR, SLEEP, TXWAKE
-
- SciaRegs.SCIHBAUD =0x0001;
- SciaRegs.SCILBAUD =0x00E7; //構(gòu)成 0x01e7=487 波特率計(jì)算為 37.5M/[(487+1)*8]=9605 近似等于9600
-
- SciaRegs.SCICTL1.bit.SWRESET=1;//Relinquish SCI from Reset
-
- }
-
- interrupt void Timer0_ISR(void)
- {
- int i=0;
-
- while(table[i] != '\0') //不斷發(fā)送,直到1組溫度數(shù)據(jù)發(fā)送完畢
- {
- SciaRegs.SCITXBUF=table[i]; //發(fā)送數(shù)據(jù)
- DELAY_US(1000); //若不加,會(huì)出現(xiàn)數(shù)據(jù)丟失
- i++;
- }
-
- SciaRegs.SCITXBUF='\n'; //每接收一組數(shù)據(jù)后,換行
-
- PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;//PIE組1應(yīng)答
- }
復(fù)制代碼
以上是DSP上的代碼。接下來(lái)是上位機(jī)代碼,供大家學(xué)習(xí)。這其中的一部分代碼,我也是從網(wǎng)上尋找來(lái)的,因此在此要感謝那位哥們開(kāi)放的串口軟件。Appdesigner比較新,界面也不錯(cuò),如果大家喜歡,可以自己做出修改,但是我希望大家在我這個(gè)版本基礎(chǔ)上修改后,能在留言處開(kāi)源自己的內(nèi)容,讓大家一起進(jìn)步。首先將app的鏈接給出:
鏈接:https://pan.baidu.com/s/1NEqKQJX87mv86V9ENZ2kkA
提取碼:x3y0 或 https://download.csdn.net/download/wx_simba/11259531
以下是代碼,有Matlab的朋友可以直接用 Appdesigner打開(kāi)查看。注意,至少需要 2016a版本才具有Appdesigner功能。 ***這是回頭打的字,插入代碼居然沒(méi)有Matlab的m語(yǔ)言格式。。。還有下面代碼看著多,其實(shí)估計(jì)80%都是系統(tǒng)生成的,我們是無(wú)法修改的,實(shí)現(xiàn)功能的代碼其實(shí)不多
- classdef app2 < matlab.apps.AppBase
-
- % Properties that correspond to app components
- properties (Access = public)
- UIFigure matlab.ui.Figure
- pbOpenSerial matlab.ui.control.StateButton
- RXLabel matlab.ui.control.Label
- TXLabel matlab.ui.control.Label
- Label_RX matlab.ui.control.Label
- Label_TX matlab.ui.control.Label
- ReceiveView matlab.ui.control.TextArea
- Button_Send matlab.ui.control.Button
- transmitView matlab.ui.control.TextArea
- Button_Clear matlab.ui.control.Button
- DropDownLabel matlab.ui.control.Label
- ppCOM matlab.ui.control.DropDown
- Label matlab.ui.control.Label
- Label_2 matlab.ui.control.Label
- Lamp matlab.ui.control.Lamp
- Label_3 matlab.ui.control.Label
- ppCOM_2 matlab.ui.control.DropDown
- Panel matlab.ui.container.Panel
- Label_5 matlab.ui.control.Label
- txtStoreSwich matlab.ui.control.Switch
- Label_6 matlab.ui.control.Label
- txtStoreFlag matlab.ui.control.Lamp
- UIAxes matlab.ui.control.UIAxes
- UartsEditFieldLabel matlab.ui.control.Label
- UartsEditField matlab.ui.control.NumericEditField
- end
-
-
- properties (Access = public)
- COM; % 端口號(hào)
- Baud_Rate; %波特率
- s ; %端口設(shè)置句柄
- RX_num; %接收統(tǒng)計(jì)
- TX_num; %發(fā)送統(tǒng)計(jì)
- RX_once;%一次接收的數(shù)據(jù)
- RX_Date;%接收的所有數(shù)據(jù)
- is_open;%是否打開(kāi)串口標(biāo)志位
- Flag_i %繪圖橫坐標(biāo)的點(diǎn)
-
- end
-
-
-
- methods (Access = public)
- function EveBytesAvailableFcn(app, src, event)
- n = src.BytesAvailable;%獲取接收到的字符個(gè)數(shù)
- if n>0%n>0才繼續(xù)執(zhí)行,因?yàn)?也會(huì)觸發(fā)中斷
- app.RX_num=app.RX_num+n;
- app.Label_RX.Text=num2str(app.RX_num);%將數(shù)字轉(zhuǎn)化為字符串輸出
- app.RX_once=fread(src,n,'uchar');%讀取函數(shù),讀取后矩陣為一列
- app.RX_Date =strcat(app.RX_Date, app.RX_once');%字符串拼接,需要轉(zhuǎn)置化為一行
- app.ReceiveView.Value= app.RX_Date;%textarea的設(shè)置格式為cell,或單行字符串
- app.Flag_i=app.Flag_i+1;
- t=app.Flag_i*app.UartsEditField.Value;
- y=str2double(char(app.RX_once'));
- plot(app.UIAxes,t,y,'marker','+','linewidth',5,'linestyle','--');
- hold(app.UIAxes,'on');
-
- if strcmp(app.txtStoreSwich.Value,'On')
- app.txtStoreFlag.Color=[0 1 0];
- name_ref=['wx',datestr(now,29),'.txt']; % name_ref=['wx',datestr(now,29),'.xls'];
- fid = fopen(name_ref,'a'); %fid = fopen('c.xls','a');
- fprintf(fid,'%s\r\n',app.RX_once'); %需要轉(zhuǎn)置,進(jìn)行換行處理,txt換行 要\r\n..xls只\n就可以換行
- fclose(fid);
- else
- app.txtStoreFlag.Color=[0 0 0];
- end
- end
- end
-
- end
-
-
- methods (Access = private)
- % Code that executes after component creation
- function startupFcn(app)
- app.RX_num=0;
- app.TX_num=0;
- app.is_open=0;
- app.Flag_i=0;
- scoms = instrfind;%獲取占用的串口號(hào)
- if scoms ~= 0%如果存在則關(guān)閉,否則不能打開(kāi)
- stopasync(scoms);
- fclose(scoms);
- delete(scoms);
- end
-
-
- end
- % Button pushed function: Button_Send
- function Button_SendPushed(app, event)
- val=app.transmitView.Value;
- if length(val{1})>0%textarea控件是cell格式,獲取需要用{1}
- app.TX_num=app.TX_num+length(val{1});
- app.Label_TX.Text=num2str(app.TX_num);
- fwrite(app.s, char(val), 'uint8', 'async');%需要將val轉(zhuǎn)化為char
- end
- end
- % Value changed function: pbOpenSerial
- function pbOpenSerialValueChanged2(app, event)
-
- app.COM=get(app.ppCOM,'Value');
- app.Baud_Rate=get(app.ppCOM_2,'Value');
- if strcmp(get(app.pbOpenSerial,'Text'),'打開(kāi)串口')
- try
- app.s=serial(app.COM);
- app.s.BaudRate=str2double(app.Baud_Rate);%設(shè)置波特率,str2double 很重要
- app.s.DataBits=8;%設(shè)置數(shù)據(jù)長(zhǎng)度
- app.s.StopBits=1;%設(shè)置停止位長(zhǎng)度
- app.s.InputBufferSize=1024000;%設(shè)置輸入緩沖區(qū)大小為1M
- app.s.BytesAvailableFcnMode='byte'; %串口事件回調(diào)設(shè)置
- % app.s.Terminator='CR/LF';
- app.s.BytesAvailableFcnCount=1; %輸入緩沖區(qū)存在10個(gè)字節(jié)觸發(fā)回調(diào)函數(shù)
- app.s.BytesAvailableFcn={@app.EveBytesAvailableFcn};%回調(diào)函數(shù)的指定
-
- fopen(app.s);%打開(kāi)串口
- app.is_open=1;
- app.pbOpenSerial.Text='關(guān)閉串口';
- app.Lamp.Color=[0 1 0];
- catch err
- msgbox('打開(kāi)失敗');
- end
- else
- try
- fclose(app.s);
- app.pbOpenSerial.Text='打開(kāi)串口';
- app.Lamp.Color=[0.15 0.15 0.15];
- catch err
- msgbox('關(guān)閉失敗');
- end
- delete(app.s);
- app.is_open=0;
- end
- end
- % Close request function: UIFigure
- function UIFigureCloseRequest(app, event)
- delete(app)
-
- end
- % Button pushed function: Button_Clear
- function Button_ClearPushed(app, event)
- app.RX_Date ='';
- app.ReceiveView.Value= app.RX_Date;
- app.TX_num=0;
- app.RX_num=0;
- app.Label_TX.Text=num2str(app.TX_num);
- app.Label_RX.Text=num2str(app.RX_num);
- cla(app.UIAxes,'reset');
- end
- % Value changed function: txtStoreSwich
- function txtStoreSwichValueChanged(app, event)
- value = app.txtStoreSwich.Value;
- if strcmp(value,'On')
- app.txtStoreFlag.Color=[0 1 0];
- else
- app.txtStoreFlag.Color=[0 0 0];
- end
- end
- end
- % App initialization and construction
- methods (Access = private)
- % Create UIFigure and components
- function createComponents(app)
- % Create UIFigure
- app.UIFigure = uifigure;
- app.UIFigure.Position = [500 300 895 521];
- app.UIFigure.Name = 'UI Figure';
- app.UIFigure.CloseRequestFcn = createCallbackFcn(app, @UIFigureCloseRequest, true);
- % Create pbOpenSerial
- app.pbOpenSerial = uibutton(app.UIFigure, 'state');
- app.pbOpenSerial.ValueChangedFcn = createCallbackFcn(app, @pbOpenSerialValueChanged2, true);
- app.pbOpenSerial.Text = '打開(kāi)串口';
- app.pbOpenSerial.FontSize = 16;
- app.pbOpenSerial.FontWeight = 'bold';
- app.pbOpenSerial.Position = [740 311 81 27];
- % Create RXLabel
- app.RXLabel = uilabel(app.UIFigure);
- app.RXLabel.Position = [42 60 25 15];
- app.RXLabel.Text = 'RX:';
- % Create TXLabel
- app.TXLabel = uilabel(app.UIFigure);
- app.TXLabel.Position = [102 60 25 15];
- app.TXLabel.Text = 'TX:';
- % Create Label_RX
- app.Label_RX = uilabel(app.UIFigure);
- app.Label_RX.Position = [66 60 37 15];
- app.Label_RX.Text = '0';
- % Create Label_TX
- app.Label_TX = uilabel(app.UIFigure);
- app.Label_TX.Position = [126 60 82 15];
- app.Label_TX.Text = '0';
- % Create ReceiveView
- app.ReceiveView = uitextarea(app.UIFigure);
- app.ReceiveView.Position = [25 192 161 270];
- % Create Button_Send
- app.Button_Send = uibutton(app.UIFigure, 'push');
- app.Button_Send.ButtonPushedFcn = createCallbackFcn(app, @Button_SendPushed, true);
- app.Button_Send.FontSize = 16;
- app.Button_Send.FontWeight = 'bold';
- app.Button_Send.Position = [716 96 100 27];
- app.Button_Send.Text = '發(fā)送';
- % Create transmitView
- app.transmitView = uitextarea(app.UIFigure);
- app.transmitView.Position = [27 88 159 60];
- % Create Button_Clear
- app.Button_Clear = uibutton(app.UIFigure, 'push');
- app.Button_Clear.ButtonPushedFcn = createCallbackFcn(app, @Button_ClearPushed, true);
- app.Button_Clear.FontSize = 16;
- app.Button_Clear.FontWeight = 'bold';
- app.Button_Clear.Position = [716 49 100 27];
- app.Button_Clear.Text = '清空';
- % Create DropDownLabel
- app.DropDownLabel = uilabel(app.UIFigure);
- app.DropDownLabel.HorizontalAlignment = 'right';
- app.DropDownLabel.FontName = 'Calibri';
- app.DropDownLabel.FontSize = 18;
- app.DropDownLabel.Position = [684 422 41 24];
- app.DropDownLabel.Text = '串口';
- % Create ppCOM
- app.ppCOM = uidropdown(app.UIFigure);
- app.ppCOM.Items = {'COM1', 'COM2', 'COM3', 'COM4'};
- app.ppCOM.FontName = 'Calibri';
- app.ppCOM.FontSize = 18;
- app.ppCOM.Position = [740 424 76 25];
- app.ppCOM.Value = 'COM1';
- % Create Label
- app.Label = uilabel(app.UIFigure);
- app.Label.FontSize = 18;
- app.Label.FontWeight = 'bold';
- app.Label.Position = [39 475 42 23];
- app.Label.Text = '接收';
- % Create Label_2
- app.Label_2 = uilabel(app.UIFigure);
- app.Label_2.FontSize = 18;
- app.Label_2.FontWeight = 'bold';
- app.Label_2.Position = [39 151 42 23];
- app.Label_2.Text = '發(fā)送';
- % Create Lamp
- app.Lamp = uilamp(app.UIFigure);
- app.Lamp.Position = [695 317 20 20];
- app.Lamp.Color = [0.149 0.149 0.149];
- % Create Label_3
- app.Label_3 = uilabel(app.UIFigure);
- app.Label_3.HorizontalAlignment = 'right';
- app.Label_3.FontName = 'Calibri';
- app.Label_3.FontSize = 18;
- app.Label_3.Position = [682 373 59 24];
- app.Label_3.Text = '波特率';
- % Create ppCOM_2
- app.ppCOM_2 = uidropdown(app.UIFigure);
- app.ppCOM_2.Items = {'300', '600', '1200', '2400', '4800', '9600', '19200', '38400', '115200'};
- app.ppCOM_2.FontName = 'Calibri';
- app.ppCOM_2.FontSize = 18;
- app.ppCOM_2.Position = [756 375 60 25];
- app.ppCOM_2.Value = '9600';
- % Create Panel
- app.Panel = uipanel(app.UIFigure);
- app.Panel.Position = [655 173 231 87];
- % Create Label_5
- app.Label_5 = uilabel(app.Panel);
- app.Label_5.HorizontalAlignment = 'center';
- app.Label_5.Position = [136 24 77 15];
- app.Label_5.Text = '文本存儲(chǔ)按鈕';
- % Create txtStoreSwich
- app.txtStoreSwich = uiswitch(app.Panel, 'slider');
- app.txtStoreSwich.ValueChangedFcn = createCallbackFcn(app, @txtStoreSwichValueChanged, true);
- app.txtStoreSwich.Position = [151 54 45 20];
- % Create Label_6
- app.Label_6 = uilabel(app.Panel);
- app.Label_6.HorizontalAlignment = 'right';
- app.Label_6.Position = [26 24 77 15];
- app.Label_6.Text = '文本存儲(chǔ)指示';
- % Create txtStoreFlag
- app.txtStoreFlag = uilamp(app.Panel);
- app.txtStoreFlag.Position = [52 45 29 29];
- app.txtStoreFlag.Color = [0 0 0];
- % Create UIAxes
- app.UIAxes = uiaxes(app.UIFigure);
- title(app.UIAxes, 'Figure')
- xlabel(app.UIAxes, 'time')
- ylabel(app.UIAxes, 'Y')
- app.UIAxes.LineStyleOrder = {'- '};
- app.UIAxes.NextPlot = 'add';
- app.UIAxes.Position = [197 46 445 438];
- % Create UartsEditFieldLabel
- app.UartsEditFieldLabel = uilabel(app.UIFigure);
- app.UartsEditFieldLabel.HorizontalAlignment = 'right';
- app.UartsEditFieldLabel.Position = [262 18 121 15];
- app.UartsEditFieldLabel.Text = 'Uart發(fā)送數(shù)據(jù)的周期/s';
- % Create UartsEditField
- app.UartsEditField = uieditfield(app.UIFigure, 'numeric');
- app.UartsEditField.Limits = [0 Inf];
- app.UartsEditField.Position = [398 14 49 22];
- app.UartsEditField.Value = 1;
- end
- end
- methods (Access = public)
- % Construct app
- function app = app2
- % Create and configure components
- createComponents(app)
- % Register the app with App Designer
- registerApp(app, app.UIFigure)
- % Execute the startup function
- runStartupFcn(app, @startupFcn)
- if nargout == 0
- clear app
- end
- end
- % Code that executes before app deletion
- function delete(app)
- % Delete UIFigure when app is deleted
- delete(app.UIFigure)
- end
- end
- end
復(fù)制代碼 |