📄 fat.c
字号:
if((Sector_Buffer[NowFile+0x08]=='M')&&(Sector_Buffer[NowFile+0x09]=='P')&&(Sector_Buffer[NowFile+0x0A]=='3'))
{ //如果该项为有效文件
//getfileinfo(NowFile);//发送短文件名
GetLongName(NowSecterAdd,NowFile);
SendLongName();//发送长文件名
Start_Cluster=*((unsigned int *)(Sector_Buffer+NowFile+0x14));
Start_Cluster<<=16;
Start_Cluster+=*((unsigned int *)(Sector_Buffer+NowFile+0x1A));
if(System_ID==FAT16)Start_Cluster&=0xFFFF;
File_Size=*((unsigned long *)(Sector_Buffer+NowFile+0x1c));
FileOpenMode=MODEVS1003;
VS1003B_SoftReset();
open=Open_File(Start_Cluster,File_Size);
}
if(NextDir)return;
}
}
}
//***************************************************
//函数名称:
//函数功能:寻找所有目录
//输入:无
//输出:有效文件个数
//说明:从分区的根目录开始,将该分区内各目录下所有有
// 效文件找出,子目录最大深度为128
//***************************************************
unsigned int Root_Dir(void)
{
unsigned char NowSecter;
unsigned int NowFile;
unsigned long Start_Cluster,File_Size;
NextDir=0;
if(System_ID==FAT32)
{
Deep=1;
DirCluster=2;
Dir[0].NowSecter=0;
Dir[0].NowFile=0;
Dir_Mp3();
while(All_Dir());
}
else
{
for(NowSecter=0;NowSecter<32;NowSecter++)
for(NowFile=0;NowFile<512;NowFile+=32) //扫描扇区中的每个目录项
{
Get_One_Sector_DATA((unsigned long)(Root_Entries+NowSecter));//重新获取扇区的数据
//如果该项为文件
if((Sector_Buffer[NowFile]!=0xE5)&&(Sector_Buffer[NowFile+0x0B]==0x20))
{
getfileinfo(NowFile);
Start_Cluster=*((unsigned int *)(Sector_Buffer+NowFile+0x1A));
File_Size=*((unsigned long *)(Sector_Buffer+NowFile+0x1c));
//Open_File(Start_Cluster,File_Size);
}
//如果该项为子目录
else if((Sector_Buffer[NowFile]!=0xE5)&& (Sector_Buffer[NowFile]!=0x2E)&& (Sector_Buffer[NowFile+0x0B]==0x10))//子文件夹
{
getfileinfo(NowFile);
DirCluster=*((unsigned int *)(Sector_Buffer+NowFile+0x1A));
Deep=1;
DirCluster=DirCluster;
Dir[0].NowSecter=0;
Dir[0].NowFile=0;
while(All_Dir());
}
}
}
return 1;//返回有效文件数
}
//***************************************************
//函数名称:All_Dir(void)
//函数功能:遍历所有子目录
//输入:无
//输出:子目录深度
//说明:在调用之前先设置好结构体数组Dir[]的相关参数。
// 该函数的遍历是在判断深度不为0的时候反复调用
// 而实现。
//***************************************************
unsigned int All_Dir(void)
{
unsigned char NowSecter;
unsigned int NowFile,temp;
unsigned long NowSecterAdd;
temp=Dir[Deep-1].NowFile;
for(NowSecter=Dir[Deep-1].NowSecter;NowSecter<Sectors_Per_Cluster;NowSecter++)
{
NowSecterAdd=(unsigned long)(Root_Entries+((System_ID==FAT16)?32:0)+(DirCluster-2)*Sectors_Per_Cluster+NowSecter);
Get_One_Sector_DATA(NowSecterAdd);//重新获取扇区的数据
for(NowFile=temp;NowFile<512;NowFile+=32) //扫描扇区中的每个目录项
{
if((Sector_Buffer[NowFile]!=0xE5)&& (Sector_Buffer[NowFile]!=0x2E)&& (Sector_Buffer[NowFile+0x0B]==0x10))//子文件夹
{ //如果该项为子目录,则保护现在搜索位置,跳出
getfileinfo(NowFile);
GetLongName(NowSecterAdd,NowFile);
SendLongName();//发送长文件名
Dir[Deep-1].NowSecter=NowSecter;//保护当前目录搜索到的扇区
Dir[Deep-1].NowFile=NowFile+32;//保护当前扇区的下一目录项
DirCluster=*((unsigned int *)(Sector_Buffer+NowFile+0x14));
DirCluster<<=16;
DirCluster+=*((unsigned int *)(Sector_Buffer+NowFile+0x1A));
if(System_ID==FAT16)DirCluster&=0xFFFF;
Dir[Deep].NowSecter=0;
Dir[Deep].NowFile=0;
Dir_Mp3();//先将子目录中文件读出
NextDir=0;
Deep++;
return Deep;
}
}
temp=0;//恢复每扇区起始目录项的值
}
Get_One_Sector_DATA((unsigned long)(Root_Entries+((System_ID==FAT16)?32:0)+(DirCluster-2)*Sectors_Per_Cluster));
DirCluster=Sector_Buffer[0x35];
DirCluster<<=8;
DirCluster+=Sector_Buffer[0x34];
DirCluster<<=8;
DirCluster+=Sector_Buffer[0x3B];
DirCluster<<=8;
DirCluster+=Sector_Buffer[0x3A];
if(System_ID==FAT16)DirCluster&=0xFFFF;
else if(DirCluster==0)DirCluster=2;//FAT32文件系统根目录为编号2簇
Deep--;
return Deep;
}
//***************************************************
//函数名称:Get_Next_Cluster(unsigned long Cluster)
//函数功能:寻找下一簇号
//输入:现在读取的簇号
//输出:下一簇号
//说明:注意分区信息的几个变量
//***************************************************
unsigned long Get_Next_Cluster(unsigned long Cluster)
{
if(System_ID==FAT32)
{
Get_One_Sector_DATA(FAT_Head+Cluster/128);
return ((unsigned long *)Sector_Buffer)[(Cluster&0x7F)];
}
else
{
Get_One_Sector_DATA(FAT_Head+Cluster/256);
return ((unsigned int *)Sector_Buffer)[(Cluster&0xFF)];
}
}
//***************************************************
//函数名称:Open_File(unsigned long Cluster,unsigned long Size)
//函数功能:打开文件
//输入:Cluster:文件起始簇号 Size:文件大小(单位:字节)
//输出:无
//说明:移置到各场合使用
//***************************************************
unsigned char Open_File(unsigned long Cluster,unsigned long Size)
{
unsigned int i,j,temp,time,vol;
unsigned char k,flag=0;
unsigned long Sectors;
Sectors=Size>>9;
temp=Size&0x1ff;
do
{
for(i=0;i<Sectors_Per_Cluster;i++)
{
if((PING&0x10)==0)//如果按钮按下则跳出
{
for(time=35000;time>0;time--);
if((PING&0x10)==0)
{
while((PING&0x10)==0);
return 0;
}
}
else if((PING&0x08)==0&&flag==0)
{
for(time=35000;time>0;time--);
if((PING&0x08)==0)
{
flag=1;
vol=VS1003B_ReadCMD(0x0b);
if(vol<0x7878)vol+=0x0808;
else vol=0x8080;
VS1003B_WriteCMD(0x0b,vol);
}
}
else if((PING&0x04)==0&&flag==0)
{
for(time=35000;time>0;time--);
if((PING&0x04)==0)
{
flag=1;
vol=VS1003B_ReadCMD(0x0b);
if(vol>0x0808)vol-=0x0808;
else vol=0x0808;
VS1003B_WriteCMD(0x0b,vol);
}
}
else if((PING&0x0C)==0x0C)flag=0;
Get_One_Sector_DATA(Root_Entries+((System_ID==FAT16)?32:0)+(Cluster-2)*Sectors_Per_Cluster+i);
if(Sectors--)
{
if(FileOpenMode==MODEUART)//打开模式为串口
for(j=0;j<512;j++)
{
UDR0=Sector_Buffer[j];
while((UCSR0A&(1<<TXC0))==0);
UCSR0A|=(1<<TXC1);
}
else if(FileOpenMode==MODEVS1003)//打开模式为VS1003
for(j=0;j<512;j+=32)
{
while((VS1003B_PIN & (1<<VS1003B_DREQ))==0);
for(k=0;k<32;k++)
{
VS1003B_WriteDAT(Sector_Buffer[j+k]);
}
}
//while(PING&0x10);
//for(k=0;k<38720;k++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}
//LCD_Show_String(0,0,(char *)Sector_Buffer,0xffe0,0x001f);
}
else
{
if(FileOpenMode==MODEUART)//打开模式为串口
for(j=0;j<temp;j++)
{
UDR0=Sector_Buffer[j];
while((UCSR0A&(1<<TXC0))==0);
UCSR0A|=(1<<TXC1);
}
else if(FileOpenMode==MODEVS1003)//打开模式为VS1003
for(j=0;j<temp;j+=32)
{
while((VS1003B_PIN & (1<<VS1003B_DREQ))==0);
for(k=0;k<32&&(j+k)<temp;k++)
{
VS1003B_WriteDAT(Sector_Buffer[j+k]);
}
}
//Sector_Buffer[temp=0];
//while(PING&0x10);
//for(k=0;k<38720;k++){wr_lcd(0,0x22);wr_lcd(1,0x001f);}
//LCD_Show_String(0,0,(char *)Sector_Buffer,0xffe0,0x001f);
return 0;
}
}
Cluster=Get_Next_Cluster(Cluster);
}
while(Cluster<=((System_ID==FAT16)?0xFFEF:0xFFFFFFEF)&&Cluster>=3);
return 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -