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_yif(((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);
}