基于ARM的图像显示系统设计优秀论文.docx

上传人:b****6 文档编号:6384571 上传时间:2023-01-05 格式:DOCX 页数:17 大小:457.27KB
下载 相关 举报
基于ARM的图像显示系统设计优秀论文.docx_第1页
第1页 / 共17页
基于ARM的图像显示系统设计优秀论文.docx_第2页
第2页 / 共17页
基于ARM的图像显示系统设计优秀论文.docx_第3页
第3页 / 共17页
基于ARM的图像显示系统设计优秀论文.docx_第4页
第4页 / 共17页
基于ARM的图像显示系统设计优秀论文.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

基于ARM的图像显示系统设计优秀论文.docx

《基于ARM的图像显示系统设计优秀论文.docx》由会员分享,可在线阅读,更多相关《基于ARM的图像显示系统设计优秀论文.docx(17页珍藏版)》请在冰豆网上搜索。

基于ARM的图像显示系统设计优秀论文.docx

基于ARM的图像显示系统设计优秀论文

摘要

随着社会经济的迅速发展,如今图片显示系统应用于各个领域中。

LCD显示屏的技术和产业都取得了长足的发展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。

基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。

图片显示系统主要由STM32芯片作为LCD彩色显示屏的主要核心控制器,通电后,初始化状态可显示本次课程设计题目及成员等基本信息,可人为操作对显示信息的汉字进行自定义大小颜色及字体等等;把要显示的图片实现拷入内存卡里,更新内存卡,即图片可进行变换;自定义定时跳转下一幅图片,也可以通过按键快速跳到下一幅图片,或返回上一张图片。

本系统是利用STM32开发板配合SD卡实现将已存入SD卡中的图片循环的显示在LCD彩色显示屏上。

关键词:

STM32;LCD液晶显示屏;图片显示

目录

1引言1

2总体设计2

2.1图片显示的基本原理2

2.2图片显示设计分析2

2.3系统的结构框图3

3详细设计4

3.1硬件设计4

3.1.1芯片介绍4

3.1.2功能简介4

3.2软件设计7

3.2.1主函数部分8

3.2.2硬件部分程序9

3.2.3识别图片11

3.2.4FAT系统14

3.2.5程序流程图15

4实验结果及分析16

4.1硬件实验结果16

4.2结果分析16

5结论17

参考文献18

1引言

随着嵌入式技术的迅猛发展,人机交互界面也越来越显示出它的重要性。

本次课程设计主要以TFTLCD的LCD显示模块,完整的实现了图片的循环显示。

TFT-LCD即薄膜晶体管液晶显示器。

其英文全称为:

ThinFilmTransistor-LiquidCrystalDisplay。

TFT-LCD与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个象素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。

BMP是一种与硬件设备无关的图像文件格式,使用非常广。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

而且JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别。

目前,显示技术和显示工业的发展迅速。

显示技术是传递视觉的信息技术。

液晶显示器件LCD是当今最有发展前途的一种平板显示器件,它具有很多独到的优异特性。

它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。

2总体设计

2.1图片显示的基本原理

BMP是一种与硬件设备无关的图像文件格式,使用非常广。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选lbit、4bit、8bit、16bit、24bit及32bit。

BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。

典型的BMP图像文件由三部分组成:

位图文件头数据结构,它包含BMP图像文件的类型、显示内容等信息;位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息。

JPEG是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丢失,因此容易造成图像数据的损伤。

尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。

但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。

而且JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:

1到40:

1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。

当然也可以在图像质量和文件尺寸之间找到平衡点。

JPEG格式压缩的主要是高频信息,对色彩的信息保留较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。

2.2图片显示设计分析

针对要实现的功能,采用STM32开发板进行设计,它是一款迷你型的开发板,小巧而不小气,简约而不简单。

这样,既能做到经济合理又能实现预期的功能。

在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。

该程序将实现浏览PICTURE文件夹下的所有图片及其名字,配合SD卡能够实现顺序显示出每一副图片,并每隔3s左右切换一幅图片。

具体要实现的目标如下:

1.更新内存卡,即图片可进行变换;

2.定时自动跳转下一幅图片;

3.可以通过按键快速跳到下一幅图片;

4.可以通过按键返回到上一幅图片;

5.初始状态显示本次课设的基本信息;

6.可对显示信息的汉字进行自定义;

2.3系统的结构框图

STM32

 

2.1系统结构框图

3详细设计

3.1硬件设计

3.1.1芯片介绍

STM32开发板主要采用STM32F103RBT6作为MCU,STM32F103的型号众多,我们选择这款的原因是看重其性价比,作为一款低端开发板,选择STM32F103RBT6是最佳的选择。

128KFLASH、20KSRAM、2个SPI、3个串口、1个USB、1个CAN、2个12位的ADC、RTC、51个可用IO脚…,这样的配置无论放到哪里都是很不错的了,更重要的是其价格,不到13元的批量价,足以秒杀很多其他芯片了,所以我们选择了它作为我们的主芯片。

3.1.2功能简介

开机的时候先检测SD卡是否存在,然后初始化FAT文件系统,在这之后开始查找根目录下的PICTURE文件夹,如果找到则显示该文件夹下面的图片,循环显示,通过按KEY0和KEY1可以快速浏览下一张和上一张。

如果未找到图片文件夹/图片,则提示错误。

同样我们也是用LED0来指示程序正在运行。

所要用到的硬件资源如下:

1)STM32。

2)外部LED0。

3)TFTLCD液晶模块。

4)KEY0,KEY1。

5)SD卡。

 

1、STM32的简单介绍

图3.1STM32原理图

选择STM32F103RBT6作为MCU,原因是其性价比高,128KFLASH、20KSRAM、2个SPI、3个串口、1个USB、1个CAN、2个12位的ADC、RTC、51个可用IO脚…,所以我们选择了它作为我们的主芯片。

2、外部LED0

图3.2外部LED0原理图

其中PWR是系统电源指示灯,为蓝色。

LED0和LED1分别接在PA8和PD2上,PA8还可以通过TIM1的通道1的PWM输出来控制DS0的亮度。

3、TFTLCD液晶模块

图3.3TFTLCD液晶显示原理图

TFT_LCD是一个通用的液晶模块接口。

OLED是一个给OLED显示模块供电的接口,它和TFT_LCD拼接在一起。

当使用2.4’/2.8’的LCD时,我们接到TFT_LCD上就可以了,而当我们使用ALIENTEK的OLED模块时,则接OLED排阵做电源,同时会连接到TFT_LCD上的部分管脚,从而实现OLED与MCU的连接。

4、按键

图3.4按键输入原理图

KEY0和KEY1用作普通按键输入,分别连接在PA13和PA15上,他们都连接在了JTAG相关的引脚上(KEY0还连接在SWDIO上),KEY0和KEY1还和PS/2的DAT和CLK线共用,他们都通过JTAG的上拉电阻来提供上拉。

WK_UP按键连接到PA0(STM32的WKUP引脚),它除了可以用作普通输入按键外,还可以用作STM32的唤醒输入。

这个按键是高电平触发的。

5、SD卡

图3.5SD卡部分原理图

插入SD卡可以外扩大容量存储设备,可以用来记录数据。

SD卡我们使用的是SPI模式通信,SD卡的SPI接口连接到STM32的SPI1上,SD_CS接在PA3上。

3.2软件设计

图片显示系统需要有STM32开发板配合SD卡使用,因此其程序需要分为以下几个文件夹,硬件组成文件HARDWARE系统文,可以用来显示汉字的TEXT文件,用来识别图片的JPEG文件用来读取SD卡上的图片文件的FAT文件以及存放主程序文件USER文件件,和STM32的系统文件SYSFILE。

解码是通过AI_LoadPicFile函数来实现的,在该函数里面,会先判断文件的类型,来调用不同的解码函数,解码JPEG由Decode实现,而解码BMP则由BmpDecode函数实现。

AI_LoadPicFile函数会将图片以合适的大小显示在液晶上(总是不会超过你给定的区域),对比输入尺寸大的图片,会自动压缩。

解码图片完成后返回解码是否成功的信息。

保存jpegdecode.c,并在工程中新建一个JPEG的组,把jpegdecode.c加入该组下。

SysInfoGet函数用于查找各种系统文件/文件夹以及自定义的文件/文件夹等。

3.2.1主函数部分

intmain(void)

{

u8i;u8key;

FileInfoStruct*FileInfo;

u16pic_cnt=0;u16index=0;u16time=0;

Stm32_Clock_Init(9);

delay_init(72);uart_init(72,9600);

LCD_Init();KEY_Init();LED_Init();

SPI_Flash_Init();

if(Font_Init())

{POINT_COLOR=RED;

LCD_ShowString(60,50,"MiniSTM32");

LCD_ShowString(60,70,"FontERROR");

while

(1);}

POINT_COLOR=BLACK;

Show_Str(60,50,"嵌入式课程设计",16,0);

Show_Str(50,70,"张政张焱刘佳萍",16,0);

Show_Str(60,90,"图片显示系统",16,0);

Show_Str(60,110,"2015年7月9日",16,0);

SD_Initialize();

while(FAT_Init())

{Show_Str(60,130,"文件系统错误!

",16,0);

i=SD_Initialize();

if(i)Show_Str(60,150,"SD卡错误!

",16,0);

delay_ms(500);

LCD_Fill(60,130,240,170,WHITE);

delay_ms(500);

LED0=!

LED0;}

while(SysInfoGet

(1))

{Show_Str(60,130,"图片文件夹未找到!

",16,0);

delay_ms(500);

FAT_Init();

SD_Initialize();

LED0=!

LED0;

LCD_Fill(60,130,240,170,WHITE);

delay_ms(500);}

Show_Str(60,130,"开始显示...",16,0);

delay_ms(1000);

Cur_Dir_Cluster=PICCLUSTER;

while

(1)

{pic_cnt=0;

Get_File_Info(Cur_Dir_Cluster,FileInfo,T_JPEG|T_JPG|T_BMP,&pic_cnt);

if(pic_cnt==0)

{LCD_Clear(WHITE);

while

(1)

{if(time%2==0)Show_Str(32,150,"没有图片请先COPY图片到SD卡的

PICTURE文件夹,然后重启!

",16,0);

elseLCD_Clear(WHITE);

time++;delay_ms(300);}}

FileInfo=&F_Info[0];index=1;

while

(1)

{Get_File_Info(Cur_Dir_Cluster,FileInfo,T_JPEG|T_JPG|T_BMP,&index);

LCD_Clear(WHITE);

AI_LoadPicFile(FileInfo,0,0,240,320);

POINT_COLOR=RED;

Show_Str(0,0,FileInfo->F_Name,16,1);

while

(1)

{key=KEY_Scan();if(key==1)break;

elseif(key==2)

{if(index>1)index-=2;

elseindex=pic_cnt-1;

break;}

delay_ms

(1);time++;

if(time%100==0)LED0=!

LED0;

if(time>3000)

{time=0;break;}}

index++;

if(index>pic_cnt)index=1;}}}

3.2.2硬件部分程序

voidKEY_Init(void)//键盘相应程序

{RCC->APB2ENR|=1<<2;

GPIOA->CRL&=0XFFFFFFF0;

GPIOA->CRL|=0X00000008;

GPIOA->CRH&=0X0F0FFFFF;

GPIOA->CRH|=0X80800000;

GPIOA->ODR|=1<<13;

GPIOA->ODR|=1<<15;}

u8KEY_Scan(void)

{staticu8key_up=1;

JTAG_Set(JTAG_SWD_DISABLE);

if(key_up&&(KEY0==0||KEY1==0||KEY2==1))

{delay_ms(10);key_up=0;

if(KEY0==0)

{JTAG_Set(SWD_ENABLE);return1;}

elseif(KEY1==0)

{JTAG_Set(SWD_ENABLE);return2;}

elseif(KEY2==1)

{JTAG_Set(SWD_ENABLE);return3;}}

elseif(KEY0==1&&KEY1==1&&KEY2==0)key_up=1;

JTAG_Set(SWD_ENABLE);return0;}

voidLED_Init(void)//led相应程序

{RCC->APB2ENR|=1<<2;

RCC->APB2ENR|=1<<5;

GPIOA->CRH&=0XFFFFFFF0;

GPIOA->CRH|=0X00000003;

GPIOA->ODR|=1<<8;

GPIOD->CRL&=0XFFFFF0FF;

GPIOD->CRL|=0X00000300;

GPIOD->ODR|=1<<2;}

voidSPIx_Init(void)//SD卡驱动程序

{RCC->APB2ENR|=1<<2;

RCC->APB2ENR|=1<<12;

GPIOA->CRL&=0X000FFFFF;

GPIOA->CRL|=0XBBB00000;

GPIOA->ODR|=0X7<<5;

SPI1->CR1|=0<<10;SPI1->CR1|=1<<9;

SPI1->CR1|=1<<8;SPI1->CR1|=1<<2;

SPI1->CR1|=0<<11;SPI1->CR1|=1<<1;

SPI1->CR1|=1<<0;SPI1->CR1|=7<<3;

SPI1->CR1|=0<<7;SPI1->CR1|=1<<6;

SPIx_ReadWriteByte(0xff);}

voidSPIx_SetSpeed(u8SpeedSet)

{SPI1->CR1&=0XFFC7;

switch(SpeedSet)

{caseSPI_SPEED_2:

SPI1->CR1|=0<<3;break;

caseSPI_SPEED_4:

SPI1->CR1|=1<<3;break;

caseSPI_SPEED_8:

SPI1->CR1|=2<<3;break;

caseSPI_SPEED_16:

SPI1->CR1|=3<<3;break;

caseSPI_SPEED_256:

SPI1->CR1|=7<<3;break;}

SPI1->CR1|=1<<6;}

u8SPIx_ReadWriteByte(u8TxData)

{u8retry=0;

while((SPI1->SR&1<<1)==0)

{retry++;if(retry>200)return0;}

SPI1->DR=TxData;retry=0;

while((SPI1->SR&1<<0)==0)

{retry++;

if(retry>200)return0;}

returnSPI1->DR;}

3.2.3识别图片

FileInfoStruct*CurFile;//当前解码/操作的文件

voidAI_Drow_Init(void)

{floattemp,temp1;

temp=(float)PICINFO.S_Width/PICINFO.ImgWidth;

temp1=(float)PICINFO.S_Height/PICINFO.ImgHeight;

if(temp

if(temp1>1)temp1=1;//使图片处于所给区域的中间

PICINFO.S_XOFF+=(PICINFO.S_Width-temp1*PICINFO.ImgWidth)/2;

PICINFO.S_YOFF+=(PICINFO.S_Height-temp1*PICINFO.ImgHeight)/2;

temp1*=10000;//扩大10000倍

PICINFO.Div_Fac=temp1;

PICINFO.staticx=500;

PICINFO.staticy=500;//放到一个不可能的值上面

}//初始化量化表,全部清零

voidInitTable(void)

{shorti,j;sizei=sizej=0;

PICINFO.ImgWidth=PICINFO.ImgHeight=0;

rrun=vvalue=0;BitPos=0;CurByte=0;

IntervalFlag=FALSE;restart=0;

for(i=0;i<3;i++)//量化表

for(j=0;j<64;j++)qt_table[i][j]=0;

comp_num=0;HufTabIndex=0;}

//将解出的字按RGB形式存储

voidStoreBuffer(void)

{shorti=0,j=0;

unsignedcharR,G,B;

inty,u,v,rr,gg,bb;

u16color;u16realx=sizej;u16realy=0;

for(i=0;i

{if((sizei+i)

{realy=PICINFO.Div_Fac*(sizei+i)/10000;

if(!

IsElementOk(realx,realy,0))continue;

for(j=0;j

{if((sizej+j)

{realx=PICINFO.Div_Fac*(sizej+j)/10000;

if(!

IsElementOk(realx,realy,1))continue;

y=Y[i*8*SampRate_Y_H+j];

u=U[(i/V_YtoU)*8*SampRate_Y_H+j/H_YtoU];

v=V[(i/V_YtoV)*8*SampRate_Y_H+j/H_YtoV];

rr=((y<<8)+18*u+367*v)>>8;

gg=((y<<8)-159*u-220*v)>>8;

bb=((y<<8)+411*u-29*v)>>8;

R=(unsignedchar)rr;

G=(unsignedchar)gg;

B=(unsignedchar)bb;

if(rr&0xffffff00)if(rr>255)R=255;elseif(rr<0)R=0;

if(gg&0xffffff00)if(gg>255)G=255;elseif(gg<0)G=0;

if(bb&0xffffff00)if(bb>255)B=255;elseif(bb<0)B=0;

color=R>>3;color=color<<6;color|=(G>>2);

color=color<<5;color|=(B>>3);

POINT_COLOR=color;

LCD_DrawPoint(realx+PICINFO.S_XOFF,realy+PICINFO.S_YOFF);}

elsebreak;}}

elsebreak;}}

voidIQtIZzMCUComponent(shortflag)

{shortH,VV;shorti,j;

short*pQtZzMCUBuffer;short*pMCUBuffer;

switch(flag){

case0:

H=SampRate_Y_H;

VV=SampRate_Y_V;

pMCUBuffer=MCUBuffer;

pQtZzMCUBuffer=QtZzMCUBuffer;break;

case1:

H=SampRate_U

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1