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

📄 atmel mp3.lst

📁 89c51snd1c的FLASH MP3 U盘的详细代码
💻 LST
字号:
C51 COMPILER V6.12  ATMEL_MP3                                                              06/28/2005 22:56:52 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE ATMEL_MP3
OBJECT MODULE PLACED IN ATMEL MP3.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ATMEL MP3.C LARGE ROM(COMPACT) BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          
   2          
   3          #include <string.h>
   4          
   5          #define Root_Cluster	 (0)
   6          #define Begin_Cluster	 (0)				  //MBR所在的簇号
   7          #define Data_Cluster	 (1)				  //数据真正开始的扇区
   8          
   9          #define BPB_Sector	     (0)
  10          #define Fat_Sector	     (BPB_Sector + 1)
  11          #define Directory_Sector (Fat_Sector + 4)
  12          #define End_Cluster		 (Disk_Size / 32)
  13          
  14          #define UNUSED_MARK		 (0xFF)
  15          #define BAD_MARK		 (0x00)
  16          #define LAST_BLOCK		 (0xFFFF)
  17          #define FILE_NO_FOUND	 (512)
  18          
  19          #define PagePerClus	      32
  20          
  21          #define FAT12            (12)
  22          #define FAT16            (16)
  23          #define FAT32            (32)
  24          
  25          #define	K9F_FUN				P5
  26          #define K9F5608				0x4000
  27          #define	COMMAND				0x03	
  28          #define	ADDRESS				0x05	
  29          #define	D_DATA				0x01
  30          #define	INACTIVE			0x09	
  31          #define	RB					0x01
  32          
  33          //数据结构与全局变量定义  
  34          unsigned char Page_Buf[512];
  35          extern unsigned char SONG[];
  36          long int Current_Cluster, DataRead = 0, DataRemain = 0, Sector_Offset = 0x21d;
  37          unsigned int TotalCluster, BootSector, RsdSector, SectorofFatSize, TotalCapacity, RootEntry, SecPerClus;
  38          unsigned int TotalSector, BytesPerSec, FirstDataSec;
  39          unsigned char FAT_TYPE; 
  40          
  41          
  42          int ReadSector(unsigned char *Name, unsigned char *databuff);
  43          unsigned char GetMP3List(void);
  44          void Init_FAT_Info(void);
  45          
  46          extern void ReadPage(unsigned int block, unsigned int page, unsigned char *pPage);
  47          
  48          
  49          void Init_FAT_Info(void)
  50          {
  51   1      /*	得到引导扇区所在扇区号,如果介质是不带分区的,则0扇区就是BootSector了。 */
  52   1      	ReadPage(Begin_Cluster, 0, Page_Buf);
  53   1      
  54   1      	if (!(Page_Buf[0] == 0xeb && Page_Buf[2] == 0x90))					  //通过判断EB ?? 90来看是否已经是BPB了
  55   1      	{																	  //带分区的介质
C51 COMPILER V6.12  ATMEL_MP3                                                              06/28/2005 22:56:52 PAGE 2   

  56   2      		
  57   2      		BootSector = Page_Buf[454] + Page_Buf[455] * 256 + Page_Buf[456] * (256 * 256) + Page_Buf[457] * (256 * 
             -256 * 256);
  58   2      	}
  59   1      	else 
  60   1      	{
  61   2      		BootSector = 0;
  62   2      	}
  63   1      
  64   1      /*	得到保留扇区数,总扇区数,总扇区数/每簇扇区数得到簇数,是FAT类型的依据	   */
  65   1      	ReadPage(Begin_Cluster, BootSector, Page_Buf);
  66   1      	RsdSector = Page_Buf[14] + Page_Buf[15] * 256;
  67   1      	SecPerClus = Page_Buf[13];
  68   1      
  69   1      	BytesPerSec = Page_Buf[12] * 256 + Page_Buf[11];
  70   1      
  71   1      	TotalSector = (Page_Buf[20] * 256 + Page_Buf[19]);
  72   1      	TotalCapacity = TotalSector * BytesPerSec;
  73   1      	TotalCluster = TotalSector / SecPerClus;                              //FAT16的簇总数=扇区总数/每簇扇区数
  74   1      
  75   1      	SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
  76   1      	RootEntry = (Page_Buf[18] * 256 + Page_Buf[17]);
  77   1       
  78   1      	FirstDataSec = BootSector + RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / Byt
             -esPerSec);
  79   1      
  80   1      	if (TotalCluster > 65525)											  //FAT32的扇区总数和FAT表项长度
  81   1      	{               
  82   2      		FAT_TYPE = FAT32;
  83   2      
  84   2      		if (TotalSector == 0) 
  85   2      		{
  86   3      			TotalSector = (Page_Buf[32] + Page_Buf[33] * 256 + Page_Buf[34] * 256 * 256 + Page_Buf[35] * 256 * 256 
             -* 256);
  87   3      		}
  88   2      		TotalCapacity = TotalSector * BytesPerSec;
  89   2      		TotalCluster = TotalSector / SecPerClus;
  90   2      
  91   2      		SectorofFatSize = (Page_Buf[36] + Page_Buf[37] * 256 + Page_Buf[38] * 256 * 256 + Page_Buf[39] * 256 * 2
             -56 * 256);
  92   2      		if (SectorofFatSize > (TotalCluster * 16 / 512))
  93   2      		{
  94   3      			SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
  95   3      		}
  96   2      		RootEntry = (Page_Buf[44] * 256 + Page_Buf[43]);
  97   2      		FirstDataSec = BootSector+RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / Byte
             -sPerSec);
  98   2      		
  99   2      	}
 100   1      	else if ((TotalCluster > 0) && (TotalCluster < 4085)) 
 101   1      	{
 102   2      		FAT_TYPE = FAT12;
 103   2      	}
 104   1      	else
 105   1      	{	
 106   2      		FAT_TYPE = FAT16;
 107   2      	}
 108   1      }
 109          
 110          unsigned char GetMP3List(void)
 111          {
 112   1      	unsigned char i = 0, j = 0, l = 0;
C51 COMPILER V6.12  ATMEL_MP3                                                              06/28/2005 22:56:52 PAGE 3   

 113   1      	int k = 0;
 114   1      	unsigned char MP3[3] = {'M', 'P', '3'};
 115   1      	Init_FAT_Info();
 116   1      
 117   1      	k = BootSector + RsdSector + 2 * SectorofFatSize;
 118   1      
 119   1      	ReadPage(0 + k / 32, k % 32, Page_Buf);
 120   1       
 121   1      	while (Page_Buf[0] != 0)									          //遍历整个目录
 122   1      	{
 123   2      		for (j=0; j<16; j++)
 124   2      		{
 125   3      			if (!Page_Buf[j * 32]) break;
 126   3      			if (Page_Buf[j * 32] == 0xE5) continue;
 127   3      
 128   3      			if (!memcmp(MP3, &Page_Buf[j * 32 + 8], 3))					  //file find
 129   3      			{	
 130   4      					for (i=0; i<11; i++) 
 131   4      					{
 132   5      						SONG[l * 11 + i] = Page_Buf[j * 32 + i];
 133   5      					}
 134   4      					l++;
 135   4      			}
 136   3      		}
 137   2      		k++;
 138   2      		ReadPage(0 + k / 32, k % 32, Page_Buf);
 139   2      	}
 140   1      	return (l);
 141   1      }
 142          
 143          int ReadSector(unsigned char *Name, unsigned char *databuff)
 144          {
 145   1      	int i, k, Page;
 146   1      	unsigned  long CurrentSector;
 147   1      	if (DataRead == 0)                                                    //第一次读取,先查找文件,然后进行

⌨️ 快捷键说明

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