操作系統(tǒng)-嵌入式圖片顯示課程設(shè)計(jì)_第1頁
操作系統(tǒng)-嵌入式圖片顯示課程設(shè)計(jì)_第2頁
操作系統(tǒng)-嵌入式圖片顯示課程設(shè)計(jì)_第3頁
操作系統(tǒng)-嵌入式圖片顯示課程設(shè)計(jì)_第4頁
操作系統(tǒng)-嵌入式圖片顯示課程設(shè)計(jì)_第5頁
已閱讀5頁,還剩28頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè)專心-專注-專業(yè)精選優(yōu)質(zhì)文檔-傾情為你奉上專心-專注-專業(yè) 操作系統(tǒng)課程設(shè)計(jì)報(bào)告課 題:_嵌入式系統(tǒng)文件顯示_ 組長: 羅平 學(xué) 號: _ 同組姓名: 劉照、杜威、周玉輝、胡玉珍 專業(yè)班級: 網(wǎng)工15102 _ 指導(dǎo)教師: 丁德紅_ 設(shè)計(jì)時(shí)間: 2017-06-12_ 評閱意見:評定成績: 指導(dǎo)老師簽名: 年 月 日目錄 TOC o 1-2 h z u 1.前言本課程設(shè)計(jì)是學(xué)生學(xué)習(xí)完計(jì)算機(jī)操作系統(tǒng)課程后,進(jìn)行的一次全面的綜合訓(xùn)練,通過課程設(shè)計(jì),讓學(xué)生更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加

2、強(qiáng)學(xué)生的動手能力。隨著嵌入式技術(shù)的迅猛發(fā)展,人機(jī)交互界面也越來越顯示出它的重要性。本次課程設(shè)計(jì)主要以TFTLCD的LCD顯示模塊,完整的實(shí)現(xiàn)了圖片的循環(huán)顯示。TFT-LCD即薄膜晶體管液晶顯示器。其英文全稱為:Thin Film Transistor-Liquid Crystal Display。TFT-LCD與無源TN-LCD、STN-LCD的簡單矩陣不同,它在液晶顯示屏的每一個(gè)象素上都設(shè)置有一個(gè)薄膜晶體管(TFT),可有效地克服非選通時(shí)的串?dāng)_,使顯示液晶屏的靜態(tài)特性與掃描線數(shù)無關(guān),因此大大提高了圖像質(zhì)量。目前,顯示技術(shù)和顯示工業(yè)的發(fā)展迅速。顯示技術(shù)是傳遞視覺的信息技術(shù)。液晶顯示器件LCD是

3、當(dāng)今最有發(fā)展前途的一種平板顯示器件,它具有很多獨(dú)到的優(yōu)異特性。它具有顯示信息多、易于多彩化、體積小、重量輕、功耗低、壽命長、價(jià)格低、無輻射、無污染、接口控制方便等優(yōu)點(diǎn)。2.課程設(shè)計(jì)內(nèi)容2.1課程要求1、開發(fā)環(huán)境:Keilc5.0 ,阿波羅開發(fā)板2、開機(jī)的時(shí)候先檢測字庫,然后檢測SD卡是否存在,如果SD卡存在,則開始查找SD卡根目錄下的PICTURE文件夾,如果找到則顯示該文件夾下面的圖片文件(支持bmp、jpg、jpeg或gif格式),循環(huán)顯示,通過按KEY0和KEY2可以快速瀏覽下一張和上一張,KEY_UP按鍵用于暫停/繼續(xù)播放,DS1用于指示當(dāng)前是否處于暫停狀態(tài)。如果未找到PICTURE文

4、件夾/任何圖片文件,則提示錯(cuò)誤。同樣我們也是用DS0來指示程序正在運(yùn)行。整體效果就是一個(gè)精簡版的數(shù)碼相框。3、界面上有自己的學(xué)校、班級、姓名字樣。2.2組員任務(wù)分工羅 平(18):代碼修改、關(guān)鍵算法和主要函數(shù)實(shí)現(xiàn)的理解杜 威(02):PPT的制作、代碼運(yùn)行試驗(yàn)、相關(guān)知識簡介胡玉珍(05):代碼理解、組員任務(wù)分工、實(shí)現(xiàn)功能及操作簡介劉 照(16):代碼運(yùn)行試驗(yàn)、實(shí)驗(yàn)結(jié)果及結(jié)果分析周玉輝(36):word文檔制作、代碼運(yùn)行試驗(yàn)、相關(guān)知識簡介3.背景 3.1圖片格式簡介圖片有一般圖片格式有許多種,一般常用的有四種,JEPG(或者說JPG),BMP格式的,這三種是靜態(tài)圖片,以及GIF格式的動態(tài)格式圖。

5、 下面簡單介紹一下這三種圖片格式。3.1.1BMP 圖片格式BMP(全稱 Bitmap)是 Window 操作系統(tǒng)中的標(biāo)準(zhǔn)圖像文件格式,文件后綴名為“ .bmp”, 使用非常廣。它采用位映射存儲格式,除了圖像深度可選以外,不采用其他任何壓縮,因此, BMP 文件所占用的空間很大,但是沒有失真。BMP 文件的圖像深度可選 lbit、 4bit、 8bit、 16bit、 24bit 及 32bit。 BMP 文件存儲數(shù)據(jù)時(shí),圖像的掃描方式是按從左到右、從下到上的順序。典型的 BMP 圖像文件由四部分組成: 1、位圖頭文件數(shù)據(jù)結(jié)構(gòu),它包含 BMP 圖像文件的類型、顯示內(nèi)容等信息;2、位圖信息數(shù)據(jù)結(jié)

6、構(gòu),它包含有 BMP 圖像的寬、高、壓縮方法,以及定義顏色等信息;3、調(diào)色板,這個(gè)部分是可選的,有些位圖需要調(diào)色板,有些位圖,比如真彩色圖( 24位的 BMP)就不需要調(diào)色板; 4、位圖數(shù)據(jù),這部分的內(nèi)容根據(jù) BMP 位圖使用的位數(shù)不同而不同,在 24 位圖中直接使用 RGB,而其他的小于 24 位的使用調(diào)色板中顏色索引值。3.1.2JPEG文件格式JPEG 是 Joint Photographic Experts Group(聯(lián)合圖像專家組)的縮寫,文件后輟名為 “ jpg”或“ jpeg”,是最常用的圖像文件格式,由一個(gè)軟件開發(fā)聯(lián)合會組織制定, 同 BMP 格式不同, JPEG 是一種有損

7、壓縮格式,能夠?qū)D像壓縮在很小的儲存空間,圖像中重復(fù)或不重要的資料會被丟失,因此容易造成圖像數(shù)據(jù)的損傷( BMP 不會,但是 BMP 占用空間大)。比如可以把 1 37Mb 的 BMP 位圖文件壓縮至 20 3KB。當(dāng)然也可以在圖像質(zhì)量和文件尺寸之間找到平衡點(diǎn)。 JPEG 格式壓縮的主要是高頻信息,對色彩的信息保留較好,適合應(yīng)用于互聯(lián)網(wǎng),可減少圖像的傳輸時(shí)間,可以支持 24bit 真彩色,也普遍應(yīng)用于需要連續(xù)色調(diào)的圖像。JPEG/JPG 的解碼過程可以簡單的概述為如下幾個(gè)部分:從文件頭讀出文件的相關(guān)信息。JPEG 文件數(shù)據(jù)分為文件頭和圖像數(shù)據(jù)兩大部分,其中文件頭記錄了圖像的版本、長寬、采樣因子

8、、量化表、哈夫曼表等重要信息。所以解碼前必須將文件頭信息讀出,以備圖像數(shù)據(jù)解碼過程之用。2、從圖像數(shù)據(jù)流讀取一個(gè)最小編碼單元(MCU) ,并提取出里邊的各個(gè)顏色分量單元。3、將顏色分量單元從數(shù)據(jù)流恢復(fù)成矩陣數(shù)據(jù)。使用文件頭給出的哈夫曼表,對分割出來的顏色分量單元進(jìn)行解碼,把其恢復(fù)成 88 的數(shù)據(jù)矩陣。4、 88 的數(shù)據(jù)矩陣進(jìn)一步解碼。此部分解碼工作以 88 的數(shù)據(jù)矩陣為單位, 其中包括相鄰矩陣的直流系數(shù)差分解碼、 使用文件頭給出的量化表反量化數(shù)據(jù)、反 Zig- zag 編碼、隔行正負(fù)糾正、反向離散余弦變換等 5 個(gè)步驟, 最終輸出仍然是一個(gè) 88 的數(shù)據(jù)矩陣。顏色系統(tǒng) YCrCb 向 RGB

9、轉(zhuǎn)換。將一個(gè)MCU 的各個(gè)顏色分量單元解碼結(jié)果整合起來,將圖像顏色系統(tǒng)從YCrCb 向RGB 轉(zhuǎn)換。6、排列整合各個(gè) MCU 的解碼數(shù)據(jù)。不斷讀取數(shù)據(jù)流中的 MCU 并對其解碼,直至讀完所有 MCU 為止,將各 MCU 解碼后的數(shù)據(jù)正確排列成完整的圖像。本課程設(shè)計(jì)程采用 TjpgDec 作為 JPG/JPEG 的解碼庫。BMP 和 JPEG 這兩種圖片格式均不支持動態(tài)效果,而 GIF 則是可以支持動態(tài)效果。3.1.3GIF 圖片格式GIF(Graphics Interchange Format)是 CompuServe 公司開發(fā)的圖像文件存儲格式, 1987年開發(fā)的 GIF 文件格式版本號是

10、GIF87a,1989 年進(jìn)行了擴(kuò)充,擴(kuò)充后的版本號定義為 GIF89a。GIF 圖像文件以數(shù)據(jù)塊(block)為單位來存儲圖像的相關(guān)信息。一個(gè) GIF 文件由表示圖形圖像的數(shù)據(jù)塊、數(shù)據(jù)子塊以及顯示圖形圖像的控制信息塊組成,稱為 GIF 數(shù)據(jù)流(DataStream)。數(shù)據(jù)流中的所有控制信息塊和數(shù)據(jù)塊都必須在文件頭(Header)和文件結(jié)束塊(Trailer)之間。GIF 文件格式采用了 LZW(Lempel-Ziv Walch)壓縮算法來存儲圖像數(shù)據(jù),定義了允許用戶為圖像設(shè)置背景的透明(transparency)屬性。如果在 GIF 文件中存放有多幅圖,它們可以像演幻燈片那樣顯示或者像動畫那

11、樣演示。一個(gè) GIF 文件的結(jié)構(gòu)可分為文件頭(File Header)、 GIF 數(shù)據(jù)流(GIF Data Stream)和文件終結(jié)器(Trailer)三個(gè)部分。文件頭包含 GIF 文件署名(Signature)和版本號(Version); GIF 數(shù)據(jù)流由控制標(biāo)識符、圖象塊(Image Block)和其他的一些擴(kuò)展塊組成;文件終結(jié)器只有一個(gè)值為0 x3B 的字符( ;)表示文件結(jié)束。4.流程設(shè)計(jì)4.1系統(tǒng)的結(jié)構(gòu)框STM324.1 系統(tǒng)結(jié)構(gòu)框圖4.2程序流程圖設(shè)計(jì)圖4.2 程序流程圖5.硬件設(shè)計(jì)5.1硬件介紹開機(jī)的時(shí)候先檢測字庫,然后檢測 SD 卡是否存在,如果 SD 卡存在,則開始查找 SD

12、 卡根目錄下的 PICTURE 文件夾,如果找到則顯示該文件夾下面的圖片文件( 支持 bmp、 jpg、 jpeg 或 gif 格式) ,循環(huán)顯示,通過按 KEY0 和 KEY2 可以快速瀏覽下一張和上一張, KEY_UP 按鍵用于暫停/繼續(xù)播放, DS1 用于指示當(dāng)前是否處于暫停狀態(tài)。如果未找到 PICTURE 文件夾/任何圖片文件,則提示錯(cuò)誤。同樣我們也是用 DS0 來指示程序正在運(yùn)行。所要用到的硬件資源如下:1) 指示燈 DS0 和 DS12) KEY0、 KEY2 和 KEY_UP 三個(gè)按鍵3) 串口4) LCD 模塊5) SD 卡6) SPI FLASH這幾部分,在之前的實(shí)例中都介紹

13、過了,我們在此就不介紹了。需要注意的是,我們在SD 卡根目錄下要建一個(gè) PICTURE 的文件夾,用來存放 JPEG、 JPG、 BMP 或 GIF 等圖片。5.2 芯片介紹STM32開發(fā)板主要采用STM32F103RBT6作為MCU,STM32F103的型號眾多,我們選擇這款的原因是看重其性價(jià)比,作為一款低端開發(fā)板,選擇STM32F103RBT6是最佳的選擇。128K FLASH、20K SRAM、2個(gè)SPI、3個(gè)串口、1個(gè)USB、1個(gè)CAN、2個(gè)12位的ADC、RTC、51個(gè)可用IO腳,這樣的配置無論放到哪里都是很不錯(cuò)的了,更重要的是其價(jià)格,不到13元的批量價(jià),足以秒殺很多其他芯片了,所以

14、我們選擇了它作為我們的主芯片。6.算法實(shí)現(xiàn)6.1功能函數(shù)首先在 HARDWARE 文件夾所在的文件夾下新建一個(gè) PICTURE 的文件夾。在該文件夾里面新建 bmp.c、 bmp.h、 tjpgd.c、 tjpgd.h、 integer.h、 gif.c、 gif.h、 piclib.c和 piclib.h 等 9 個(gè)文件。并將 PICTURE 文件夾加入頭文件包含路徑。其中 bmp.c 和 bmp.h 用于實(shí)現(xiàn)對 bmp 文件的解碼;tjpgd.c 和 tjpgd.h 用于實(shí)現(xiàn)對 jpeg/jpg文件的解碼; gif.c 和 gif.h 用于實(shí)現(xiàn)對 gif 文件的解碼;這幾個(gè)代碼太長了,所以

15、我們在這里不貼出來,請大家參考光盤本例程的源碼piclib.c代碼如下:_pic_info picinfo; /圖片信息_pic_phy pic_phy; /圖片顯示物理接口/lcd.h 沒有提供劃橫線函數(shù),需要自己實(shí)現(xiàn)void piclib_draw_hline(u16 x0,u16 y0,u16 len,u16 color)if(len=0)|(x0lcddev.width)|(y0lcddev.height)return;LCD_Fill(x0,y0,x0+len-1,y0,color);/填充顏色/x,y:起始坐標(biāo)/width, height:寬度和高度。/*color:顏色數(shù)組voi

16、d piclib_fill_color(u16 x,u16 y,u16 width,u16 height,u16 *color)u16 i,j;if(lcdltdc.pwidth!=0&lcddev.dir=0)/RGB 屏,且豎屏,則填充函數(shù)不可直接用for(i=0;iheight;i+)for(j=0;jwidth;j+)*(u16*)(u32)ltdc_framebuflcdltdc.activelayer+lcdltdc.pixsize*(lcdltdc.pwidth*(lcdltdc.pheight-x-j-1)+y+i)=colori*width+j;else LCD_Color_

17、Fill(x,y,x+width-1,y+height-1,color);/其他情況,直接填充/畫圖初始化,在畫圖之前,必須先調(diào)用此函數(shù)/指定畫點(diǎn)/讀點(diǎn)void piclib_init(void)pic_phy.read_point=LCD_ReadPoint; /讀點(diǎn)函數(shù)實(shí)現(xiàn),僅 BMP 需要pic_phy.draw_point=LCD_Fast_DrawPoint; /畫點(diǎn)函數(shù)實(shí)現(xiàn)pic_phy.fill=LCD_Fill; /填充函數(shù)實(shí)現(xiàn),僅 GIF 需要pic_phy.draw_hline=piclib_draw_hline; /畫線函數(shù)實(shí)現(xiàn),僅 GIF 需要pic_phy.fillc

18、olor=piclib_fill_color; /顏色填充函數(shù)實(shí)現(xiàn),僅 TJPGD 需要picinfo.lcdwidth=lcddev.width; /得到 LCD 的寬度像素picinfo.lcdheight=lcddev.height; /得到 LCD 的高度像素picinfo.ImgWidth=0; /初始化寬度為 0picinfo.ImgHeight=0; /初始化高度為 0picinfo.Div_Fac=0; /初始化縮放系數(shù)為 0picinfo.S_Height=0; /初始化設(shè)定的高度為 0picinfo.S_Width=0; /初始化設(shè)定的寬度為 0picinfo.S_XOFF

19、=0; /初始化 x 軸的偏移量為 0picinfo.S_YOFF=0; /初始化 y 軸的偏移量為 0picinfo.staticx=0; /初始化當(dāng)前顯示到的 x 坐標(biāo)為 0picinfo.staticy=0; /初始化當(dāng)前顯示到的 y 坐標(biāo)為 0/快速 ALPHA BLENDING 算法./src:源顏色/dst:目標(biāo)顏色/alpha:透明程度(032)/返回值:混合后的顏色.u16 piclib_alpha_blend(u16 src,u16 dst,u8 alpha)u32 src2;u32 dst2;/Convert to 32bit |-GGGGGG-RRRRR-BBBBB|sr

20、c2=(src16)|src)&0 x07E0F81F;dst2=(dst5)+src2)&0 x07E0F81F;return (dst216)|dst2;/初始化智能畫點(diǎn)/內(nèi)部調(diào)用void ai_draw_init(void)float temp,temp1; temp=(float)picinfo.S_Width/picinfo.ImgWidth;temp1=(float)picinfo.S_Height/picinfo.ImgHeight;ALIENTEK 阿波羅 STM32F429 開發(fā)板教程673STM32F429 開發(fā)指南(寄存器版)if(temp1)temp1=1; /使圖片處

21、于所給區(qū)域的中間picinfo.S_XOFF+=(picinfo.S_Width-temp1*picinfo.ImgWidth)/2;picinfo.S_YOFF+=(picinfo.S_Height-temp1*picinfo.ImgHeight)/2;temp1*=8192;/擴(kuò)大 8192 倍picinfo.Div_Fac=temp1;picinfo.staticx=0 xffff;picinfo.staticy=0 xffff;/放到一個(gè)不可能的值上面/判斷這個(gè)像素是否可以顯示/(x,y) :像素原始坐標(biāo)/chg :功能變量./返回值:0,不需要顯示.1,需要顯示u8 is_eleme

22、nt_ok(u16 x,u16 y,u8 chg) if(x!=picinfo.staticx|y!=picinfo.staticy)if(chg=1) picinfo.staticx=x; picinfo.staticy=y; return 1;else return 0;/智能畫圖/FileName:要顯示的圖片文件 BMP/JPG/JPEG/GIF/x,y,width,height:坐標(biāo)及顯示區(qū)域尺寸/fast:使能 jpeg/jpg 小圖片(圖片尺寸小于等于液晶分辨率)快速解碼,0,不使能;1,使能./圖片在開始和結(jié)束的坐標(biāo)點(diǎn)范圍內(nèi)顯示u8 ai_load_picfile(const

23、u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 fast)u8 res;/返回值u8 temp;if(x+width)picinfo.lcdwidth)return PIC_WINDOW_ERR; /x 坐標(biāo)超范圍了.if(y+height)picinfo.lcdheight)return PIC_WINDOW_ERR; /y 坐標(biāo)超范圍了./得到顯示方框大小 if(width=0|height=0)return PIC_WINDOW_ERR; /窗口設(shè)定錯(cuò)誤picinfo.S_Height=height;picinfo.S_Width=wid

24、th;/顯示區(qū)域無效if(picinfo.S_Height=0|picinfo.S_Width=0)picinfo.S_Height=lcddev.height;picinfo.S_Width=lcddev.width;return FALSE;if(pic_phy.fillcolor=NULL)fast=0;/顏色填充函數(shù)未實(shí)現(xiàn),不能快速顯示/顯示的開始坐標(biāo)點(diǎn)picinfo.S_YOFF=y;picinfo.S_XOFF=x;/文件名傳遞temp=f_typetell(u8*)filename); /得到文件的類型switch(temp) case T_BMP:res=stdbmp_deco

25、de(filename); break; /解碼 bmpcase T_JPG:case T_JPEG: res=jpg_decode(filename,fast); break; /解碼 JPG/JPEGcase T_GIF: res=gif_decode(filename,x,y,width,height); break; /解碼 gifdefault: res=PIC_FORMAT_ERR; break; /非圖片格式! return res;/動態(tài)分配內(nèi)存void *pic_memalloc (u32 size)return (void*)mymalloc(SRAMIN,size);/釋

26、放內(nèi)存void pic_memfree (void* mf)myfree(SRAMIN,mf);此段代碼總共 9 個(gè)函數(shù),其中, piclib_draw_hline 和 piclib_fill_color 函數(shù)因?yàn)?LCD 驅(qū)動,代碼沒有提供,所以在這里單獨(dú)實(shí)現(xiàn),如果 LCD 驅(qū)動代碼有提供,則直接用 LCD 提供的即可。piclib_init 函數(shù),該函數(shù)用于初始化圖片解碼的相關(guān)信息,其中_pic_phy 是我們在piclib.h 里面定義的一個(gè)結(jié)構(gòu)體,用于管理底層 LCD 接口函數(shù),這些函數(shù)必須由用戶在外部實(shí)現(xiàn)。 _pic_info 則是另外一個(gè)結(jié)構(gòu)體,用于圖片縮放處理。piclib_al

27、pha_blend 函數(shù), 該函數(shù)用于實(shí)現(xiàn)半透明效果,在小格式( 圖片分辨率小于 LCD分辨率) bmp 解碼的時(shí)候,可能被用到。ai_draw_init 函數(shù),該函數(shù)用于實(shí)現(xiàn)圖片在顯示區(qū)域的居中顯示初始化,其實(shí)is_element_ok 函數(shù),該函數(shù)用于判斷一個(gè)點(diǎn)是不是應(yīng)該顯示出來,在圖片縮放的時(shí)候該函數(shù)是必須用到的。ai_load_picfile 函數(shù),該函數(shù)是整個(gè)圖片顯示的對外接口,外部程序,通過調(diào)用該函數(shù),可以實(shí)現(xiàn) bmp、 jpg/jpeg 和 gif 的顯示,該函數(shù)根據(jù)輸入文件的后綴名,判斷文件格式,然后交給相應(yīng)的解碼程序( bmp 解碼/jpeg 解碼/gif 解碼),執(zhí)行解碼,

28、完成圖片顯示。注意,這里我們用到一個(gè) f_typetell 的函數(shù),來判斷文件的后綴名, f_typetell 函數(shù)在 exfuns.c 里面實(shí)現(xiàn),最后, pic_memalloc 和 pic_memfree 分別用于圖片解碼時(shí)需要用到的內(nèi)存申請和釋放,通過調(diào)用 mymalloc 和 myfreee 來實(shí)現(xiàn)。保存 piclib.c,然后在工程里面新建一個(gè) PICTURE 的分組,將 bmp.c、 gif.c、 tjpgd.c 和piclib.c 等 4 個(gè) c 文件加入到 PICTURE 分組下。然后打開 piclib.h,在該文件輸入如下代碼:#ifndef _PICLIB_H#define

29、 _PICLIB_H #include sys.h#include lcd.h#include malloc.h#include ff.h#include exfuns.h#include bmp.h#include tjpgd.h#include gif.h#define PIC_FORMAT_ERR 0 x27 /格式錯(cuò)誤#define PIC_SIZE_ERR 0 x28 /圖片尺寸錯(cuò)誤#define PIC_WINDOW_ERR 0 x29 /窗口設(shè)定錯(cuò)誤#define PIC_MEM_ERR 0 x11 /內(nèi)存錯(cuò)誤#ifndef TRUE#define TRUE 1#endif#if

30、ndef FALSE#define FALSE 0#endif/圖片顯示物理層接口/在移植的時(shí)候,必須由用戶自己實(shí)現(xiàn)這幾個(gè)函數(shù)typedef structu16(*read_point)(u16,u16);/u16 read_point(u16 x,u16 y)讀點(diǎn)函數(shù)void(*draw_point)(u16,u16,u16);/void draw_point(u16 x,u16 y,u16 color)畫點(diǎn)函數(shù)void(*fill)(u16,u16,u16,u16,u16);/void fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 color)單色填充函數(shù)voi

31、d(*draw_hline)(u16,u16,u16,u16);/void draw_hline(u16 x0,u16 y0,u16 len,u16 color) 畫水平線函數(shù)void(*fillcolor)(u16,u16,u16,u16,u16*);/void piclib_fill_color(u16 x,u16 y,u16 width,u16 height,u16 *color) 顏色填充_pic_phy;extern _pic_phy pic_phy;/圖像信息typedef structu16 lcdwidth; /LCD 的寬度u16 lcdheight; /LCD 的高度u32

32、 ImgWidth; /圖像的實(shí)際寬度和高度u32 ImgHeight;u32 Div_Fac; /縮放系數(shù) (擴(kuò)大了 8192 倍的)u32 S_Height; /設(shè)定的高度和寬度u32 S_Width;u32 S_XOFF; /x 軸和 y 軸的偏移量u32 S_YOFF;u32 staticx; /當(dāng)前顯示到的坐標(biāo)u32 staticy;_pic_info;extern _pic_info picinfo;/圖像信息void piclib_fill_color(u16 x,u16 y,u16 width,u16 height,u16 *color);void piclib_init(vo

33、id); /初始化畫圖u16 piclib_alpha_blend(u16 src,u16 dst,u8 alpha); /alphablend 處理void ai_draw_init(void); /初始化智能畫圖u8 is_element_ok(u16 x,u16 y,u8 chg); /判斷像素是否有效u8 ai_load_picfile(const u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 fast);/智能畫圖void *pic_memalloc (u32 size); /pic 申請內(nèi)存void pic_memfree (vo

34、id* mf); /pic 釋放內(nèi)存#endif這里基本就是我們前面提到的兩個(gè)結(jié)構(gòu)體的定義以及一些函數(shù)的申明,保存 piclib.h。6.2主函數(shù)在 test.c 文件里面修改代碼如下:/得到 path 路徑下,目標(biāo)文件的總個(gè)數(shù)/path:路徑 /返回值:總有效文件數(shù)u16 pic_get_tnum(u8 *path) u8 res;u16 rval=0;DIR tdir; /臨時(shí)目錄FILINFO *tfileinfo; /臨時(shí)文件信息 tfileinfo=(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO); /申請內(nèi)存res=f_opendir(&tdir,

35、(const TCHAR*)path); /打開目錄if(res=FR_OK&tfileinfo)while(1)/查詢總的有效文件數(shù)res=f_readdir(&tdir,tfileinfo); /讀取目錄下的一個(gè)文件if(res!=FR_OK|tfileinfo-fname0=0)break; /錯(cuò)誤了/到末尾了,退出res=f_typetell(u8*)tfileinfo-fname);if(res&0XF0)=0X50)/取高四位,看看是不是圖片文件rval+;/有效文件數(shù)增加 1 ALIENTEK 阿波羅 STM32F429 開發(fā)板教程677STM32F429 開發(fā)指南(寄存器版)m

36、yfree(SRAMIN,tfileinfo);/釋放內(nèi)存return rval;int main(void)u8 res; u8 t; u16 temp;DIR picdir; /圖片目錄FILINFO *picfileinfo; /文件信息u8 *pname; /帶路徑的文件名u16 totpicnum; /圖片文件總數(shù)u16 curindex; /圖片當(dāng)前索引u8 key; /鍵值u8 pause=0; /暫停標(biāo)記u32 * picoffset; /圖片文件 offset 索引表Stm32_Clock_Init(360,25,2,8); /設(shè)置時(shí)鐘,180Mhzdelay_init(18

37、0); /初始化延時(shí)函數(shù)uart_init(90,); /初始化串口波特率為 usmart_dev.init(90);LED_Init(); /初始化與 LED 連接的硬件接口SDRAM_Init(); /初始化 SDRAMLCD_Init(); /初始化 LCDKEY_Init(); /初始化按鍵W25QXX_Init(); /初始化 W25Q256my_mem_init(SRAMIN); /初始化內(nèi)部內(nèi)存池my_mem_init(SRAMEX); /初始化外部內(nèi)存池my_mem_init(SRAMCCM); /初始化 CCM 內(nèi)存池exfuns_init(); /為 fatfs 相關(guān)變量申

38、請內(nèi)存f_mount(fs0,0:,1); /掛載 SD 卡f_mount(fs1,1:,1); /掛載 FLASH.f_mount(fs2,2:,1); /掛載 NAND FLASH.POINT_COLOR=RED;while(font_init() /檢查字庫 LCD_ShowString(30,50,200,16,16,Font Error!); delay_ms(200);LCD_Fill(30,50,240,66,WHITE); delay_ms(200);/清除顯示 Show_Str(30,50,200,16,阿波羅 STM32F4/F7 開發(fā)板,16,0);Show_Str(30

39、,70,200,16,圖片顯示程序,16,0); Show_Str(30,90,200,16,KEY0:NEXT KEY2:PREV,16,0);Show_Str(30,110,200,16,KEY_UP:PAUSE,16,0); Show_Str(30,130,200,16,正點(diǎn)原子ALIENTEK,16,0); Show_Str(30,150,200,16,2017年 6月 12日,16,0);while(f_opendir(&picdir,0:/PICTURE)/打開圖片文件夾 Show_Str(30,170,240,16,PICTURE 文件夾錯(cuò)誤!,16,0); delay_ms(2

40、00);LCD_Fill(30,170,240,186,WHITE); delay_ms(200);/清除顯示 totpicnum=pic_get_tnum(0:/PICTURE); /得到總有效文件數(shù)while(totpicnum=NULL)/圖片文件為 0 Show_Str(30,170,240,16,沒有圖片文件!,16,0); delay_ms(200);LCD_Fill(30,170,240,186,WHITE); delay_ms(200);/清除顯示 picfileinfo=(FILINFO*)mymalloc(SRAMIN,sizeof(FILINFO); /申請內(nèi)存pname

41、=mymalloc(SRAMIN,_MAX_LFN*2+1); /為帶路徑的文件名分配內(nèi)存picoffsettbl=mymalloc(SRAMIN,4*totpicnum); /申請 4*totpicnum 個(gè)字節(jié)的內(nèi)存while(picfileinfo=NULL|pname=NULL|picoffsettbl=NULL)/內(nèi)存分配出錯(cuò) Show_Str(30,170,240,16,內(nèi)存分配失敗!,16,0); delay_ms(200);LCD_Fill(30,170,240,186,WHITE); delay_ms(200);/清除顯示/記錄索引res=f_opendir(&picdir,

42、0:/PICTURE); /打開目錄if(res=FR_OK)curindex=0;/當(dāng)前索引為 0while(1)/全部查詢一遍res=f_readdir(&picdir,picfileinfo); /讀取目錄下的一個(gè)文件temp=picdir.blk_ofs; /記錄當(dāng)前 block 偏移if(res!=FR_OK|picfileinfo-fname0=0)break; /錯(cuò)誤了/到末尾了,退出res=f_typetell(u8*)picfileinfo-fname);if(res&0XF0)=0X50)/取高四位,看看是不是圖片文件picoffsettblcurindex=temp;/記

43、錄索引curindex+;Show_Str(30,170,240,16,開始顯示.,16,0);delay_ms(1500);piclib_init(); /初始化畫圖 curindex=0; /從 0 開始顯示res=f_opendir(&picdir,(const TCHAR*)0:/PICTURE); /打開目錄while(res=FR_OK)/打開成功dir_sdi(&picdir,picoffsettblcurindex); /改變當(dāng)前目錄索引 res=f_readdir(&picdir,picfileinfo); /讀取目錄下的一個(gè)文件if(res!=FR_OK|picfilein

44、fo-fname0=0)break; /錯(cuò)誤了/到末尾了,退出strcpy(char*)pname,0:/PICTURE/); /復(fù)制路徑(目錄)strcat(char*)pname,(const char*)picfileinfo-fname);/將文件名接在后面LCD_Clear(BLACK);ai_load_picfile(pname,0,0,lcddev.width,lcddev.height,1);/顯示圖片Show_Str(2,2,lcddev.width,16,pname,16,1); /顯示圖片名字Show_Str(2,22,lcddev.width,”湖南文理學(xué)院網(wǎng)工1510

45、2”,pname,16,1); /顯示圖片名字Show_Str(2,22,lcddev.width,”羅平,周玉輝,胡玉珍”,pname,16,1); /制作者姓名Show_Str(2,42,lcddev.width,”劉照,杜威”,pname,16,1); /制作者姓名t=0;while(1)key=KEY_Scan(0); /掃描按鍵if(t250)key=1; /模擬一次按下 KEY0if(t%20)=0)LED0=!LED0;/LED0 閃爍,提示程序正在運(yùn)行.if(key=KEY2_PRES) /上一張if(curindex)curindex-;else curindex=totpi

46、cnum-1;break;else if(key=KEY0_PRES)/下一張curindex+; if(curindex=totpicnum)curindex=0;/到末尾的時(shí)候,自動從頭開始break;else if(key=WKUP_PRES)pause=!pause;LED1=!pause; /暫停的時(shí)候 LED1 亮.if(pause=0)t+;delay_ms(10); res=0; myfree(SRAMIN,picfileinfo); /釋放內(nèi)存 myfree(SRAMIN,pname); /釋放內(nèi)存 myfree(SRAMIN,picoffsettbl); /釋放內(nèi)存此部分除

47、了 main 函數(shù),還有一個(gè) pic_get_tnum 的函數(shù),用來得到 path 路徑下,所有有效文件(圖片文件)的個(gè)數(shù)。 在 main 函數(shù)里面我們通過讀/寫偏移量(圖片文件在 PICTURE文件夾下的讀/寫偏移位置,可以看做是一個(gè)索引),來查找上一個(gè)/下一個(gè)圖片文件,這里我們需要用到 FATFS 自帶的一個(gè)函數(shù): dir_sdi, 來設(shè)置當(dāng)前目錄的偏移量(因?yàn)?f_readdir只能沿著偏移位置一直往下找,不能往上找),方便定位到任何一個(gè)文件。 dir_sdi 在 FATFS下面被定義為 static 函數(shù),所以我們必須在 ff.c 里面將該函數(shù)的 static 修飾詞去掉,然后在ff.

48、h 里面添加該函數(shù)的申明,以便 main 函數(shù)使用。其他部分就比較簡單了, 至此,整個(gè)圖片顯示實(shí)驗(yàn)的軟件設(shè)計(jì)部分就結(jié)束了。該程序?qū)?shí)現(xiàn)瀏覽 PICTURE 文件夾下的所有圖片,并顯示其名字,每隔 3s 左右切換一幅圖片。實(shí)驗(yàn)結(jié)果和心得7.1結(jié)果實(shí)例在代碼編譯成功之后,我們下載代碼到 ALIENTEK 阿波羅 STM32 開發(fā)板上,可以看到LCD 開始顯示圖片(假設(shè) SD 卡及文件都準(zhǔn)備好了,即:在 SD 卡根目錄新建: PICTURE 文件夾,并存放一些圖片文件(.bmp/.jpg/.gif)在該文件夾內(nèi))按 KEY0 和 KEY2 可以快速切換到下一張或上一張,KEY_UP 按鍵可以暫停自動

49、播放,同時(shí) DS1 亮,指示處于暫停狀態(tài),再按一次 KEY_UP 則繼續(xù)播放。 同時(shí),由于我們的代碼支持 gif 格式的圖片顯示(注意尺寸不能超過 LCD 屏幕尺寸),所以可以放一些 gif 圖片到PICTURE 文件夾,來看動畫了。同樣可以通過 USMART 來測試該實(shí)驗(yàn),將 ai_load_picfile 函數(shù)加入 USMART 控制(方法前面已經(jīng)講了很多次了),就可以通過串口調(diào)用該函數(shù),在屏幕上任何區(qū)域顯示任何你想要顯示的圖片了! 同時(shí),可以發(fā)送: runtime 1,來開啟 USMART 的函數(shù)執(zhí)行時(shí)間統(tǒng)計(jì)功能,從而獲取解碼一張圖片所需時(shí)間,方便驗(yàn)證。實(shí)驗(yàn)結(jié)果圖如下:7.2 心得體會周

50、玉輝:此次實(shí)訓(xùn)最大的收獲不是我學(xué)習(xí)到了多少知識而是這幾天實(shí)訓(xùn)給我的感悟:首先是心態(tài)。一定要有一個(gè)積極的心態(tài),獨(dú)立解決問題的意識,培養(yǎng)扎實(shí)基礎(chǔ)的認(rèn)識。不要什么東西都感覺很簡單就不去做了或者不屑一顧,以至于網(wǎng)上搜搜就可以了,這樣很不好。友自己的東西有自己的付出才會有程序運(yùn)行成功時(shí)的喜悅和自豪,這樣也有助于培養(yǎng)自己的興趣。要時(shí)刻牢記態(tài)度決定一切。其次是興趣,感覺學(xué)習(xí)工作中興趣很重要,只是一個(gè)引發(fā)人積極性的問題,有了興趣就自覺了,效率自然就高了。再次要敢于嘗試和挑戰(zhàn)。不要安于現(xiàn)成的程序,而且不要害怕失敗,在程序調(diào)試的過程中這點(diǎn)尤為重要,“發(fā)現(xiàn)出問題然后解決問題”是一個(gè)積累經(jīng)驗(yàn)的過程,而且很高效。最后要不懈追求。對于源代碼進(jìn)行不斷的完善,要盡可能的實(shí)現(xiàn)課題要求的功能。對于初學(xué)者或者開發(fā)較少的人來說,要注意思考,理解其實(shí)現(xiàn)的內(nèi)在意義。還可以添加一些有意義的功能來實(shí)現(xiàn)。當(dāng)看到自己編寫的程序正常運(yùn)行時(shí),興趣也會隨之而來,樂此不疲,形成一個(gè)良性循壞。胡玉珍:一周的課程設(shè)計(jì),一周的實(shí)訓(xùn),在計(jì)算機(jī)這個(gè)博大深奧的領(lǐng)域我感覺自己還有好多東西要學(xué),還有好多的東西不懂!嵌入式軟件開發(fā)應(yīng)用廣泛而且前景很好,目前正處于人才緊缺的關(guān)口,嵌入式技術(shù)在未來能夠得到更加廣泛

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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

提交評論