如何用C來(lái)完成SN8系列芯片的程序設(shè)計(jì)_第1頁(yè)
如何用C來(lái)完成SN8系列芯片的程序設(shè)計(jì)_第2頁(yè)
如何用C來(lái)完成SN8系列芯片的程序設(shè)計(jì)_第3頁(yè)
如何用C來(lái)完成SN8系列芯片的程序設(shè)計(jì)_第4頁(yè)
如何用C來(lái)完成SN8系列芯片的程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩50頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、TDxxxV1.0如何用C來(lái)完成SN8系列芯片的程序設(shè)計(jì)松翰 易愛(ài)華松翰科技(深圳)有限公司SONIX TECHNOLOGY CO.,LTD.內(nèi)容概覽一、 C 與Assembly簡(jiǎn)述二、 SN8 C studio 的安裝與使用2.1 SN8 C studio 的安裝2.2 SN8 C studio應(yīng)用實(shí)例三、 數(shù)據(jù)類型與運(yùn)算3.1 專有數(shù)據(jù)類型3.2 常量與變量3.3 數(shù)據(jù)的存儲(chǔ)類型與存儲(chǔ)結(jié)構(gòu)四、 程序流程控制4.1 順序結(jié)構(gòu)4.2 分支判斷結(jié)構(gòu)4.3 循環(huán)控制結(jié)構(gòu)五、 函數(shù)5.1 函數(shù)的定義5.2 函數(shù)參數(shù)傳遞與返回值5.3 函數(shù)參數(shù)與全局變量六、 結(jié)構(gòu)體、聯(lián)合在SN8 C程序中的應(yīng)用6.1

2、 結(jié)構(gòu)體6.2 聯(lián)合七、 中斷7.1 中斷函數(shù)的定義7.2 中斷過(guò)程的分析7.3 中斷函數(shù)的結(jié)構(gòu)八、 位操作8.1 位的定義8.2 位的運(yùn)算8.3 位比較在程序流程控制中的應(yīng)用九、 內(nèi)嵌匯編9.1 如何內(nèi)嵌匯編9.2 內(nèi)嵌匯編時(shí)變量的傳遞十、 程序結(jié)構(gòu)10.1 主函數(shù)與子函數(shù)10.2 構(gòu)建可復(fù)用文件10.3 構(gòu)建具有實(shí)用性的程序一、C 與Assembly簡(jiǎn)述Assembly(匯編)的歷史已經(jīng)有半個(gè)多世紀(jì)了,從計(jì)算機(jī)的發(fā)明那天開始,匯編就注定要與其結(jié)緣,它作為第一種真正意義上的編程語(yǔ)言,在計(jì)算機(jī)的發(fā)展過(guò)程中具有無(wú)可替代的地位。匯編具有與機(jī)器語(yǔ)言一一對(duì)應(yīng)的高效率,就是由于匯編的高效率,和其緊貼硬件

3、的特性,使其在半個(gè)世紀(jì)之后的今天依然是目前開發(fā)單片機(jī)程序的主流工具之一。但是由于編寫匯編代碼的工作量和難度都比較高,并且要求程序員對(duì)硬件必須有較深刻的了解,其入門就相對(duì)較難。而匯編的寫法各異,不同的程序員編寫的代碼有著巨大的差異,這就帶來(lái)了學(xué)習(xí)的難度,可讀性差也成為了其推廣的瓶頸,程序的維護(hù)更加艱難。隨著程序復(fù)雜性的增加,開發(fā)團(tuán)隊(duì)的形成,應(yīng)用而生的高級(jí)語(yǔ)言就逐漸取代了其位置。C就是高級(jí)語(yǔ)言中針對(duì)硬件操作最優(yōu)秀的一種,C也是基于匯編的,其相互關(guān)系如圖所示。隨著人們不斷的對(duì)C進(jìn)行改善,使C的效率得到了很大的提升,其編譯效率逐漸的逼近匯編。而C以其模塊化的編程模式,簡(jiǎn)潔的代碼,良好的可讀性和可維護(hù)性

4、,成為了另一種單片機(jī)開發(fā)的主流開發(fā)工具,相比匯編而言,其具有無(wú)可比擬的優(yōu)異性。機(jī)器語(yǔ)言匯編代碼C代碼圖1、C與匯編的關(guān)系SN8 C 是基于標(biāo)準(zhǔn)C而又加入SONIX SN8 系列芯片特征的專用C,它面對(duì)的是SONIX SN8 系列芯片程序開發(fā),它能產(chǎn)生非常簡(jiǎn)潔的能直接運(yùn)行于SN8 系列芯片的優(yōu)化代碼。具有良好的兼容性,易學(xué)易用,既方便客戶開發(fā),又繼承了原有匯編的卓越性能。在本文當(dāng)中,我們將結(jié)合匯編來(lái)講述C開發(fā)的各方面知識(shí),以期通過(guò)對(duì)比來(lái)加深對(duì)芯片的編程應(yīng)用的了解,同時(shí),對(duì)熟悉C的程序員來(lái)說(shuō),可以更加深入了解芯片;而對(duì)于熟悉匯編的程序員來(lái)說(shuō),我們可以從對(duì)比中找到從匯編到C的轉(zhuǎn)換方法。二、SN8 C

5、 studio 的安裝與使用SONIX SN8 系列的芯片是RISC內(nèi)核的高性能芯片。目前,由SONIX提供的SN8 Assembly僅有59條指令,是一種高效的匯編語(yǔ)言,有S8ASM和M2ASM編譯器分別支持其1系和2系芯片。在此基礎(chǔ)上的SN8 C studio整合了匯編和C的編譯器,11、 SN8 C studio 的安裝在得到SN8 C studio的安裝包后,按照標(biāo)準(zhǔn)的Windows程序安裝方法安裝就可以將軟件安裝到機(jī)器上。12、SN8 C studio應(yīng)用實(shí)例一、 創(chuàng)建一個(gè)工作區(qū)與VC類似,我們的工程管理模式是以工作區(qū)方式來(lái)管理,在你準(zhǔn)備一個(gè)項(xiàng)目的時(shí)候,你首先創(chuàng)建一個(gè)屬于這個(gè)項(xiàng)目的工

6、作區(qū):1、打開IDS-文件-新建,單擊出現(xiàn)如下界面:圖2-1 新建對(duì)話框2、單擊workSpace 圖標(biāo),進(jìn)入workspace創(chuàng)建窗口,單擊Location 編輯框后的按鈕,選擇你需要的工作目錄,然后輸入新建Workspace的name,在這里如下:圖2-2 新建Workspace對(duì)話框3、單擊OK,IDS 的界面生成了工作區(qū)的工作界面,出現(xiàn)了Workspace窗口和Output窗口。同時(shí),打開目標(biāo)文件夾,你會(huì)發(fā)現(xiàn)在你選定的文件夾下面,生成了一個(gè)以Workspace Name 命名的新文件夾,打開文件夾你可以看到一個(gè)新生成的.wsp文件,這就是新生成的Workspace 的配置文件:圖2-3

7、 新生成的Workspace配置文件二、 新建一個(gè)工程(Project)在我們成功創(chuàng)建一個(gè)工作區(qū)后,你會(huì)發(fā)現(xiàn)我們的Workspace 窗口中的Projiect數(shù)目為0,接著我們就要依據(jù)項(xiàng)目所用的芯片母體來(lái)創(chuàng)建一個(gè)工程項(xiàng)目了,跟創(chuàng)建Workspace相同,打開菜單中的 文件-新建,單擊出現(xiàn)新建窗口,此時(shí)默認(rèn)為新建Project。在右邊的Project List窗口中選擇你要使用的芯片母體和要?jiǎng)?chuàng)建的工程類型(一般為普通項(xiàng)目),此時(shí)的目標(biāo)路徑Location 中已經(jīng)顯示為你剛才建立的Workspace目錄,建議將工程保存在這個(gè)目錄下,不修改默認(rèn)路徑。給新建工程取一個(gè)有意義的Name,在框中輸入。這里

8、我們?nèi)∨cWorkspace相同的名稱,新建一個(gè)2700系列芯片的普通項(xiàng)目工程,設(shè)置如下圖所示:1、單擊文件-新建,選擇合適的選項(xiàng):圖2-4 新建Project2、單擊OK。3、新工程選項(xiàng)配置,在確認(rèn)建立工程后,出現(xiàn)Project Setting 對(duì)話框,左邊的Project列表中默認(rèn)選中我們剛剛建立的工程,在這里我們只修改Chip 和Code Option項(xiàng)目下的選項(xiàng),如圖所示:圖2-5 Project Setting 對(duì)話框4、選擇正確的芯片:在Chip頁(yè)中,Definition文本框中顯示系統(tǒng)依據(jù)你選定的芯片母體系列而確定的需要調(diào)用的芯片定義文件。Chip List 表列出了當(dāng)前版本的ID

9、S所支持的這一系列的各個(gè)芯片,選中其中你需要使用的芯片母體,Selected 文本框和Description文本框相應(yīng)會(huì)自動(dòng)改變。如圖:圖2-6 選擇芯片5、設(shè)置正確的Code Option選項(xiàng)和ICE MODE:ICE MODE的設(shè)置在SN8P1xxx芯片中是用于選擇是否是ICE仿真模式,在Code Option列表中自動(dòng)顯示選定芯片母體的Code Option 選項(xiàng),在Option Value項(xiàng)的默認(rèn)值上單擊,出現(xiàn)一個(gè)下拉列表,單擊選擇合適的選項(xiàng)。如圖:圖2-7 設(shè)置正確的Code Option6、單擊OK,系統(tǒng)生成一個(gè)沒(méi)有文件的工程,在Workspace 管理窗口中我們可以看見(jiàn)當(dāng)前生成的

10、工程為Working project,正處被激活狀態(tài)(工程名稱為加粗字體):圖2-8 新建Project的狀態(tài)被激活打開相應(yīng)的文件夾,我們會(huì)發(fā)現(xiàn)系統(tǒng)生成了很多個(gè)新的文件,其中的.prj文件即為工程文件,其他的文件為根據(jù)我們剛才的設(shè)置和不同的芯片生成的配置文件及頭文件。三、 新建文件完成項(xiàng)目的新建后,我們發(fā)現(xiàn)項(xiàng)目管理器source文件夾下是空的,沒(méi)有任何文件,文件就是我們編程的主要工作了!1、打開文件-新建菜單,單擊出現(xiàn)我們前面看過(guò)很多次的New對(duì)話框,不過(guò)比前面多了一個(gè)選項(xiàng)Files,選擇New列表中的Files選項(xiàng),單擊按鈕,對(duì)話框如圖所示:圖2-9 新建文件對(duì)話框2、在File List中

11、選中需要?jiǎng)?chuàng)建的文件類型,這里我們創(chuàng)建一個(gè)C Source File,給文件命名從Name 編輯框中輸入,存放的地點(diǎn)為剛才的設(shè)定位置,默認(rèn)不做修改。3、單擊OK按鈕,IDS打開一個(gè)編輯窗口,最大化,顯示為剛剛建立的文件名的頁(yè),系統(tǒng)允許我們?cè)谶@里進(jìn)行程序的編寫。四、 編寫程序在新建一個(gè)文件后,系統(tǒng)自動(dòng)打開編輯器,并打開一個(gè)由用戶命名的空文檔,它與普通文檔相比較沒(méi)有什么不同的之處,只不過(guò)它可以對(duì)C的關(guān)鍵字進(jìn)行高亮顯示。在新的文檔里編輯程序。C本身就是一種模塊化的編程語(yǔ)言,SN8C的編程保持C 語(yǔ)言的編程風(fēng)格。SN8C所具有的Non-ANSI C的特性請(qǐng)參看其他章節(jié),在此不再做描述。下面是一個(gè)簡(jiǎn)單的C

12、程序舉例。例2:/* *File Name : SN8C_Ex.c*Post By : Dragon.Yi*Date : 2005/09/23*Test History : V1.00.220* describe:test 2708 interrupt*/#include struct wordunsigned fint:1;unsigned :7;intword;unsigned int tc0cvalue=0x64;unsigned int accbuf = 0x00;unsigned int pflagbuf = 0;_interrupt intserv(void)/The data w

13、ill auto store!_bCLR(&INTRQ,5);TC0C = tc0cvalue;intword.fint = 1;void initIO(void);void initINT(void);void main(void)STKP=0x07;initIO();initINT();while(1)if(intword.fint!=0)P1=0x00;P2=0x00;P3=0x00;P4=0x00;P5=0x00;P0=0x00;elseP0=0xff;P1=0xff;P2=0xff;P3=0xff;P4=0xff;P5=0xff;void initIO(void)P0M=0xFF;P

14、1M=0xFF;P2M=0xFF;P3M=0xFF;P4M=0xFF;P5M=0xFF;void initINT(void)INTRQ=0x00;INTEN=0x00;TC0M=0x00;TC0M=0x20;TC0C=0x64;_bCLR(&INTRQ,5);_bSET(&INTEN,5);_bSET(&TC0M,7);_bSET(&STKP,7);注:程序只作為程序架構(gòu)提供參考!五、 調(diào)試程序在完成代碼編輯后,想要馬上順利運(yùn)行基本上是不可能的,每一個(gè)程序都有經(jīng)過(guò)調(diào)試的過(guò)程,程序的調(diào)試在IDS 中非常方便,IDS有全面的可視化的調(diào)試工具。你可以在程序中設(shè)置斷點(diǎn),在程序中按自己的需求來(lái)運(yùn)行。可以

15、根據(jù)不同的需求來(lái)進(jìn)行調(diào)試。1、 compile 和Build完成代碼的編輯后,首先要進(jìn)行Compile,在菜單Build-Compile current file單擊或在工具欄中單擊Compile按鈕和單擊快捷鍵Ctrl+F7 均可以啟動(dòng)系統(tǒng)的Compile程序。Compile 程序會(huì)檢查代碼中存在的語(yǔ)法錯(cuò)誤和軟件設(shè)置錯(cuò)誤,然后在Output窗口表列出來(lái),用戶可以根據(jù)表列出來(lái)的提示,對(duì)程序進(jìn)行修改。若是語(yǔ)法錯(cuò)誤,在列表中雙擊選項(xiàng),系統(tǒng)會(huì)自動(dòng)將光標(biāo)移動(dòng)到相對(duì)應(yīng)的代碼行,方便你的檢查和修改。Compile 通過(guò)后,進(jìn)行Build,同樣有3種方式可以啟動(dòng)Build程序,Build程序生成運(yùn)行所需要的

16、一些文件,同時(shí)檢查硬件配置和連接錯(cuò)誤,用戶必須根據(jù)提示對(duì)程序進(jìn)行修改才能順利通過(guò)。2、 選擇仿真方式單擊進(jìn)入Project-setting,出現(xiàn)我們前面已經(jīng)熟悉的project setting對(duì)話框,當(dāng)前顯示的是General 頁(yè),在primary setting組下面找到復(fù)選項(xiàng)use simulate。如果選中該選項(xiàng),則程序就在系統(tǒng)提供的虛擬仿真器上仿真并顯示相應(yīng)結(jié)果;若不選中該選項(xiàng),則程序必須在相應(yīng)系列的仿真器上進(jìn)行程序調(diào)試仿真。這里我們先選擇它。3、 進(jìn)入調(diào)試模式完成compile和build之后,進(jìn)入菜單Debug-begin Debug,單擊菜單項(xiàng)或直接按快捷鍵F5或在圖標(biāo)選項(xiàng)中選擇

17、按鈕單擊都可進(jìn)入調(diào)試模式,進(jìn)入調(diào)試模式后,系統(tǒng)界面變成如下圖:圖2-11 調(diào)試程序界面系統(tǒng)界面出現(xiàn)Ram window、Watch window、variable window、Register window、call stack window和Disassembly window ,這些窗口都是調(diào)試程序要用到的。程序的指針指向程序的入口處,即Main()函數(shù)的第一條語(yǔ)句。4、 應(yīng)用Watch window:在調(diào)試過(guò)程中如何應(yīng)用watch window?Watch window用在調(diào)試工程中對(duì)定義的變量進(jìn)行監(jiān)視,將需要進(jìn)行監(jiān)視的Variable 在編輯窗口中雙擊,然后拖放到Watch Wind

18、ow當(dāng)中,運(yùn)行程序就可以在watch window中看到Variable的存放地點(diǎn)和值的變化。如圖:圖2-12 watch window窗口系統(tǒng)會(huì)將產(chǎn)生了變化的項(xiàng)置成紅色。為方便觀察,你最多可以將Variable分別放到3個(gè)Watch window當(dāng)中進(jìn)行觀察,他們的顯示效果是一樣的!5、 應(yīng)用Variable windowVariable window顯示格式和watch window 的顯示格式一樣,但是variable window里面的項(xiàng)無(wú)法自己設(shè)定。它是以Auto的狀態(tài)顯示當(dāng)前運(yùn)行過(guò)程中被改變的Local Variable,同樣系統(tǒng)會(huì)將最近改變的量置成紅色。6、 應(yīng)用Register

19、 Window:Register window里面顯示的項(xiàng)是根據(jù)芯片的資源而定的,它顯示的是當(dāng)前母體芯片Ram中0x800xFF空間中專用存儲(chǔ)器在當(dāng)前運(yùn)行狀態(tài)下的值,單擊前面的“+”號(hào),將擴(kuò)展項(xiàng)目展開,可以得到每一個(gè)bit的當(dāng)前值。同樣,在運(yùn)行過(guò)程中,系統(tǒng)會(huì)將剛改變的項(xiàng)的值置為紅色高亮顯示,便于我們觀察跟蹤。圖2-13 Register 窗口7、 應(yīng)用Call stack windowCall stack window 顯示當(dāng)前運(yùn)行狀態(tài)下,stack的使用狀況和入棧的函數(shù),用戶可以根據(jù)顯示來(lái)判斷程序的調(diào)用狀況,進(jìn)而判斷當(dāng)前的狀態(tài)是否正確,有沒(méi)有函數(shù)調(diào)用出錯(cuò)。圖2-14 call stack 窗

20、口8、 應(yīng)用Memory window:在程序運(yùn)行當(dāng)中,當(dāng)你想從具體的Ram 地址而得到它的值的時(shí)候,你可以通過(guò)Memory窗口中實(shí)現(xiàn),你可以直接在Go to后面的編輯框中輸入地址,按Enter鍵確認(rèn),窗口會(huì)自動(dòng)跳轉(zhuǎn)到相應(yīng)的位置顯示該位置的值,方便我們?cè)谑褂眠^(guò)程中的查找。9、 應(yīng)用Disassembly window:如果調(diào)試過(guò)程中,你需要知道程序的直接匯編碼,你可以在這個(gè)窗口中觀察。10、 設(shè)置斷點(diǎn):程序調(diào)試的時(shí)候,往往需要知道程序運(yùn)行過(guò)程中某個(gè)變量的運(yùn)行狀態(tài),或者想知道某段程序是否執(zhí)行,還有執(zhí)行后的結(jié)果;或者,需要知道某段程序的運(yùn)行過(guò)程是否正確。這時(shí),就必須在程序的正確位置設(shè)置斷點(diǎn)。將光標(biāo)

21、移到正確位置,在相應(yīng)的行,單擊設(shè)置斷點(diǎn)的按鈕或按快捷鍵F9 或者從菜單項(xiàng)中設(shè)置都可以使該行程序被設(shè)置成為斷點(diǎn),被設(shè)置成斷點(diǎn)后,運(yùn)行程序,程序就會(huì)運(yùn)行到斷點(diǎn)處停下來(lái),以便于用戶控制程序的執(zhí)行和觀察執(zhí)行的結(jié)果。如圖:圖2-15 斷點(diǎn)執(zhí)行狀態(tài)11、 跟蹤程序執(zhí)行:應(yīng)用系統(tǒng)提供的debug工具,用戶可以很方便地對(duì)程序的執(zhí)行效果進(jìn)行跟蹤。你可以單步,也可越過(guò)一段程序往下執(zhí)行,這要看你的需要!調(diào)試工具同樣可以以3種方式打開:Debug菜單、工具欄按鈕和快捷鍵。六、 程序輸出1、 仿真程序結(jié)果:將仿真器與主機(jī)連接好,在project setting中清除use simulate選項(xiàng)的選中狀態(tài)。將需要仿真的硬

22、件系統(tǒng)目標(biāo)板連接好。單擊Debug 按鈕或者按快捷鍵進(jìn)入調(diào)試狀態(tài),就可以在實(shí)際硬件上看到程序運(yùn)行的結(jié)果,對(duì)程序進(jìn)行修改直到得到正確結(jié)果。我們就得到一個(gè)正確運(yùn)行的可以燒錄到實(shí)際芯片的程序。2、 輸出燒錄文檔在完成程序的調(diào)試仿真后,我們就需要將程序輸出。系統(tǒng)已經(jīng)在默認(rèn)目錄下生成程序的燒錄檔XXX.sn8,默認(rèn)目錄為當(dāng)前工程文件的目錄下。三、數(shù)據(jù)類型與運(yùn)算SN8 C 支持標(biāo)準(zhǔn)C的所有數(shù)據(jù)類型。具體有無(wú)符號(hào)字符(unsigned char)、有符號(hào)字符(signed char)、無(wú)符號(hào)整型(unsigned int)、有符號(hào)整型(signed int)、無(wú)符號(hào)長(zhǎng)型(unsigned long)、有符號(hào)

23、長(zhǎng)型(signed long)、浮點(diǎn)(float)和指針類型。還支持所有的構(gòu)造類型。數(shù)據(jù)類型基本類型字符型(char)整型(int)長(zhǎng)整型(long)浮點(diǎn)型(float)構(gòu)造類型數(shù)組(array)結(jié)構(gòu)體(struct)共用體(union)枚舉(enum)指針類型空類型圖3-1 數(shù)據(jù)類型3.1 專有數(shù)據(jù)類型雖然SN8 C支持C的所有數(shù)據(jù)類型,但是由于它面對(duì)的是8-bit單片機(jī),所以必然會(huì)考慮數(shù)據(jù)類型的定義方法和長(zhǎng)度。在這些方面,SN8 C有它自己的專有的定義特征和數(shù)據(jù)長(zhǎng)度,在使用時(shí)一定要加于區(qū)分。請(qǐng)看下表:數(shù)據(jù)類型Size(Byte)數(shù)據(jù)取值范圍Signed char(short、int)1-1

24、28+127Unsigned char(short、int)10255Signed long2-32768+32767Unsigned long2065535float、double4Pointer2enum1表3-1、數(shù)據(jù)類型長(zhǎng)度定義表3.2 常量與變量在程序設(shè)計(jì)的過(guò)程中,我們有些量可能是參考值,也可能是預(yù)設(shè)的值。總之,我們希望它在整個(gè)程序中保持不變,并且在程序的任何地方可以提供我們調(diào)用,用來(lái)比對(duì)某些條件是否成立等等。對(duì)于這樣的值,我們可以不去定義它,而直接參考數(shù)值,這在匯編編程過(guò)程中,經(jīng)常會(huì)有一些缺乏經(jīng)驗(yàn)的程序員這樣用。但這就需要程序員把程序中的這些值都牢牢記住,并且要將他們的值前后統(tǒng)一,

25、這是一個(gè)非常容易出錯(cuò)的過(guò)程,而且也會(huì)影響了程序的可讀性,這樣,程序的修改和維護(hù)都非常艱難,必須處處小心翼翼,一處不慎就全盤錯(cuò)誤!這是任何人不想看到的后果。因此,建議對(duì)于程序中用到的不會(huì)改變的參考值或其他預(yù)設(shè)的值都進(jìn)行一個(gè)預(yù)先的定義,給它取一個(gè)有意義的或與其相關(guān)的名字。這個(gè)過(guò)程就是常量定義,自然,這個(gè)不變的量就稱為常量。在標(biāo)準(zhǔn)C中,由于面對(duì)的是功能強(qiáng)大的CPU系統(tǒng)和大內(nèi)存,用戶可以不去管它放置的地方。但是,面對(duì)一個(gè)單片機(jī)系統(tǒng),它的Ram非常小,有時(shí)會(huì)顯得很緊張。所以系統(tǒng)為了節(jié)省空間會(huì)將一些表格等放在系統(tǒng)的ROM中。而我們直接命名的常量,則由編譯器自動(dòng)將其替換為所需要的值,這些工作就由計(jì)算機(jī)來(lái)完成

26、好了。我們先來(lái)看看我們用匯編編寫程序時(shí)是怎么來(lái)定義常量的:如:door_service_cequ#80;80ms去門抖動(dòng)t0int_cequ#224;t0中斷時(shí)間segment_cequ#3;最多3段烹調(diào)注:上面數(shù)值前的#號(hào),是SN8ASM的符號(hào),用于提示后面的是立即數(shù)。上面定義了3個(gè)程序中會(huì)用到的參考值,順便提一下,在定義的時(shí)候加上注釋是有必要的,要不然時(shí)間久了你就又不知道你定義的到底是什么了。在上面的定義中,用的是匯編EQU關(guān)鍵字,在編譯過(guò)程中,程序里但凡出現(xiàn)了EQU前面的字段都會(huì)被其后面的值直接代替,因此,很方便地減輕了程序員的工作。我們?cè)賮?lái)看看用SN8 C是如何定義這些相同的常量的:如

27、:#definedoor_service_c80/80ms去門抖動(dòng)#definet0int_c224/t0中斷時(shí)間#definesegment_c3/;最多3段烹調(diào)上面定義的3個(gè)量是與前面匯編當(dāng)中定義的3個(gè)常量是完全相同的。在進(jìn)行編譯預(yù)處理時(shí),這些量就會(huì)被數(shù)值代替。還有一個(gè)特殊的地方,那就是一些數(shù)值列表,在匯編當(dāng)中,查表項(xiàng)都是放在Code 當(dāng)中的,作為Code 來(lái)處理,其實(shí)這些值也是常量,只不過(guò)他們的處理不同于一般常量而已,并且它們共用一個(gè)入口。下面是一個(gè)匯編的表:disp_automenu:;顯示菜單用第二數(shù)字表格dw0000hdw0ae1fh;A-1dw0ae2fh;dw0ae3fh;dw

28、0ae4fh;dw0ae5fh;dw0ae6fh;dw0ae7fh;我們可以看到,匯編的表是用DW關(guān)鍵字定義一個(gè)word,它是存放在.code段里面的,通過(guò)表頭地址來(lái)得到每一個(gè)相對(duì)應(yīng)的值。那么在SN8 C 里面又如何來(lái)處理這些表呢?在講到表的處理之前,必須先提一提變量定義關(guān)鍵字的問(wèn)題。SN8 C定義一個(gè)變量時(shí),可以指明它所放置的地方(RAM或ROM),分別用關(guān)鍵字_RAM和_ROM來(lái)指定存放的地點(diǎn),如:Unsigned int _RAM ramVeriable;/將變量存放在RAM中_RAM unsigned int ramVeriable2;Unsigned int _ROM romVeri

29、able;/將變量存放在ROM中_ROM unsigned int romVeriable2;我們可以知道,當(dāng)一個(gè)量放到了ROM當(dāng)中就沒(méi)法改變它的值了,其實(shí)就是我們說(shuō)的常量。在C當(dāng)中,可以通過(guò)一個(gè)頭名稱來(lái)訪問(wèn)的變量類型比較多,其中數(shù)組是比較方便的一種,我們可以通過(guò)定義一個(gè)數(shù)組來(lái)存儲(chǔ)這些表的數(shù)值,然后通過(guò)對(duì)數(shù)組的訪問(wèn)來(lái)查詢對(duì)應(yīng)的值。如:unsigned long _ROM disp_automenu=/顯示菜單用第二數(shù)字表格0x0000,0x0ae1f,0x0ae2f,0x0ae3f,0x0ae4f,0x0ae5f,0x0ae6f,0x0ae7f;這是一個(gè)與上面的匯編表完全相同的表,我們將它存放

30、在_ROM中,通過(guò)調(diào)用數(shù)組來(lái)查表,這在后面將詳細(xì)介紹。而在程序中還有另外一類的量是會(huì)在程序中不斷被改變的,比如程序中的計(jì)數(shù)器,狀態(tài)寄存器等等都會(huì)隨著程序的運(yùn)行而改變。我們將這一類量稱之為變量。我們先來(lái)看看匯編的定義變量的方法:.DATAorg0htemp1ds1temp2ds1temp3ds1temp4ds1led_dpds1stepds1;當(dāng)前狀態(tài)上面的代碼定義了temp1、temp2、temp3、temp4、led_dp、step6個(gè)變量,它們分別占用一個(gè)Byte的RAM空間,那么程序當(dāng)中就可以通過(guò)變量名對(duì)該變量的空間進(jìn)行讀寫。當(dāng)然在匯編中你也可以用一個(gè)變量名來(lái)訪問(wèn)兩個(gè)或多個(gè)RAM空間,這

31、類似于查表的操作,其定義如下:Job_modeds2Power_modeds4對(duì)上面的job_mode 變量可以通過(guò)job_mode 和job_mode+1來(lái)讀寫定義的兩個(gè)存儲(chǔ)單元,以此類推power_mode 或其他多個(gè)RAM空間定義的變量可以通過(guò)相同的方法來(lái)定義。可見(jiàn),SN8ASM定義變量的方法主要是通過(guò)DS關(guān)鍵字來(lái)申請(qǐng)需要的變量空間,空間一旦被申請(qǐng),就在整個(gè)程序流程里面被占用,也就是說(shuō)定義一個(gè)變量就少一個(gè)空間,這對(duì)于RAM本身就很少的單片機(jī)而言,不能不說(shuō)是一種浪費(fèi)。那么SN8C又是如何來(lái)定義變量的呢? 要說(shuō)到C的變量,就不能不提一提變量的有效作用域。我們知道,匯編當(dāng)中定義的變量都是在整個(gè)

32、程序中有效的,在程序中任何地方都可以改變變量的值,這樣程序員就會(huì)經(jīng)常遇到這樣的情況:在調(diào)試程序時(shí)發(fā)現(xiàn)變量的值有誤,卻無(wú)法判斷變量到底在什么地方被錯(cuò)誤賦值或被賦予了錯(cuò)誤的值,從而不得不在整個(gè)程序中到處設(shè)置斷點(diǎn),運(yùn)行多次才找出問(wèn)題的所在。這就是匯編當(dāng)中變量定義造成不方便的地方!而C的變量的定義區(qū)分了作用域,分為全局變量和局部變量,而區(qū)分定義這兩種變量的方法很簡(jiǎn)單,只是在不同的位置定義就行了,這與標(biāo)準(zhǔn)C所規(guī)定的方法是一樣的,后面再詳細(xì)討論。下面是SN8 C定義的幾個(gè)變量:unsigned int temp1;unsigned int temp2;unsigned int temp3;unsigned

33、 int temp4;unsigned int led_dp;unsigned int step;/當(dāng)前狀態(tài)unsigned long job_mode;unsigned long power_mode1;float powerValue;int temp1_1;/有符號(hào)的long temp2_2;從上面的定義可以看到C的變量不僅區(qū)分了作用域,還有不同長(zhǎng)度的變量類型,這樣就方便了程序員的使用。與面向數(shù)學(xué)運(yùn)算的計(jì)算機(jī)相比,單片機(jī)的編程對(duì)變量類型或數(shù)據(jù)類型的選擇更具有關(guān)鍵性意義。SN8 系列單片機(jī)是8-bit處理器的單片機(jī),只有Byte型的數(shù)據(jù)是處理器直接支持的。對(duì)于C這樣的高級(jí)語(yǔ)言,不管使用何種

34、數(shù)據(jù)類型,雖然某一行程序從字面上看,其操作十分簡(jiǎn)單,然而,實(shí)際上系統(tǒng)的C編譯器需要用一系列機(jī)器指令對(duì)其復(fù)雜的變量類型、數(shù)據(jù)類型的進(jìn)行處理。相同的一行語(yǔ)句,變量選擇的類型不同,處理時(shí)就會(huì)產(chǎn)生很大的差別,產(chǎn)生的代碼更是差別很多。特別是當(dāng)使用浮點(diǎn)變量時(shí),將明顯地贈(zèng)加運(yùn)算時(shí)間和程序的長(zhǎng)度。當(dāng)程序必須保證運(yùn)算精度時(shí),C編譯器將調(diào)用相應(yīng)的子程序庫(kù),把它們加到程序中。然而許多不熟練的程序員,在編寫C程序時(shí)往往會(huì)使用大量的、不必要的變量類型。這就導(dǎo)致C編譯器相應(yīng)地增加所調(diào)用的庫(kù)函數(shù)以處理大量增加的變量類型,并最終導(dǎo)致程序變得過(guò)于龐大,運(yùn)行速度減慢,甚至因此會(huì)在Link時(shí),出現(xiàn)因程序過(guò)大而裝不進(jìn)ROM的情況。所

35、以必須特別慎重的選擇變量和數(shù)據(jù)類型。而對(duì)于有符號(hào)與無(wú)符號(hào)的變量類型。在編寫程序時(shí),如果使用signed和unsigned兩種數(shù)據(jù)類型,那么就得使用兩種格式類型的庫(kù)函數(shù)。這將使得占用的存儲(chǔ)空間成倍增長(zhǎng)。因此在編程時(shí),如果只強(qiáng)調(diào)程序的運(yùn)算速度而又不進(jìn)行負(fù)數(shù)運(yùn)算時(shí),最好采用無(wú)符號(hào)(unsigned)格式。Note:1、 選擇數(shù)據(jù)類型的時(shí)候,在能夠順利完成功能的情況下,請(qǐng)盡量選擇占空間少的數(shù)據(jù)類型,這樣不管是在RAM空間使用上還是在產(chǎn)生代碼效率上都是有益的!2、 能使用無(wú)符號(hào)數(shù)的都使用無(wú)符號(hào)數(shù),以免處理出錯(cuò),因?yàn)樾酒瑑?nèi)部是以無(wú)符號(hào)數(shù)處理的。3、 切記!C語(yǔ)言對(duì)大小寫敏感,在開始定義變量的時(shí)候就要注意要

36、有相應(yīng)的規(guī)范可循,用駝峰式是一個(gè)好的選擇,這對(duì)于習(xí)慣于匯編的程序員來(lái)說(shuō),可能不大習(xí)慣!當(dāng)然,在標(biāo)準(zhǔn)C編程當(dāng)中,經(jīng)常會(huì)有為書寫方便,對(duì)數(shù)據(jù)類型進(jìn)行縮寫定義,這在SN8 C也是允許的。如:#define uchar unsigned char#define uint unsigned int這樣,在以后的編程中,就可以用uchar代替unsigned char,用uint 代替 unsigned int 來(lái)定義變量。3.3 數(shù)據(jù)的存儲(chǔ)類型與存儲(chǔ)結(jié)構(gòu)在前面分析查表類型數(shù)據(jù)定義的時(shí)候已經(jīng)提到了數(shù)據(jù)在單片機(jī)里的存儲(chǔ),會(huì)分為ROM和RAM兩部分,我們分別稱之為程序存儲(chǔ)器(ROM)和數(shù)據(jù)存儲(chǔ)器(RAM)。它

37、們?cè)谖覀兙帉憛R編的時(shí)候,會(huì)分別用關(guān)鍵字.code和.data來(lái)預(yù)先聲明。通常SN8系列單片機(jī)不用擴(kuò)展存儲(chǔ)器,它提供種類豐富的機(jī)型,你完全可以根據(jù)你的需求來(lái)選擇合適的機(jī)型。因此,數(shù)據(jù)只存儲(chǔ)在片內(nèi),尋址也不存在片內(nèi)片外的區(qū)分。SN8P單片機(jī)的數(shù)據(jù)存儲(chǔ)器(RAM)的結(jié)構(gòu)如下:Bank00000H通用存儲(chǔ)區(qū)128Byte 用戶存儲(chǔ)區(qū)007FH0080H系統(tǒng)寄存器區(qū)80HFFH為系統(tǒng)寄存器區(qū)域00FFHBank100100通用存儲(chǔ)區(qū)更多的用戶存儲(chǔ)區(qū)01FFh圖3-2、RAM區(qū)結(jié)構(gòu)SN8P系列單片機(jī)的通用RAM區(qū)的大小依不同的芯片而不同,但都是按BANK來(lái)劃分,每一個(gè)BANK內(nèi)的地址為00HFFH。而所有

38、芯片的Bank0 的80H FFH的空間都是留給系統(tǒng)專用的系統(tǒng)寄存器區(qū)。其實(shí)我們上面定義的變量都是放在RAM區(qū)的數(shù)據(jù)結(jié)構(gòu),在定義一個(gè)變量時(shí),我們前面已經(jīng)提到可以用_RAM和_ROM關(guān)鍵字來(lái)指定存儲(chǔ)的地方,而變量定義一般都放在RAM當(dāng)中,因而_RAM關(guān)鍵字是缺省項(xiàng)??聪旅娴睦樱簎nsigned int temp1;unsigned int _RAM temp2;_RAM unsigned int temp3;unsigned long job_mode;unsigned long _RAM job_mode2;_RAM unsigned long job_mode3;float powerVa

39、lue;float _RAM powerValue;_RAM float powerValue;int temp1_1;/有符號(hào)的int _RAM temp1-2;_RAM temp1-3;long temp2_2;其實(shí)上面的定義都是相同的效果,就是定義變量,并將其放置在數(shù)據(jù)存儲(chǔ)區(qū)(RAM)內(nèi)。也就是說(shuō),我們?cè)诙x一個(gè)變量,按我們C常用的方法定義就自動(dòng)地放到RAM里了,缺省項(xiàng)給我們帶來(lái)了很大的方便。上面已經(jīng)說(shuō)明了,在RAM存儲(chǔ)區(qū)內(nèi),80HFFH是系統(tǒng)寄存器區(qū)。那么我們又是如何來(lái)定義系統(tǒng)寄存器區(qū)呢?我們先來(lái)看看系統(tǒng)寄存器都有哪些內(nèi)容:0123456789ABCDEF8LHRZYXPFLAGRBA

40、NK-9AMPM-A-P4CON-BDAMADMADBADR-PEDGEC-P2M-P4MP5M-INTRQINTENOSCM-WDTRTC0RPCLPCHDP0-P2-P4P5-T0M-TC0MTC0CTC1MTC1CTC1RSTKPEP0UR-P2UR-P4URP5UR-YZ-FSTK7LSTK7HSTK6LSTK6HSTK5LSTK5HSTK4LSTK4HSTK3LSTK3HSTK2LSTK2HSTK1LSTK1HSTK0LSTK0H表3-2、SN8P系列單片機(jī)系統(tǒng)寄存器列表根據(jù)不同的芯片的資源,寄存器的內(nèi)容會(huì)隨之改變,但是他們定義的區(qū)域都不變。這些寄存器都分別對(duì)應(yīng)了芯片內(nèi)部的資源,SN

41、8 C針對(duì)這部分的系統(tǒng)資源,對(duì)這些寄存器進(jìn)行了定義,其定義的形式如下:#defineL(*(_RAM unsigned int*)0x80)#defineH(*(_RAM unsigned int*)0x81)#defineR(*(_RAM unsigned int*)0x82)#defineZ(*(_RAM unsigned int*)0x83)#defineY(*(_RAM unsigned int*)0x84)#defineX(*(_RAM unsigned int*)0x85)#definePFLAG(*(_RAM unsigned int*)0x86)這些定義都被包含在相應(yīng)芯片的頭文

42、檔里(.h),因此并不需要用戶自己去定義寄存器的相應(yīng)名稱,只需要在程序的開頭包含相應(yīng)的頭文檔就行了。如下所示:#include Note:這些系統(tǒng)寄存器都是以大寫字母進(jìn)行定義的,在編寫程序時(shí)要注意這一點(diǎn)。四、程序流程控制程序流程控制是程序的精華所在,正確的程序流程才能實(shí)現(xiàn)正確的程序功能。安排精巧的程序流程控制才可能使程序具有高效率。程序流程控制不管是在C還是在匯編中都是程序設(shè)計(jì)者最值得思考的地方。4.1 順序結(jié)構(gòu)順序結(jié)構(gòu)是程序最基本的流程,其語(yǔ)句順序執(zhí)行,PC指針依次下移,是CPU內(nèi)部處理指令的初始方法。這也是編程思維的最初級(jí)方式,也是程序的最基本方式和流程。順序結(jié)構(gòu)流程:A操作B操作圖4-1

43、 順序結(jié)構(gòu)流程其實(shí),其描述的是一個(gè)向量方式發(fā)展的問(wèn)題,是所有問(wèn)題發(fā)展和描述的基本方法,具有明確的方向性和時(shí)間性,如圖中的A操作的發(fā)展方向只有一個(gè),即接下來(lái)就是B操作,中間既沒(méi)有反復(fù)也沒(méi)有曲折變化,B一定發(fā)生在A的后面。我們平時(shí)可以看到的C語(yǔ)言的實(shí)現(xiàn):(微波爐開機(jī)初始化) key_bibi_f = 1;/上電響一聲 menu_disp_h = 0xf0U;/上電顯示0:00 menu_disp_l = 0; disp5 = 0xffU;上述簡(jiǎn)短的幾條語(yǔ)句分別完成一定目的的初始化,雖然在這里沒(méi)有強(qiáng)制要求什么樣的順序,但是執(zhí)行過(guò)程中是嚴(yán)格按語(yǔ)句的先后來(lái)開關(guān)目標(biāo)的。SN8ASM的實(shí)現(xiàn):b0bsetke

44、y_bibi_f;上電響一聲mova,#0f0hmovmenu_disp_h,amova,#00h;上電顯示0:00movmenu_disp_l,amova,#11111111bmovdisp5,a這是一段功能完全與上面這段C相同的匯編實(shí)現(xiàn),我們可以看見(jiàn)在順序結(jié)構(gòu)的匯編語(yǔ)句當(dāng)中沒(méi)有任何的跳轉(zhuǎn)和判斷,都是按原功能的順序來(lái)描述。從對(duì)比當(dāng)中我們完全可以找到它們的邏輯上的一一對(duì)應(yīng)關(guān)系。4.2選擇結(jié)構(gòu)事實(shí)上,完全順序結(jié)構(gòu)的流程的程序很少,因?yàn)楹芏嗍虑椴⒉皇且环L(fēng)順,順流而下。很多情況下,事件的發(fā)生都需要具備一定的條件,只有一定條件下才有可能實(shí)現(xiàn)。這就得使用選擇結(jié)構(gòu)來(lái)描述。選擇結(jié)構(gòu)流程圖:P為真?A操作B

45、操作圖4-2 選擇結(jié)構(gòu)流程圖簡(jiǎn)單選擇結(jié)構(gòu)只判斷一個(gè)條件的真假來(lái)決定下面的需要執(zhí)行的操作,這是一個(gè)最簡(jiǎn)單的判斷。C語(yǔ)言實(shí)現(xiàn):(BCD碼調(diào)整)if(result_buf 0x0a)result_buf = input + 6;elseresult_buf = input;我們看見(jiàn)在C語(yǔ)言當(dāng)中,我們用判斷語(yǔ)句來(lái)實(shí)現(xiàn)這樣一個(gè)判斷邏輯,不管是什么樣的條件,我們只計(jì)算其真假,做出判斷。Ifelse是一個(gè)非常好的判斷組合,很容易用它來(lái)完成下列我們用匯編來(lái)實(shí)現(xiàn)的功能。SN8 匯編實(shí)現(xiàn):cmprsa,#0ahnopb0bts0fcjmp$+3b0mova,yretb0mova,yadda,#6h;調(diào)整后的數(shù)放在

46、a事實(shí)上,在匯編程序中,我們會(huì)遇到幾種情況的條件選擇:一是當(dāng)條件是一個(gè)位變量時(shí),我們可以直接用b0bts指令來(lái)進(jìn)行判斷。一是當(dāng)條件是是否滿足一個(gè)預(yù)定的值,我們可以用CMPRS指令來(lái)進(jìn)行判斷,當(dāng)然也可以將其轉(zhuǎn)化為標(biāo)志位來(lái)判斷。也可以用減法的方法將其轉(zhuǎn)化成為標(biāo)志位進(jìn)行判斷,就看需要來(lái)安排了更深入。A、串行多分支結(jié)構(gòu)流程:事實(shí)上大多數(shù)時(shí)候,單個(gè)的條件無(wú)法分析判斷復(fù)雜的問(wèn)題,有時(shí)候一個(gè)結(jié)果的出現(xiàn)需要很多個(gè)條件同時(shí)成立,而每一個(gè)條件成立,又都有不同的結(jié)果產(chǎn)生,這樣就會(huì)有一系列的有層次的判斷!P1為真?P2為真?Pn為真?C1C2C3C4NYNYNY圖4-3 串行多分支結(jié)構(gòu)流程圖C用if,else if嵌

47、套來(lái)實(shí)現(xiàn):if(key_bibi_f)buzzer_time = d_buzzer_time1;/響聲長(zhǎng)短,200msbuzzer_not = d_buzzer_not3;/要響幾次,#1else if(end_bibi_f)/buzzer10buzzer_time = d_buzzer_time2;/響聲長(zhǎng)短,500msbuzzer_not = d_buzzer_not1;/要響幾次,#10else if(segment_bibi_f)/buzzer20buzzer_time = d_buzzer_time2;/響聲長(zhǎng)短,500msbuzzer_not = d_buzzer_not1;/要響

48、幾次,#4說(shuō)明:key_bibi_f;按鍵響聲請(qǐng)求標(biāo)志end_bibi_f;烹調(diào)結(jié)束響聲請(qǐng)求標(biāo)志sgment_bibi_f;段切換響聲請(qǐng)求標(biāo)志按鍵響聲:200ms/1次結(jié)束響聲:500ms/5次段切換響聲:500ms/2次問(wèn):SN8 ASM怎么實(shí)現(xiàn)?SN8 ASM的實(shí)現(xiàn):Buzzer00:b0bts1 key_bibi_fjmpbuzzer10mova,buzzer_time1;200msmovbuzzer_time,a;響聲長(zhǎng)短mova,buzzer_not3;#1movbuzzer_not,a;要響幾次jmpbuzzer40buzzer10:b0bts1 end_bibi_fjmpbuzz

49、er20mova,buzzer_time2;500msmovbuzzer_time,a;響聲長(zhǎng)短mova,buzzer_not1;#10movbuzzer_not,a;要取反的次數(shù)jmpbuzzer40buzzer20:b0bts1 segment_bibi_fjmpbuzzer30mova,buzzer_time2;500msmovbuzzer_time,a;響聲長(zhǎng)短mova,buzzer_not2;#4movbuzzer_not,a;要取反的次數(shù)jmpbuzzer40B、并行多分支結(jié)構(gòu)流程:P=?A1A2A3AnP = 1P = 2P = 3P = n圖4-4 并行多分支結(jié)構(gòu)流程C可以用s

50、witchCase來(lái)實(shí)現(xiàn):switch(step)case0:/侍機(jī)狀態(tài)下第一次按時(shí)鐘鍵ks81();break;case ONE_PRESS_CLOCK_KEY_C:/按第二次設(shè)置時(shí)鐘的分鐘位ks82();break;case TWO_PRESS_CLOCK_KEY_C :/按第三次時(shí)鐘設(shè)置完畢ks83();break;case BESPOKE_ING_C :/設(shè)置好預(yù)約后再按下時(shí)鐘鍵可以查詢預(yù)約的時(shí)間ks84();break;case SELECT_TIME_C :/按時(shí)鐘鍵之前已經(jīng)設(shè)置過(guò)烹調(diào)程序表示想預(yù)約,置預(yù)約標(biāo)志bespoke_f=1if(job_mode1= DEFROST_MODE_C) break;else ks85();break;case START_ING_C:/在開始過(guò)程中按時(shí)鐘鍵可以查詢當(dāng)前正在運(yùn)行的時(shí)間if(job_mode1 = DEFROST_MODE_C) ks86();break;匯編的實(shí)現(xiàn)如下:mova,stepb0bts1fz;=0侍機(jī)狀態(tài)按時(shí)鐘鍵設(shè)置小時(shí)jmpks82cmprsa,ONE_PRESS_CLOCK_KEY_Cjmpks83cmprsa,TWO_PRE

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論