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

📄 file_sys.c

📁 AT89C51SND1C是AT89C51核心的处理器
💻 C
字号:
/*  Copyright (C) 1996-2005 Brilliant Ideal Electronics. All rights reserved.
	MP3_Player+USB_Disk V3.0 Edit by JMBIE STUDIO 2005.03
*/


#include <string.h>
#include "AT89C51SND1_REG.H"
#include "FILE_SYS.H"
#include "MP3_PLAYER.H"
#include "UDISK_DEF.H"
#include "MCU_UART.H"

unsigned char Page_Buf[512];
long int Current_Cluster, DataRead = 0, DataRemain = 0, Sector_Offset = 0x21d;
unsigned int TotalCluster, BootSector, RsdSector, SectorofFatSize, TotalCapacity, RootEntry, SecPerClus;
unsigned int TotalSector, BytesPerSec, FirstDataSec;
unsigned char FAT_TYPE; 



void Init_FAT_Info(void)
{

	ReadPage(Begin_Cluster, 0, Page_Buf);

	if (!(Page_Buf[0] == 0xeb && Page_Buf[2] == 0x90))	
	{
		
		BootSector = Page_Buf[454] + Page_Buf[455] * 256 + Page_Buf[456] * (256 * 256) + Page_Buf[457] * (256 * 256 * 256);
	}
	else 
	{
		BootSector = 0;
	}


	ReadPage(Begin_Cluster, BootSector, Page_Buf);
	RsdSector = Page_Buf[14] + Page_Buf[15] * 256;
	SecPerClus = Page_Buf[13];

	BytesPerSec = Page_Buf[12] * 256 + Page_Buf[11];

	TotalSector = (Page_Buf[20] * 256 + Page_Buf[19]);
	TotalCapacity = TotalSector * BytesPerSec;
	TotalCluster = TotalSector / SecPerClus; 

	SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
	RootEntry = (Page_Buf[18] * 256 + Page_Buf[17]);
 
	FirstDataSec = BootSector + RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / BytesPerSec);

	if (TotalCluster > 65525)
	{               
		FAT_TYPE = FAT32;

		if (TotalSector == 0) 
		{
			TotalSector = (Page_Buf[32] + Page_Buf[33] * 256 + Page_Buf[34] * 256 * 256 + Page_Buf[35] * 256 * 256 * 256);
		}
		TotalCapacity = TotalSector * BytesPerSec;
		TotalCluster = TotalSector / SecPerClus;

		SectorofFatSize = (Page_Buf[36] + Page_Buf[37] * 256 + Page_Buf[38] * 256 * 256 + Page_Buf[39] * 256 * 256 * 256);
		if (SectorofFatSize > (TotalCluster * 16 / 512))
		{
			SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
		}
		RootEntry = (Page_Buf[44] * 256 + Page_Buf[43]);
		FirstDataSec = BootSector+RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / BytesPerSec);
		
	}
	else if ((TotalCluster > 0) && (TotalCluster < 4085)) 
	{
		FAT_TYPE = FAT12;
	}
	else
	{	
		FAT_TYPE = FAT16;
	}
}

unsigned char GetMP3List(void)
{
	unsigned char i = 0, j = 0, l = 0;
	int k = 0;
	unsigned char MP3[3] = {'M', 'P', '3'};
	

	k = BootSector + RsdSector + 2 * SectorofFatSize;

	ReadPage(0 + k / 32, k % 32, Page_Buf);
 
	while (Page_Buf[0] != 0)
	{
		for (j=0; j<16; j++)
		{
			if (!Page_Buf[j * 32]) break;
			if (Page_Buf[j * 32] == 0xE5) continue;

			if (!memcmp(MP3, &Page_Buf[j * 32 + 8], 3))					  //file find
			{	
					for (i=0; i<11; i++) 
					{
						SONG[l * 11 + i] = Page_Buf[j * 32 + i];
					}
					l++;
			}
		}
		k++;
		ReadPage(0 + k / 32, k % 32, Page_Buf);
	}
	return (l);
}

int ReadSector(unsigned char *Name, unsigned char *databuff)
{
	int i, k, Page;
	unsigned  long CurrentSector;
	if (DataRead == 0) 
		{
			Page = BootSector + RsdSector + 2 * SectorofFatSize;
			ReadPage(0 + Page / 32, Page % 32, databuff);
			while (databuff[0] != 0)
			{
				for (i=0; i<16; i++)
				{


					if (!memcmp(Name, &databuff[i * 32], 11))
					{
						Current_Cluster = databuff[32 * i + 27] * 256 + databuff[32 * i + 26];
						for (k=31; k>27; k--) 
						{
							DataRemain = (DataRemain << 8) | databuff[i * 32 + k];
						}
								
						CurrentSector = (Current_Cluster - 2) * SecPerClus + FirstDataSec;
						ReadPage(CurrentSector / 32, CurrentSector % 32, databuff);
								
						DataRead += 512;
						DataRemain -= 512;
						if (DataRemain < 0) 
						{
							DataRead = 0;
							return (DataRemain + 512);
						}
						else
						{
							return (512);
						}
					}
				}
				Page++;
				ReadPage(0 + Page / 32, Page % 32, databuff);
		  }
		  return (0);
		}
	else
		{
			Current_Cluster++;
			CurrentSector = (Current_Cluster - 2) * SecPerClus + FirstDataSec;
			ReadPage(CurrentSector / 32, CurrentSector % 32, databuff);

			DataRead += 512;
			DataRemain -= 512;
			if (DataRemain < 0) 
			{
				DataRead = 0;
				return (DataRemain + 512);
			}
			else return (512);
		}

}

int ReadOneSector(unsigned char *Name, unsigned long SetCluster,unsigned char *databuff)
{
	int i,  Page;
	unsigned  long CurrentSector;

	Page = BootSector + RsdSector + 2 * SectorofFatSize;
	ReadPage(0 + Page / 32, Page % 32, databuff);
 	for (i=0; i<16; i++)
		{
	    	if (!memcmp(Name, &databuff[i * 32], 11))
				{
					Current_Cluster = databuff[32 * i + 27] * 256 + databuff[32 * i + 26];
    				CurrentSector =(Current_Cluster - 2) * SecPerClus + FirstDataSec;
					CurrentSector=CurrentSector+SetCluster;
				    ReadPage(CurrentSector / 32, CurrentSector % 32, databuff);
					return (512);
			
				}
		}

	 return (0);
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -