FATFs SD卡底层程序之图片显示.docx

上传人:b****9 文档编号:25106753 上传时间:2023-06-05 格式:DOCX 页数:11 大小:16.51KB
下载 相关 举报
FATFs SD卡底层程序之图片显示.docx_第1页
第1页 / 共11页
FATFs SD卡底层程序之图片显示.docx_第2页
第2页 / 共11页
FATFs SD卡底层程序之图片显示.docx_第3页
第3页 / 共11页
FATFs SD卡底层程序之图片显示.docx_第4页
第4页 / 共11页
FATFs SD卡底层程序之图片显示.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

FATFs SD卡底层程序之图片显示.docx

《FATFs SD卡底层程序之图片显示.docx》由会员分享,可在线阅读,更多相关《FATFs SD卡底层程序之图片显示.docx(11页珍藏版)》请在冰豆网上搜索。

FATFs SD卡底层程序之图片显示.docx

FATFsSD卡底层程序之图片显示

FATFsSD卡底层程序之图片显示

硬件环境:

DAXIA32学习板STM32F103VC72MHz

编程环境:

MDK3.80a

主程序:

//***********************************************************************************

//*函数名称:

MAIN

//*功能:

从SD卡读BMP图片并显示

//*编写:

Bunagi

//*修改:

2010/9/4

//***********************************************************************************

intmain(void)

{

FATFSfs;

DIRdir;

FILfil;

FILINFOfno;

FRESULTres;

charBuf[512];

u8i;

charFilSearchCount[10][13];//文件名检索存放

ChipHalInit();

ChipOutHalInit();

Lcd_Init();

TFT_X=0;

TFT_Y=0;

BG_COLOR=WHITE;

TFTFill(WHITE);

SysTickDelay(1000);

TFTShowString16(TFT_X,TFT_Y,"图片显示测试",RED);

while(!

GET_DOWN());

TFT_X=0;

TFT_Y=0;

TFTFill(BLACK);

//************************************************

f_mount(0,&fs);

if(!

FilSearch(&fs,&dir,"","BMP",FilSearchCount))

{

TFTShowString16(TFT_X,TFT_Y,"检索目录失败!

",RED);

while

(1);

}

else

{

for(i=0;i<10;i++)

{

if(FilSearchCount[i][0]!

=0)

{

TFTShowString16(TFT_X,TFT_Y,&FilSearchCount[i][0],RED);TFT_Y+=16;

}

}

}

for(;;)

{

for(i=0;i<10;i++)

{

if(FilSearchCount[i][0]!

=0)

if(!

BMPDisp(&fil,&dir,&fno,&FilSearchCount[i][0],&Buf,239,319))TFTShowString16(TFT_X,TFT_Y,"打开图片失败!

",RED);

while(!

GET_DOWN());

}

TFT_X=0;

TFT_Y=0;

TFTShowString16(TFT_X,TFT_Y,"图片已播放结束!

",RED);

while(!

GET_UP());

}

while

(1);

}

//***********************************************************************************

//*函数名称:

NameCompare

//*功能:

字符串比较比较0X2E前的字符(文件名比较)

//*输入参数:

str1,str2

//*输出参数:

TRUE两字符串相同FALSE两字符串不同

//*编写:

Bunagi

//*修改:

2010/9/4

//***********************************************************************************

boolNameCompare(u8*str1,u8*str2)

{

u8i=13;

u8flag;

while(--i)

{

if(str1[i]==0x2e)flag=i;

}

for(i=0;i

{

if(str1[i]!

=str2[i])returnFALSE;

}

returnTRUE;

}

//***********************************************************************************

//*函数名称:

BMPInfoLoad

//*功能:

读SD卡里BMP文件的头512字节数据,并填充进BMP信息数据结构里

//*输入参数:

bfinfo

//*binfo

//*Buf

//*输出参数:

//*编写:

Bunagi

//*修改:

2010/9/4

//***********************************************************************************

voidBMPInfoLoad(BMPFILINFO*bfinfo,BMPINFO*binfo,u8*Buf)

{

//填充BMPFIL信息

bfinfo->wBFIType=(Buf[0]<<8)+Buf[1];

bfinfo->dwBFISize=(Buf[5]<<24)+(Buf[4]<<16)+(Buf[3]<<8)+Buf[2];bfinfo->dwBFIReserved=0x00;

bfinfo->dwBFIStartAdd=(Buf[13]<<24)+(Buf[12]<<16)+(Buf[11]<<8)+Buf[10];

//填充BMP信息

binfo->dwBISize=(Buf[17]<<24)+(Buf[16]<<16)+(Buf[15]<<8)+Buf[14];

binfo->dwBIWidth=(Buf[21]<<24)+(Buf[20]<<16)+(Buf[19]<<8)+Buf[18];

binfo->dwBIHeight=(Buf[25]<<24)+(Buf[24]<<16)+(Buf[23]<<8)+Buf[22];

binfo->wBIPlanes=0x01;

binfo->wBIBitCount=(Buf[29]<<8)+Buf[28];

binfo->dwBICompression=(Buf[33]<<24)+(Buf[32]<<16)+(Buf[31]<<8)+Buf[30];

binfo->dwBISizeImage=(Buf[37]<<24)+(Buf[36]<<16)+(Buf[35]<<8)+Buf[34];

binfo->dwBIXPelsPerMeter=(Buf[41]<<24)+(Buf[40]<<16)+(Buf[39]<<8)+Buf[38];

binfo->dwBIYPelsPerMeter=(Buf[45]<<24)+(Buf[44]<<16)+(Buf[43]<<8)+Buf[42];

binfo->dwBIClrUsed=(Buf[49]<<24)+(Buf[48]<<16)+(Buf[47]<<8)+Buf[46];

binfo->dwBIClrImportant=(Buf[53]<<24)+(Buf[52]<<16)+(Buf[51]<<8)+Buf[50];

}

//***********************************************************************************

//*函数名称:

BMPDisp

//*功能:

在指定坐标点位置显示图片(图片大小依据LCD屏开始及结束坐标确定

//*输入参数:

//*输出参数:

//*编写:

Bunagi

//*修改:

2010/9/4

//***********************************************************************************

boolBMPDisp(FIL*fil,DIR*dir,FILINFO*fno,u8*FilSearch,u8*Buf,LOC_Xtft_end_x,LOC_Ytft_end_y)

{

u8color_byte,rgb;

inttft_x,tft_y;

u16count,color,tft_start_x,tft_start_y;

UINTlen;

BMPFILINFObfinfo;

BMPINFObinfo;

FRESULTres;

tft_x=tft_end_x;

tft_y=tft_end_y;

rgb=0;

res=f_opendir(dir,"");

//查找指定文件名的文件

while

(1)

{

res=f_readdir(dir,fno);

if(res!

=FR_OK)returnFALSE;

if(NameCompare(fno->fname,FilSearch))break;

elseif(fno->fname[0]==0)returnFALSE;

}

res=f_open(fil,fno->fname,FA_OPEN_EXISTING|FA_READ);

if(res!

=FR_OK)returnFALSE;

res=f_read(fil,Buf,BMPBufSize,&len);

if(res!

=FR_OK)returnFALSE;

BMPInfoLoad(&bfinfo,&binfo,Buf);

tft_start_x=tft_end_x-(u16)(binfo.dwBIWidth-1);

tft_start_y=tft_end_y-(u16)(binfo.dwBIHeight-1);

rgb=0;

count=bfinfo.dwBFIStartAdd;//当前象素数据地址指针color_byte=binfo.wBIBitCount>>3;//binfo.wBIBitCount/8判断是几位的位图

do

{

while(count

{

//处理24位位图

if(color_byte==3)

{

switch(rgb)

{

case0:

//兰色象素数据转换成R5G6B5格式

{

color=Buf[count]>>3;

rgb++;

break;

}

case1:

//绿色象素数据转换成R5G6B5格式

{

color|=(Buf[count]>>2)<<5;rgb++;

break;

}

case2:

//红色象素数据转换成R5G6B5格式

{

color|=(Buf[count]>>3)<<11;rgb++;

break;

}

default:

break;

}

if(rgb==color_byte)//象素转换完成

{

TFTPoint(tft_x,tft_y,color);

color=0;

rgb=0;

if(--tft_x

{

tft_x=tft_end_x;

if(--tft_y

if(((binfo.dwBIWidth*3)%4)!

=0)count+=4-

((binfo.dwBIWidth*3)%4);

}

}

count++;

}

else

{

//添加处理其它比如16位图的程序

}

}

//读下一个扇区数据

if(f_read(fil,Buf,BMPBufSize,&len))returnFALSE;

count=0;

}while(!

res&&len);

returnTRUE;

}

//***********************************************************************************

//*函数名称:

FilSearch

//*功能:

在指定路径下查找指定扩展名的文件,并记录在(*p)[13]数组中,注意最大记录条

//*勿溢出

//*输入参数:

fs

//*dir

//*path要检索的文件路径

//*name要检索的文件扩展名

//*(*p)[13]检索结果存放地址

//*输出参数:

TRUE成功FALSE出错

//*编写:

Bunagi

//*修改:

2010/9/4

//***********************************************************************************

boolFilSearch(FATFS*fs,DIR*dir,XCHAR*path,u8*name,char(*p)[13]){

FILINFOfno;

FRESULTres;

u8i,j,k;

j=k=0;

res=f_opendir(dir,path);

if(res!

=FR_OK)returnFALSE;

do

{

res=f_readdir(dir,&fno);

if(res!

=FR_OK)returnFALSE;

if(fno.fname[0]==0)returnTRUE;

i=13;

while(--i)

{

if((fno.fname[i]==0x2E)&&(fno.fname[i+1]==name[0]&&fno.fname[i+2]==name[1]&&fno.fname[i+3]==name[2]))break;}

if(i)//检索到一个符合扩展名条件的文件

{

for(k=0;k<13;k++)*(*(p+j)+k)=fno.fname[k];

j++;

}

}while(!

res&&fno.fname[0]!

=0);

}

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

当前位置:首页 > 解决方案 > 营销活动策划

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

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