基于STM32的图像显示系统_第1页
基于STM32的图像显示系统_第2页
基于STM32的图像显示系统_第3页
基于STM32的图像显示系统_第4页
基于STM32的图像显示系统_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要本文介绍了基于STM32的图片显示系统设计。现如今LCD显示屏的技术和产业都取得了长足的开展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。通电后,复位到初始化状态可显示本次课程设计题目及成员等根本信息,可人为操作对显示信息的汉字进行自定义大小颜色及字体等等;把要显示的图片考入内存卡里,更新内存卡,即图片可进行变换;自定义定时跳转下一幅图片,也可以通过按键快速跳到下一幅图片,或返回上一张图片。利用TFT-LCD液晶显示屏显示的图片清晰、分辨率高,显示图片的效果极好。关键词:STM32;LCD显示屏;图片显示目录1引言 12总体设计 22.1图片显示的根本原理 22.2图片显示设计分析 22.3系统的结构框图 33详细设计 43.1硬件设计43.1.1ALIENTEKMiniSTM32开发板简介43.1.2功能简介43.2软件设计 73.2.1主函数局部83.2.2硬件局部程序93.2.3识别图片113.2.4FAT系统143.2.5程序流程图154实验结果及分析 164.1硬件实验结果164.2结果分析165结论17参考文献 181引言进入新世纪LCD显示屏的技术和产业都取得了长足的开展,作为重要的现代信息发布媒体之一,LCD显示屏在证券交易、金融、交通、体育、广告等领域被广泛的应用。伴随社会信息化进程的推进,LCD显示屏技术也在不断的推陈出新,应用领域愈加广阔。基于STM32的LCD显示可以更好的满足各种需求,也更便于操作和实现。现基于STM32在液晶显示屏幕上显示文本及图形。目前,显示技术和显示工业的开展迅速。显示技术是传递视觉的信息技术。液晶显示器件LCD是当今最有开展前途的一种平板显示器件,它具有很多独到的优异特性。它具有显示信息多、易于多彩化、体积小、重量轻、功耗低、寿命长、价格低、无辐射、无污染、接口控制方便等优点。BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。而且JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别。2总体设计2.1图片显示的根本原理BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit、16bit、24bit及32bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。JPEG是最常用的图像文件格式,由一个软件开发联合会组织制定,是一种有损压缩格式,能够将图像压缩在很小的储存空间,图像中重复或不重要的资料会被丧失,因此容易造成图像数据的损伤。尤其是使用过高的压缩比例,将使最终解压缩后恢复的图像质量明显降低,如果追求高品质图像,不宜采用过高压缩比例。但是JPEG压缩技术十分先进,它用有损压缩方式去除冗余的图像数据,在获得极高的压缩率的同时能展现十分丰富生动的图像,换句话说,就是可以用最少的磁盘空间得到较好的图像品质。而且JPEG是一种很灵活的格式,具有调节图像质量的功能,允许用不同的压缩比例对文件进行压缩,支持多种压缩级别,压缩比率通常在10:1到40:1之间,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。当然也可以在图像质量和文件尺寸之间找到平衡点。JPEG格式压缩的主要是高频信息,对色彩的信息保存较好,适合应用于互联网,可减少图像的传输时间,可以支持24bit真彩色,也普遍应用于需要连续色调的图像。2.2图片显示设计分析在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。该程序将实现浏览PICTURE文件夹下的所有图片及其名字,配合SD卡能够实现顺序显示出每一副图片,并每隔3s左右切换一幅图片。具体要实现的目标有:更新内存卡,即图片可进行变换;定时自动跳转下一幅图片;可以通过按键快速跳到下一幅图片;可以通过按键返回到上一幅图片;初始状态显示本次课设的根本信息;可对显示信息的汉字进行自定义。2.3系统的结构框图存储图像存储图像SD卡键盘按键LED提示灯TFTLCDSTM322.1系统结构框图3详细设计3.1硬件设计3.1.1ALIENTEKMiniSTM32开发板简介ALIENTEKMiniSTM32开发板是一款迷你型的开发板,小巧而不小气,简约而不简单。它的外观尺寸只有8cm*10cm大小,板子的设计充分考虑了本钱与功能这两个矛盾面,再结合实际使用的经验及STM32的特点,可有可无的选择性价比最高的留下,最终确定了这样的设计。其资源丰富,设计灵活。特点包括:1〕小巧。整个板子尺寸为8cm*10cm*2cm。2〕灵活。板上除晶振外的所有的IO口全部引出,特别还有GPIOA和GPIOB的IO口是按顺序引出的,可以极大的方便大家扩展及使用,另外板载独特的一键下载功能,防止了频繁设置B0、B1带来的麻烦,直接在电脑上一键下载。3〕资源丰富。板载十多种外设及接口,可以充分挖掘STM32的潜质。4〕质量过硬。沉金PCB+全新优质元器件+定制全铜镀金排针/排座+电源TVS保护,坚假设磐石。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。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); } while(SysInfoGet(1)) {FAT_Init();SD_Initialize();LED0=!LED0; LCD_Fill(60,130,240,170,WHITE); delay_ms(500);} 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) 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<temp1)temp1=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<SampRate_Y_V*8;i++){if((sizei+i)<PICINFO.ImgHeight){realy=PICINFO.Div_Fac*(sizei+i)/10000;if(!IsElementOk(realx,realy,0))continue;for(j=0;j<SampRate_Y_H*8;j++){if((sizej+j)<PICINFO.ImgWidth){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_H;VV=SampRate_U_V;pMCUBuffer=MCUBuffer+Y_in_MCU*64;pQtZzMCUBuffer=QtZzMCUBuffer+Y_in_MCU*64;break; case2:H=SampRate_V_H;VV=SampRate_V_V;pMCUBuffer=MCUBuffer+(Y_in_MCU+U_in_MCU)*64;pQtZzMCUBuffer=QtZzMCUBuffer+(Y_in_MCU+U_in_MCU)*64;break;} for(i=0;i<VV;i++)for(j=0;j<H;j++)IQtIZzBlock(pMCUBuffer+(i*H+j)*64,pQtZzMCUBuffer+(i*H+j)*64,flag);}3.2.4FAT系统DWORDFirstDirClust;DWORDFirstDataSector; WORDBytesPerSector;DWORDFATsectors; WORDSectorsPerClust; DWORDFirstFATSector; DWORDFirstDirSector; fat32DWORDRootDirSectors; DWORDRootDirCount;BYTEFAT32_Enable;DWORDCur_Dir_Cluster;FAT_TABLEFAT_TAB; FileInfoStructF_Info[3];u8fat_buffer[512];u8LongNameBuffer[MAX_LONG_NAME_SIZE];BOOLLongNameFlag=0;constunsignedchar*filetype[23]={"MP1","MP2","MP3","MP4","M4A","3GP","3G2","OGG","ACC","WMA","WAV","MID","FLA","LRC","TXT","C","H","","FON","SYS","BMP","JPG","JPE"};3.2.5程序流程图YN系统初始化系统初始化插入SD卡结束否读取数据在LCD上显示图片及信息跳到上一幅或下一幅图片3s后自动跳转到下一幅有键按下?开始图3.6程序流程图4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论