單片機(jī)驅(qū)動(dòng)LCD的編程思路_第1頁
單片機(jī)驅(qū)動(dòng)LCD的編程思路_第2頁
單片機(jī)驅(qū)動(dòng)LCD的編程思路_第3頁
單片機(jī)驅(qū)動(dòng)LCD的編程思路_第4頁
單片機(jī)驅(qū)動(dòng)LCD的編程思路_第5頁
已閱讀5頁,還剩20頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

單片機(jī)驅(qū)動(dòng)LCD的方法有很多,網(wǎng)絡(luò)上也有很多配套的例程,但是,網(wǎng)上例程千千萬,誰是你的“no.1”。今天給大家分享一個(gè)以面向?qū)ο蟮姆绞接脝纹瑱C(jī)驅(qū)動(dòng)LCD的思路。LCD種類概述在討論怎么寫LCD驅(qū)動(dòng)之前,我們先大概了解一下嵌入式常用LCD。概述一些跟驅(qū)動(dòng)架構(gòu)設(shè)計(jì)有關(guān)的概念,在此不對原理和細(xì)節(jié)做深入討論,會(huì)有專門文章介紹,或者參考網(wǎng)絡(luò)文檔。TFTlcdTFTLCD,也就是我們常說的彩屏。通常像素較高,例如常見的2.8寸,320X240像素。4.0寸的,像素800X400。這些屏通常使用并口,也就是8080或6800接口(STM32的FSMC接口);或者是RGB接口,STM32F429等芯片支持。其他例如手機(jī)上使用的有MIPI接口。總之,接口種類很多。也有一些支持SPI接口的。除非是比較小的屏幕,否則不建議使用SPI接口,速度慢,刷屏閃屏。玩STM32常用的TFTlcd屏幕驅(qū)動(dòng)IC通常有:ILI9341/ILI9325等。tftlcd:IPS:COGlcd很多人可能不知道COGLCD是什么,我覺得跟現(xiàn)在開發(fā)板銷售方向有關(guān)系,大家都出大屏,玩酷炫界面,對于更深的技術(shù),例如軟件架構(gòu)設(shè)計(jì),都不涉及。使用單片機(jī)的產(chǎn)品,COGLCD其實(shí)占比非常大。COG是ChipOnGlass的縮寫,就是驅(qū)動(dòng)芯片直接綁定在玻璃上,透明的。實(shí)物像下圖:這種LCD通常像素不高,常用的有128X64,128X32。一般只支持黑白顯示,也有灰度屏。接口通常是SPI,I2C。也有號(hào)稱支持8位并口的,不過基本不會(huì)用,3根IO能解決的問題,沒必要用8根吧?常用的驅(qū)動(dòng)IC:STR7565。OLEDlcd買過開發(fā)板的應(yīng)該基本用過。新技術(shù),大家都感覺高檔,在手環(huán)等產(chǎn)品常用。OLED目前屏幕較小,大一點(diǎn)的都很貴。在控制上跟COGLCD類似,區(qū)別是兩者的顯示方式不一樣。從我們程序角度來看,最大的差別就是,OLEDLCD,不用控制背光。。。。。實(shí)物如下圖:常見的是SPI跟I2C接口。常見驅(qū)動(dòng)IC:SSD1615。硬件場景接下來的討論,都基于以下硬件信息:1、有一個(gè)TFT屏幕,接在硬件的FSMC接口,什么型號(hào)屏幕?不知道。2、有一個(gè)COGlcd,接在幾根普通IO口上,驅(qū)動(dòng)IC是STR7565,128X32像素。3、有一個(gè)COGLCD,接在硬件SPI3跟幾根IO口上,驅(qū)動(dòng)IC是STR7565,128x64像素。4、有一個(gè)OLEDLCD,接在SPI3上,使用CS2控制片選,驅(qū)動(dòng)IC是SSD1315。預(yù)備知識(shí)在進(jìn)入討論之前,我們先大概說一下下面幾個(gè)概念,對于這些概念,如果你想深入了解,請GOOGLE。面向?qū)ο竺嫦驅(qū)ο?,是編程界的一個(gè)概念。什么叫面向?qū)ο竽兀烤幊逃袃煞N要素:程序(方法),數(shù)據(jù)(屬性)。例如:一個(gè)LED,我們可以點(diǎn)亮或者熄滅它,這叫方法。LED什么狀態(tài)?亮還是滅?這就是屬性。我們通常這樣編程:u8ledsta=0;voidledset(u8sta){}這樣的編程有一個(gè)問題,假如我們有10個(gè)這樣的LED,怎么寫?這時(shí)我們可以引入面向?qū)ο缶幊?,將每一個(gè)LED封裝為一個(gè)對象??梢赃@樣做:/*定義一個(gè)結(jié)構(gòu)體,將LED這個(gè)對象的屬性跟方法封裝。這個(gè)結(jié)構(gòu)體就是一個(gè)對象。但是這個(gè)不是一個(gè)真實(shí)的存在,而是一個(gè)對象的抽象。*/typedefstruct{u8sta;void(*setsta)(u8sta);}LedObj;/*聲明一個(gè)LED對象,名稱叫做LED1,并且實(shí)現(xiàn)它的方法drv_led1_setsta*/voiddrv_led1_setsta(u8sta){}LedObjLED1={.sta=0,.setsta=drv_led1_setsta,};/*聲明一個(gè)LED對象,名稱叫做LED2,并且實(shí)現(xiàn)它的方法drv_led2_setsta*/voiddrv_led2_setsta(u8sta){}LedObjLED2={.sta=0,.setsta=drv_led2_setsta,};/*操作LED的函數(shù),參數(shù)指定哪個(gè)led*/voidledset(LedObj*led,u8sta){led->setsta(sta);}是的,在C語言中,實(shí)現(xiàn)面向?qū)ο蟮氖侄尉褪墙Y(jié)構(gòu)體的使用。上面的代碼,對于API來說,就很友好了。操作所有LED,使用同一個(gè)接口,只需告訴接口哪個(gè)LED。大家想想,前面說的LCD硬件場景。4個(gè)LCD,如果不面向?qū)ο?,「顯示漢字的接口是不是要實(shí)現(xiàn)4個(gè)」?每個(gè)屏幕一個(gè)?驅(qū)動(dòng)與設(shè)備分離如果要深入了解驅(qū)動(dòng)與設(shè)備分離,請看LINUX驅(qū)動(dòng)的書籍。什么是設(shè)備?我認(rèn)為的設(shè)備就是「屬性」,就是「參數(shù)」,就是「驅(qū)動(dòng)程序要用到的數(shù)據(jù)和硬件接口信息」。那么驅(qū)動(dòng)就是「控制這些數(shù)據(jù)和接口的代碼過程」。通常來說,如果LCD的驅(qū)動(dòng)IC相同,就用相同的驅(qū)動(dòng)。有些不同的IC也可以用相同的,例如SSD1315跟STR7565,除了初始化,其他都可以用相同的驅(qū)動(dòng)。例如一個(gè)COGlcd:驅(qū)動(dòng)IC是STR7565128*64像素用SPI3背光用PF5,命令線用PF4,復(fù)位腳用PF3上面所有的信息綜合,就是一個(gè)設(shè)備。驅(qū)動(dòng)就是STR7565的驅(qū)動(dòng)代碼。為什么要驅(qū)動(dòng)跟設(shè)備分離,因?yàn)橐鉀Q下面問題:有一個(gè)新產(chǎn)品,收銀設(shè)備。系統(tǒng)有兩個(gè)LCD,都是OLED,驅(qū)動(dòng)IC相同,但是一個(gè)是128x64,另一個(gè)是128x32像素,一個(gè)叫做主顯示,收銀員用;一個(gè)叫顧顯,顧客看金額。這個(gè)問題,「兩個(gè)設(shè)備用同一套程序控制」才是最好的解決辦法。驅(qū)動(dòng)與設(shè)備分離的手段:在驅(qū)動(dòng)程序接口函數(shù)的參數(shù)中增加設(shè)備參數(shù),驅(qū)動(dòng)用到的所有資源從設(shè)備參數(shù)傳入。驅(qū)動(dòng)如何跟設(shè)備綁定呢?通過設(shè)備的驅(qū)動(dòng)IC型號(hào)。模塊化我認(rèn)為模塊化就是將一段程序封裝,提供穩(wěn)定的接口給不同的驅(qū)動(dòng)使用。不模塊化就是,在不同的驅(qū)動(dòng)中都實(shí)現(xiàn)這段程序。例如字庫處理,在顯示漢字的時(shí)候,我們要找點(diǎn)陣,在打印機(jī)打印漢字的時(shí)候,我們也要找點(diǎn)陣,你覺得程序要怎么寫?把點(diǎn)陣處理做成一個(gè)模塊,就是模塊化。非模塊化的典型特征就是「一根線串到底,沒有任何層次感」。LCD到底是什么前面我們說了面向?qū)ο螅F(xiàn)在要對LCD進(jìn)行抽象,得出一個(gè)對象,就需要知道LCD到底是什么。問自己下面幾個(gè)問題:LCD能做什么?要LCD做什么?誰想要LCD做什么?剛剛接觸嵌入式的朋友可能不是很了解,可能會(huì)想不通。我們模擬一下LCD的功能操作數(shù)據(jù)流。APP想要在LCD上顯示一個(gè)漢字。1、首先,需要一個(gè)顯示漢字的接口,APP調(diào)用這個(gè)接口就可以顯示漢字,假設(shè)接口叫做lcd_display_hz。2、漢字從哪來?從點(diǎn)陣字庫來,所以在lcd_display_hz函數(shù)內(nèi)就要調(diào)用一個(gè)叫做find_font的函數(shù)獲取點(diǎn)陣。3、獲取點(diǎn)陣后要將點(diǎn)陣顯示到LCD上,那么我們調(diào)用一個(gè)ILL9341_dis的接口,將點(diǎn)陣刷新到驅(qū)動(dòng)IC型號(hào)為ILI9341的LCD上。4、ILI9341_dis怎么將點(diǎn)陣顯示上去?調(diào)用一個(gè)8080_WRITE的接口。好的,這個(gè)就是大概過程,我們從這個(gè)過程去抽象LCD功能接口。漢字跟LCD對象有關(guān)嗎?無關(guān)。在LCD眼里,無論漢字還是圖片,都是一個(gè)個(gè)點(diǎn)。那么前面問題的答案就是:LCD可以一個(gè)點(diǎn)一個(gè)點(diǎn)顯示內(nèi)容。要LCD顯示漢字或圖片-----就是顯示一堆點(diǎn)APP想要LCD顯示圖片或文字。結(jié)論就是:所有LCD對象的功能就是顯示點(diǎn)。「那么驅(qū)動(dòng)只要提供顯示點(diǎn)的接口就可以了,顯示一個(gè)點(diǎn),顯示一片點(diǎn)?!钩橄蠼涌谌缦拢?*LCD驅(qū)動(dòng)定義*/typedefstruct{u16id;s32(*init)(DevLcd*lcd);s32(*draw_point)(DevLcd*lcd,u16x,u16y,u16color);s32(*color_fill)(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey,u16color);s32(*fill)(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey,u16*color);s32(*onoff)(DevLcd*lcd,u8sta);s32(*prepare_display)(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey);void(*set_dir)(DevLcd*lcd,u8scan_dir);void(*backlight)(DevLcd*lcd,u8sta);}_lcd_drv;上面的接口,也就是對應(yīng)的驅(qū)動(dòng),包含了一個(gè)驅(qū)動(dòng)id號(hào)。id,驅(qū)動(dòng)型號(hào)初始化畫點(diǎn)將一片區(qū)域的點(diǎn)顯示某種顏色將一片區(qū)域的點(diǎn)顯示某些顏色顯示開關(guān)準(zhǔn)備刷新區(qū)域(主要彩屏直接DMA刷屏使用)設(shè)置掃描方向背光控制顯示字符,劃線等功能,不屬于LCD驅(qū)動(dòng)。應(yīng)該歸類到GUI層。LCD驅(qū)動(dòng)框架我們設(shè)計(jì)了如下的驅(qū)動(dòng)框架:設(shè)計(jì)思路:1、中間顯示驅(qū)動(dòng)IC驅(qū)動(dòng)程序提供統(tǒng)一接口,接口形式如前面說的_lcd_drv結(jié)構(gòu)體。2、各顯示IC驅(qū)動(dòng)根據(jù)設(shè)備參數(shù),調(diào)用不同的接口驅(qū)動(dòng)。例如TFT就用8080驅(qū)動(dòng),其他的都用SPI驅(qū)動(dòng)。SPI驅(qū)動(dòng)只有一份,用IO口控制的我們也做成模擬SPI。3、LCD驅(qū)動(dòng)層做LCD管理,例如完成TFTLCD的識(shí)別。并且將所有LCD接口封裝為一套接口。4、簡易GUI層封裝了一些顯示函數(shù),例如劃線、字符顯示。5、字體點(diǎn)陣模塊提供點(diǎn)陣獲取與處理接口。由于實(shí)際沒那么復(fù)雜,在例程中我們將GUI跟LCD驅(qū)動(dòng)層放到一起。TFTLCD的兩個(gè)驅(qū)動(dòng)也放到一個(gè)文件,但是邏輯是分開的。OLED除初始化,其他接口跟COGLCD基本一樣,因此這兩個(gè)驅(qū)動(dòng)也放在一個(gè)文件。代碼分析代碼分三層:1、GUI和LCD驅(qū)動(dòng)層dev_lcd.cdev_lcd.h2、顯示驅(qū)動(dòng)IC層dev_str7565.c&dev_str7565.hdev_ILI9341.c&dev_ILI9341.h3、接口層mcu_spi.c&mcu_spi.hstm324xg_eval_fsmc_sram.c&stm324xg_eval_fsmc_sram.hGUI和LCD層這層主要有3個(gè)功能:「1、設(shè)備管理」首先定義了一堆LCD參數(shù)結(jié)構(gòu)體,結(jié)構(gòu)體包含ID,像素。并且把這些結(jié)構(gòu)體組合到一個(gè)list數(shù)組內(nèi)。/*各種LCD的規(guī)格參數(shù)*/_lcd_praLCD_IIL9341={.id=0x9341,.width=240,//LCD寬度.height=320,//LCD高度};.../*各種LCD列表*/_lcd_pra*LcdPraList[5]={&LCD_IIL9341,&LCD_IIL9325,&LCD_R61408,&LCD_Cog12864,&LCD_Oled12864,};然后定義了所有驅(qū)動(dòng)list數(shù)組,數(shù)組內(nèi)容就是驅(qū)動(dòng),在對應(yīng)的驅(qū)動(dòng)文件內(nèi)實(shí)現(xiàn)。/*所有驅(qū)動(dòng)列表驅(qū)動(dòng)列表*/_lcd_drv*LcdDrvList[]={&TftLcdILI9341Drv,&TftLcdILI9325Drv,&CogLcdST7565Drv,&OledLcdSSD1615rv,定義了設(shè)備樹,即是定義了系統(tǒng)有多少個(gè)LCD,接在哪個(gè)接口,什么驅(qū)動(dòng)IC。如果是一個(gè)完整系統(tǒng),可以做成一個(gè)類似LINUX的設(shè)備樹。/*設(shè)備樹定義*/#defineDEV_LCD_C3//系統(tǒng)存在3個(gè)LCD設(shè)備LcdObjLcdObjList[DEV_LCD_C]={{"oledlcd",LCD_BUS_VSPI,0X1315},{"coglcd",LCD_BUS_SPI,0X7565},{"tftlcd",LCD_BUS_8080,NULL},};「2、接口封裝」voiddev_lcd_setdir(DevLcd*obj,u8dir,u8scan_dir)s32dev_lcd_init(void)DevLcd*dev_lcd_open(char*name)s32dev_lcd_close(DevLcd*dev)s32dev_lcd_drawpoint(DevLcd*lcd,u16x,u16y,u16color)s32dev_lcd_prepare_display(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey)s32dev_lcd_display_onoff(DevLcd*lcd,u8sta)s32dev_lcd_fill(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey,u16*color)s32dev_lcd_color_fill(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey,u16color)s32dev_lcd_backlight(DevLcd*lcd,u8sta)大部分接口都是對驅(qū)動(dòng)IC接口的二次封裝。有區(qū)別的是初始化和打開接口。初始化,就是根據(jù)前面定義的設(shè)備樹,尋找對應(yīng)驅(qū)動(dòng),找到對應(yīng)設(shè)備參數(shù),并完成設(shè)備初始化。打開函數(shù),根據(jù)傳入的設(shè)備名稱,查找設(shè)備,找到后返回設(shè)備句柄,后續(xù)的操作全部需要這個(gè)設(shè)備句柄。「3、簡易GUI層」目前最重要就是顯示字符函數(shù)。s32dev_lcd_put_string(DevLcd*lcd,FontTypefont,intx,inty,char*s,unsignedcolidx)其他劃線畫圓的函數(shù)目前只是測試,后續(xù)會(huì)完善。驅(qū)動(dòng)IC層驅(qū)動(dòng)IC層分兩部分:「1、封裝LCD接口」LCD有使用8080總線的,有使用SPI總線的,有使用VSPI總線的。這些總線的函數(shù)由單獨(dú)文件實(shí)現(xiàn)。但是,除了這些通信信號(hào)外,LCD還會(huì)有復(fù)位信號(hào),命令數(shù)據(jù)線信號(hào),背光信號(hào)等。我們通過函數(shù)封裝,將這些信號(hào)跟通信接口一起封裝為「LCD通信總線」,也就是buslcd。BUS_8080在dev_ILI9341.c文件中封裝。BUS_LCD1和BUS_lcd2在dev_str7565.c中封裝?!?驅(qū)動(dòng)實(shí)現(xiàn)」實(shí)現(xiàn)_lcd_drv驅(qū)動(dòng)結(jié)構(gòu)體。每個(gè)驅(qū)動(dòng)都實(shí)現(xiàn)一個(gè),某些驅(qū)動(dòng)可以共用函數(shù)。_lcd_drvCogLcdST7565Drv={.id=0X7565,.init=drv_ST7565_init,.draw_point=drv_ST7565_drawpoint,.color_fill=drv_ST7565_color_fill,.fill=drv_ST7565_fill,.onoff=drv_ST7565_display_onoff,.prepare_display=drv_ST7565_prepare_display,.set_dir=drv_ST7565_scan_dir,.backlight=drv_ST7565_lcd_bl};接口層8080層比較簡單,用的是官方接口。SPI接口提供下面操作函數(shù),可以操作SPI,也可以操作VSPI。externs32mcu_spi_init(void);externs32mcu_spi_open(SPI_DEVdev,SPI_MODEmode,u16pre);externs32mcu_spi_close(SPI_DEVdev);externs32mcu_spi_transfer(SPI_DEVdev,u8*snd,u8*rsv,s32len);externs32mcu_spi_cs(SPI_DEVdev,u8sta);至于SPI為什么這樣寫,會(huì)有一個(gè)單獨(dú)文件說明。總體流程前面說的幾個(gè)模塊時(shí)如何聯(lián)系在一起的呢?請看下面結(jié)構(gòu)體:/*初始化的時(shí)候會(huì)根據(jù)設(shè)備數(shù)定義,并且匹配驅(qū)動(dòng)跟參數(shù),并初始化變量。打開的時(shí)候只是獲取了一個(gè)指針*/struct_strDevLcd{s32gd;//句柄,控制是否可以打開LcdObj*dev;/*LCD參數(shù),固定,不可變*/_lcd_pra*pra;/*LCD驅(qū)動(dòng)*/_lcd_drv*drv;/*驅(qū)動(dòng)需要的變量*/u8dir;//橫屏還是豎屏控制:0,豎屏;1,橫屏。u8scandir;//掃描方向u16width;//LCD寬度u16height;//LCD高度void*pri;//私有數(shù)據(jù),黑白屏跟OLED屏在初始化的時(shí)候會(huì)開辟顯存};每一個(gè)設(shè)備都會(huì)有一個(gè)這樣的結(jié)構(gòu)體,這個(gè)結(jié)構(gòu)體在初始化LCD時(shí)初始化。成員dev指向設(shè)備樹,從這個(gè)成員可以知道設(shè)備名稱,掛在哪個(gè)LCD總線,設(shè)備ID。typedefstruct{char*name;//設(shè)備名字LcdBusTypebus;//掛在那條LCD總線上u16id;}LcdObj;成員pra指向LCD參數(shù),可以知道LCD的規(guī)格。typedefstruct{u16id;u16width;//LCD寬度豎屏u16height;//LCD高度豎屏}_lcd_pra;成員drv指向驅(qū)動(dòng),所有操作通過drv實(shí)現(xiàn)。typedefstruct{u16id;s32(*init)(DevLcd*lcd);s32(*draw_point)(DevLcd*lcd,u16x,u16y,u16color);s32(*color_fill)(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey,u16color);s32(*fill)(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey,u16*color);s32(*prepare_display)(DevLcd*lcd,u16sx,u16ex,u16sy,u16ey);s32(*onoff)(DevLcd*lcd,u8sta);void(*set_dir)(DevLcd*lcd,u8scan_dir);void(*backlight)(DevLcd*lcd,u8sta);}_lcd_drv;成員dir、scandir、width、height是驅(qū)動(dòng)要使用的通用變量。因?yàn)槊總€(gè)LCD都有一個(gè)結(jié)構(gòu)體,一套驅(qū)動(dòng)程序就能控制多個(gè)設(shè)備而互不干擾。成員pri是一個(gè)私有指針,某些驅(qū)動(dòng)可能需要有些比較特殊的變量,就全部用這個(gè)指針記錄,通常這個(gè)指針指向一個(gè)結(jié)構(gòu)體,結(jié)構(gòu)體由驅(qū)動(dòng)定義,并且在設(shè)備初始化時(shí)申請變量空間。目前主要用于COGLCD跟OLEDLCD顯示緩存。整個(gè)LCD驅(qū)動(dòng),就通過這個(gè)結(jié)構(gòu)體組合在一起。1、初始化,根據(jù)設(shè)備樹,找到驅(qū)動(dòng)跟參數(shù),然后初始化上面說的結(jié)構(gòu)體。2、要使用LCD前,調(diào)用dev_lcd_open函數(shù)。打開成功就返回一個(gè)上面的結(jié)構(gòu)體指針。3、顯示字符,接口找到點(diǎn)陣后,通過上面結(jié)構(gòu)體的drv,調(diào)用對應(yīng)的驅(qū)動(dòng)程序。4、驅(qū)動(dòng)程序根據(jù)這個(gè)結(jié)構(gòu)體,決定操作哪個(gè)LCD總線,并且使用這個(gè)結(jié)構(gòu)體的變量。用法和好處好處1請看測試程序voiddev_lcd_test(void){DevLcd*LcdCog;DevLcd*LcdOled;DevLcd*LcdTft;/*打開三個(gè)設(shè)備*/LcdCog=dev_lcd_open("coglcd");if(LcdCog==NULL)uart_printf("opencoglcderr\r\n");LcdOled=dev_lcd_open("oledlcd");if(LcdOled==NULL)uart_printf("openoledlcderr\r\n");LcdTft=dev_lcd_open("tftlcd");if(LcdTft==NULL)uart_printf("opentftlcderr\r\n");/*打開背光*/dev_lcd_backlight(LcdCog,1);dev_lcd_backlight(LcdOled,1);dev_lcd_backlight(LcdTft,1);dev_lcd_put_string(LcdOled,FONT_SONGTI_1212,10,1,"ABC-abc,",BLACK);dev_lcd_put_string(LcdOled,FONT_SIYUAN_1616,1,13,"這是oledlcd",BLACK);dev_lcd_put_string(LcdOled,FONT_SONGTI_1212,10,30,"",BLACK);dev_lcd_put_string(LcdOled,FONT_SIYUAN_1616,1,47,"屋脊雀工作室",BLACK);dev_lcd_pu

溫馨提示

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

評論

0/150

提交評論