FATFs SD卡底层程序之图片显示.docx
- 文档编号:25106753
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:11
- 大小:16.51KB
FATFs SD卡底层程序之图片显示.docx
《FATFs SD卡底层程序之图片显示.docx》由会员分享,可在线阅读,更多相关《FATFs SD卡底层程序之图片显示.docx(11页珍藏版)》请在冰豆网上搜索。
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); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- FATFs SD卡底层程序之图片显示 SD 底层 程序 图片 显示