⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fat.c

📁 一个基于ATmega64、VS1003、SD卡的mp3播放程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			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 + -