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

📄 atmel mp3.lst

📁 MP3播放器和U盘功能的源代码。采用集成了MP3解码芯片和USB接口芯片的AT89C51SND1C单片机
💻 LST
字号:
C51 COMPILER V7.50   ATMEL_MP3                                                             02/08/2007 11:18:09 PAGE 1   


C51 COMPILER V7.50, 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 BROWSE DEBUG OBJECTEXTEND

line level    source

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

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

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

⌨️ 快捷键说明

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