ImageVerifierCode 换一换
格式:DOCX , 页数:28 ,大小:173.56KB ,
资源ID:4371256      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-4371256.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统嵌入式图片显示课程设计.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

操作系统嵌入式图片显示课程设计.docx

1、操作系统嵌入式图片显示课程设计 操作系统课程设计报告课 题:_嵌入式系统文件显示_ 组 长: 罗平 学 号: 20151703021_ 同组姓名: 刘照、杜威、周玉辉、胡玉珍 专业班级: 网工15102 _ 指导教师: 丁德红_ 设计时间: 2017-06-12_ 评阅意见:评定成绩: 指导老师签名: 年 月 日1.前言本课程设计是学生学习完计算机操作系统课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。随着嵌入式技术的迅猛发展,人机交互界面也越来越显示出它的重要性。本次课程设计主要以TFTLC

2、D的LCD显示模块,完整的实现了图片的循环显示。TFT-LCD即薄膜晶体管液晶显示器。其英文全称为:Thin Film Transistor-Liquid Crystal Display。TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。目前,显示技术和显示工业的发展迅速。显示技术是传递视觉的信息技术。液晶显示器件LCD是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。它具有显示信息多、易于多彩化、体积小、重量轻、功

3、耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。2.课程设计内容2.1课程要求1、开发环境:Keilc5.0 ,阿波罗开发板2、开机的时候先检测字库,然后检测SD卡是否存在,如果SD卡存在,则开始查找SD卡根目录下的PICTURE文件夹,如果找到则显示该文件夹下面的图片文件(支持bmp、jpg、jpeg或gif格式),循环显示,通过按KEY0和KEY2可以快速浏览下一张和上一张,KEY_UP按键用于暂停/继续播放,DS1用于指示当前是否处于暂停状态。如果未找到PICTURE文件夹/任何图片文件,则提示错误。同样我们也是用DS0来指示程序正在运行。整体效果就是一个精简版的数码相框。3、

4、界面上有自己的学校、班级、姓名字样。2.2组员任务分工罗 平(18):代码修改、关键算法和主要函数实现的理解杜 威(02):PPT的制作、代码运行试验、相关知识简介胡玉珍(05):代码理解、组员任务分工、实现功能及操作简介刘 照(16):代码运行试验、实验结果及结果分析周玉辉(36):word文档制作、代码运行试验、相关知识简介3.背景 3.1图片格式简介图片有一般图片格式有许多种,一般常用的有四种,JEPG(或者说JPG),BMP格式的,这三种是静态图片,以及GIF格式的动态格式图。 下面简单介绍一下这三种图片格式。3.1.1BMP 图片格式BMP(全称 Bitmap)是 Window 操作

5、系统中的标准图像文件格式,文件后缀名为“ .bmp”, 使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此, BMP 文件所占用的空间很大,但是没有失真。BMP 文件的图像深度可选 lbit、 4bit、 8bit、 16bit、 24bit 及 32bit。 BMP 文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。典型的 BMP 图像文件由四部分组成: 1、位图头文件数据结构,它包含 BMP 图像文件的类型、显示内容等信息;2、位图信息数据结构,它包含有 BMP 图像的宽、高、压缩方法,以及定义颜色等信息;3、调色板,这个部分是可选的,有些位图需要调

6、色板,有些位图,比如真彩色图( 24位的 BMP)就不需要调色板; 4、位图数据,这部分的内容根据 BMP 位图使用的位数不同而不同,在 24 位图中直接使用 RGB,而其他的小于 24 位的使用调色板中颜色索引值。3.1.2JPEG文件格式JPEG 是 Joint Photographic Experts Group(联合图像专家组)的缩写,文件后辍名为 “ jpg”或“ jpeg”,是最常用的图像文件格式,由一个软件开发联合会组织制定, 同 BMP 格式不同, JPEG 是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤( BM

7、P 不会,但是 BMP 占用空间大)。比如可以把 1 37Mb 的 BMP 位图文件压缩至 20 3KB。当然也可以在图像质量和文件尺寸之间找到平衡点。 JPEG 格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持 24bit 真彩色,也普遍应用于需要连续色调的图像。JPEG/JPG 的解码过程可以简单的概述为如下几个部分:1、从文件头读出文件的相关信息。JPEG 文件数据分为文件头和图像数据两大部分,其中文件头记录了图像的版本、长宽、采样因子、量化表、哈夫曼表等重要信息。所以解码前必须将文件头信息读出,以备图像数据解码过程之用。2、从图像数据流读

8、取一个最小编码单元(MCU) ,并提取出里边的各个颜色分量单元。3、将颜色分量单元从数据流恢复成矩阵数据。使用文件头给出的哈夫曼表,对分割出来的颜色分量单元进行解码,把其恢复成 88 的数据矩阵。4、 88 的数据矩阵进一步解码。此部分解码工作以 88 的数据矩阵为单位, 其中包括相邻矩阵的直流系数差分解码、 使用文件头给出的量化表反量化数据、反 Zig- zag 编码、隔行正负纠正、反向离散余弦变换等 5 个步骤, 最终输出仍然是一个 88 的数据矩阵。5、颜色系统 YCrCb 向 RGB 转换。将一个MCU 的各个颜色分量单元解码结果整合起来,将图像颜色系统从YCrCb 向RGB 转换。6

9、、排列整合各个 MCU 的解码数据。不断读取数据流中的 MCU 并对其解码,直至读完所有 MCU 为止,将各 MCU 解码后的数据正确排列成完整的图像。本课程设计程采用 TjpgDec 作为 JPG/JPEG 的解码库。BMP 和 JPEG 这两种图片格式均不支持动态效果,而 GIF 则是可以支持动态效果。3.1.3GIF 图片格式GIF(Graphics Interchange Format)是 CompuServe 公司开发的图像文件存储格式, 1987年开发的 GIF 文件格式版本号是 GIF87a,1989 年进行了扩充,扩充后的版本号定义为 GIF89a。GIF 图像文件以数据块(b

10、lock)为单位来存储图像的相关信息。一个 GIF 文件由表示图形图像的数据块、数据子块以及显示图形图像的控制信息块组成,称为 GIF 数据流(DataStream)。数据流中的所有控制信息块和数据块都必须在文件头(Header)和文件结束块(Trailer)之间。GIF 文件格式采用了 LZW(Lempel-Ziv Walch)压缩算法来存储图像数据,定义了允许用户为图像设置背景的透明(transparency)属性。如果在 GIF 文件中存放有多幅图,它们可以像演幻灯片那样显示或者像动画那样演示。一个 GIF 文件的结构可分为文件头(File Header)、 GIF 数据流(GIF Da

11、ta Stream)和文件终结器(Trailer)三个部分。文件头包含 GIF 文件署名(Signature)和版本号(Version); GIF 数据流由控制标识符、图象块(Image Block)和其他的一些扩展块组成;文件终结器只有一个值为0x3B 的字符( ;)表示文件结束。4.流程设计4.1系统的结构框 STM324.1 系统结构框图4.2程序流程图设计图4.2 程序流程图5.硬件设计5.1硬件介绍开机的时候先检测字库,然后检测 SD 卡是否存在,如果 SD 卡存在,则开始查找 SD 卡根目录下的 PICTURE 文件夹,如果找到则显示该文件夹下面的图片文件( 支持 bmp、 jpg

12、、 jpeg 或 gif 格式) ,循环显示,通过按 KEY0 和 KEY2 可以快速浏览下一张和上一张, KEY_UP 按键用于暂停/继续播放, DS1 用于指示当前是否处于暂停状态。如果未找到 PICTURE 文件夹/任何图片文件,则提示错误。同样我们也是用 DS0 来指示程序正在运行。所要用到的硬件资源如下:1) 指示灯 DS0 和 DS12) KEY0、 KEY2 和 KEY_UP 三个按键3) 串口4) LCD 模块5) SD 卡6) SPI FLASH这几部分,在之前的实例中都介绍过了,我们在此就不介绍了。需要注意的是,我们在SD 卡根目录下要建一个 PICTURE 的文件夹,用来

13、存放 JPEG、 JPG、 BMP 或 GIF 等图片。5.2 芯片介绍STM32开发板主要采用STM32F103RBT6作为MCU,STM32F103的型号众多,我们选择这款的原因是看重其性价比,作为一款低端开发板,选择STM32F103RBT6是最佳的选择。128K FLASH、20K SRAM、2个SPI、3个串口、1个USB、1个CAN、2个12位的ADC、RTC、51个可用IO脚,这样的配置无论放到哪里都是很不错的了,更重要的是其价格,不到13元的批量价,足以秒杀很多其他芯片了,所以我们选择了它作为我们的主芯片。6.算法实现6.1功能函数首先在 HARDWARE 文件夹所在的文件夹下

14、新建一个 PICTURE 的文件夹。在该文件夹里面新建 bmp.c、 bmp.h、 tjpgd.c、 tjpgd.h、 integer.h、 gif.c、 gif.h、 piclib.c和 piclib.h 等 9 个文件。并将 PICTURE 文件夹加入头文件包含路径。其中 bmp.c 和 bmp.h 用于实现对 bmp 文件的解码;tjpgd.c 和 tjpgd.h 用于实现对 jpeg/jpg文件的解码; gif.c 和 gif.h 用于实现对 gif 文件的解码;这几个代码太长了,所以我们在这里不贴出来,请大家参考光盘本例程的源码piclib.c代码如下:_pic_info picin

15、fo; /图片信息_pic_phy pic_phy; /图片显示物理接口/lcd.h 没有提供划横线函数,需要自己实现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:起始坐标/width, height:宽度和高度。/*color:颜色数组void piclib_fill_color(u16 x,u16 y,u16 width,u16 heigh

16、t,u16 *color)u16 i,j;if(lcdltdc.pwidth!=0&lcddev.dir=0)/RGB 屏,且竖屏,则填充函数不可直接用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_Fill(x,y,x+width-1,y+height-1,color);/其他情况,直接填充/画图初

17、始化,在画图之前,必须先调用此函数/指定画点/读点void piclib_init(void)pic_phy.read_point=LCD_ReadPoint; /读点函数实现,仅 BMP 需要pic_phy.draw_point=LCD_Fast_DrawPoint; /画点函数实现pic_phy.fill=LCD_Fill; /填充函数实现,仅 GIF 需要pic_phy.draw_hline=piclib_draw_hline; /画线函数实现,仅 GIF 需要pic_phy.fillcolor=piclib_fill_color; /颜色填充函数实现,仅 TJPGD 需要picinfo

18、.lcdwidth=lcddev.width; /得到 LCD 的宽度像素picinfo.lcdheight=lcddev.height; /得到 LCD 的高度像素picinfo.ImgWidth=0; /初始化宽度为 0picinfo.ImgHeight=0; /初始化高度为 0picinfo.Div_Fac=0; /初始化缩放系数为 0picinfo.S_Height=0; /初始化设定的高度为 0picinfo.S_Width=0; /初始化设定的宽度为 0picinfo.S_XOFF=0; /初始化 x 轴的偏移量为 0picinfo.S_YOFF=0; /初始化 y 轴的偏移量为

19、0picinfo.staticx=0; /初始化当前显示到的 x 坐标为 0picinfo.staticy=0; /初始化当前显示到的 y 坐标为 0/快速 ALPHA BLENDING 算法./src:源颜色/dst:目标颜色/alpha:透明程度(032)/返回值:混合后的颜色.u16 piclib_alpha_blend(u16 src,u16 dst,u8 alpha)u32 src2;u32 dst2;/Convert to 32bit |-GGGGGG-RRRRR-BBBBB|src2=(src16)|src)&0x07E0F81F;dst2=(dst5)+src2)&0x07E0

20、F81F;return (dst216)|dst2;/初始化智能画点/内部调用void ai_draw_init(void)float temp,temp1; temp=(float)picinfo.S_Width/picinfo.ImgWidth;temp1=(float)picinfo.S_Height/picinfo.ImgHeight;ALIENTEK 阿波罗 STM32F429 开发板教程673STM32F429 开发指南(寄存器版)if(temp1)temp1=1; /使图片处于所给区域的中间picinfo.S_XOFF+=(picinfo.S_Width-temp1*picinf

21、o.ImgWidth)/2;picinfo.S_YOFF+=(picinfo.S_Height-temp1*picinfo.ImgHeight)/2;temp1*=8192;/扩大 8192 倍picinfo.Div_Fac=temp1;picinfo.staticx=0xffff;picinfo.staticy=0xffff;/放到一个不可能的值上面/判断这个像素是否可以显示/(x,y) :像素原始坐标/chg :功能变量./返回值:0,不需要显示.1,需要显示u8 is_element_ok(u16 x,u16 y,u8 chg) if(x!=picinfo.staticx|y!=pici

22、nfo.staticy)if(chg=1) picinfo.staticx=x; picinfo.staticy=y; return 1;else return 0;/智能画图/FileName:要显示的图片文件 BMP/JPG/JPEG/GIF/x,y,width,height:坐标及显示区域尺寸/fast:使能 jpeg/jpg 小图片(图片尺寸小于等于液晶分辨率)快速解码,0,不使能;1,使能./图片在开始和结束的坐标点范围内显示u8 ai_load_picfile(const u8 *filename,u16 x,u16 y,u16 width,u16 height,u8 fast)u

23、8 res;/返回值u8 temp;if(x+width)picinfo.lcdwidth)return PIC_WINDOW_ERR; /x 坐标超范围了.if(y+height)picinfo.lcdheight)return PIC_WINDOW_ERR; /y 坐标超范围了./得到显示方框大小 if(width=0|height=0)return PIC_WINDOW_ERR; /窗口设定错误picinfo.S_Height=height;picinfo.S_Width=width;/显示区域无效if(picinfo.S_Height=0|picinfo.S_Width=0)picin

24、fo.S_Height=lcddev.height;picinfo.S_Width=lcddev.width;return FALSE;if(pic_phy.fillcolor=NULL)fast=0;/颜色填充函数未实现,不能快速显示/显示的开始坐标点picinfo.S_YOFF=y;picinfo.S_XOFF=x;/文件名传递temp=f_typetell(u8*)filename); /得到文件的类型switch(temp) case T_BMP:res=stdbmp_decode(filename); break; /解码 bmpcase T_JPG:case T_JPEG: res

25、=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;/动态分配内存void *pic_memalloc (u32 size)return (void*)mymalloc(SRAMIN,size);/释放内存void pic_memfree (void* mf)myfree(SRAMIN,mf);此段代码总共

26、9 个函数,其中, piclib_draw_hline 和 piclib_fill_color 函数因为 LCD 驱动,代码没有提供,所以在这里单独实现,如果 LCD 驱动代码有提供,则直接用 LCD 提供的即可。piclib_init 函数,该函数用于初始化图片解码的相关信息,其中_pic_phy 是我们在piclib.h 里面定义的一个结构体,用于管理底层 LCD 接口函数,这些函数必须由用户在外部实现。 _pic_info 则是另外一个结构体,用于图片缩放处理。piclib_alpha_blend 函数, 该函数用于实现半透明效果,在小格式( 图片分辨率小于 LCD分辨率) bmp 解码

27、的时候,可能被用到。ai_draw_init 函数,该函数用于实现图片在显示区域的居中显示初始化,其实is_element_ok 函数,该函数用于判断一个点是不是应该显示出来,在图片缩放的时候该函数是必须用到的。ai_load_picfile 函数,该函数是整个图片显示的对外接口,外部程序,通过调用该函数,可以实现 bmp、 jpg/jpeg 和 gif 的显示,该函数根据输入文件的后缀名,判断文件格式,然后交给相应的解码程序( bmp 解码/jpeg 解码/gif 解码),执行解码,完成图片显示。注意,这里我们用到一个 f_typetell 的函数,来判断文件的后缀名, f_typetell

28、 函数在 exfuns.c 里面实现,最后, pic_memalloc 和 pic_memfree 分别用于图片解码时需要用到的内存申请和释放,通过调用 mymalloc 和 myfreee 来实现。保存 piclib.c,然后在工程里面新建一个 PICTURE 的分组,将 bmp.c、 gif.c、 tjpgd.c 和piclib.c 等 4 个 c 文件加入到 PICTURE 分组下。然后打开 piclib.h,在该文件输入如下代码:#ifndef _PICLIB_H#define _PICLIB_H #include sys.h#include lcd.h#include malloc.

29、h#include ff.h#include exfuns.h#include bmp.h#include tjpgd.h#include gif.h#define PIC_FORMAT_ERR 0x27 /格式错误#define PIC_SIZE_ERR 0x28 /图片尺寸错误#define PIC_WINDOW_ERR 0x29 /窗口设定错误#define PIC_MEM_ERR 0x11 /内存错误#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif/图片显示物理层接口/在移植的时候,必须由用户自己实现这几个函数typedef structu16(*read_point)(u16,u16);/u16 read_point(u16 x,u16 y)读点函数void(*draw_point)(u16,u16,u16);/void draw_point(u16 x,u16 y,u16 color)画点函数void(*fill)(u16,u16,u16,u16,u16);/void fill(u

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2