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

📄 fat16.lst

📁 用89C51SND1C实现MP3播放器的源代码.用KEIL c51编写.
💻 LST
字号:
C51 COMPILER V6.23a  FAT16                                                                 12/02/2003 11:07:23 PAGE 1   


C51 COMPILER V6.23a, COMPILATION OF MODULE FAT16
OBJECT MODULE PLACED IN fat16.OBJ
COMPILER INVOKED BY: d:\SoftDev\Keil\C51\BIN\C51.EXE fat16.c LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          /****************************************************************/
   2          /*                                      UP-MP3DIY100                                                            */
   3          /*              Beijing Universal Pioneering Technology Co., LTD                */
   4          /*              CopyRighted,All right Reserved  www.up-tech.com                 */
   5          /*                                              July,2003                                                               */
   6          /*                              010-62387873  62381842                                                  */
   7          /****************************************************************/
   8          
   9          #include "Fat16.h"
  10          #include "Flash.h"
  11          #include "uart.h"
  12          #include "string.h"
  13          
  14          //数据结构与全局变量定义
  15          extern unsigned char Page_Buf[];//外部变量申明,Page/扇区缓存
  16          extern unsigned char SONG[];    //外部变量申明,歌曲列表数组
  17          
  18          //读取MP3时的辅助变量
  19          long int Current_Cluster,DataRead=0,DataRemain=0;
  20          
  21          //文件系统有关变量申明
  22          unsigned int TotalCluster,BootSector,RsdSector,SectorofFatSize,TotalCapacity,RootEntry,SecPerClus,TotalSec
             -tor,BytesPerSec,FirstDataSec;
  23          unsigned char FAT_TYPE;
  24          
  25          //文件系统初始化,由存储体得到分区信息
  26          void Init_FAT_Info(void)
  27          {
  28   1      
  29   1              ///////////////////////////////////////////////////
  30   1              //得到引导扇区所在扇区号,如果介质是不带分区的,则0扇区就是BootSector了。
  31   1              ReadPage(Begin_Cluster,0,Page_Buf);
  32   1      
  33   1              if(!(Page_Buf[0]==0xeb&&Page_Buf[2]==0x90)){    //通过判断EB ?? 90来看是否已经是BPB了
  34   2                      //带分区的介质
  35   2                      BootSector=Page_Buf[454]+Page_Buf[455]*256+Page_Buf[456]*(256*256)+Page_Buf[457]*(256*256*256);
  36   2                      }
  37   1              else BootSector=0;
  38   1              ///////////////////////////////////////////////////
  39   1      
  40   1              ////////////////////////////////////////////////
  41   1              //得到保留扇区数,总扇区数,总扇区数/每簇扇区数得到簇数,是FAT类型的依据
  42   1              ReadPage(Begin_Cluster,BootSector,Page_Buf);
  43   1              RsdSector=Page_Buf[14]+Page_Buf[15]*256;//得到保留扇区数
  44   1              SecPerClus=Page_Buf[13];//得到每簇扇区数
  45   1      
  46   1              BytesPerSec=Page_Buf[12]*256+Page_Buf[11];//得到每扇区字节数
  47   1      
  48   1              TotalSector=(Page_Buf[20]*256+Page_Buf[19]);//得到总扇区数
  49   1              TotalCapacity=TotalSector*BytesPerSec;//得到总容量
  50   1              TotalCluster=TotalSector/SecPerClus;//FAT16的簇总数=扇区总数/每簇扇区数
  51   1      
  52   1              SectorofFatSize=((Page_Buf[22]+Page_Buf[23]*256));//得到每个分区表的扇区数
  53   1              RootEntry=(Page_Buf[18]*256+Page_Buf[17]);//得根目录项数
  54   1              //得第一个存放数据的扇区的位置
C51 COMPILER V6.23a  FAT16                                                                 12/02/2003 11:07:23 PAGE 2   

  55   1              FirstDataSec=BootSector+RsdSector+(SectorofFatSize*2)+((RootEntry*32+(BytesPerSec-1))/BytesPerSec);
  56   1      
  57   1              if(TotalCluster>65525){  //如果此分区为FAT32,则以下代码决定FAT32的扇区总数和FAT表项长度
  58   2                      FAT_TYPE=FAT32;
  59   2      
  60   2                      if(TotalSector==0) TotalSector=(Page_Buf[32]+Page_Buf[33]*256+Page_Buf[34]*256*256+Page_Buf[35]*256*256*
             -256);
  61   2                      TotalCapacity=TotalSector*BytesPerSec;
  62   2                      TotalCluster=TotalSector/SecPerClus;
  63   2      
  64   2                      SectorofFatSize=(Page_Buf[36]+Page_Buf[37]*256+Page_Buf[38]*256*256+Page_Buf[39]*256*256*256);
  65   2                      if(SectorofFatSize>(TotalCluster*16/512)) SectorofFatSize=((Page_Buf[22]+Page_Buf[23]*256));
  66   2                      RootEntry=(Page_Buf[44]*256+Page_Buf[43]);
  67   2                      FirstDataSec=BootSector+RsdSector+(SectorofFatSize*2)+((RootEntry*32+(BytesPerSec-1))/BytesPerSec);
  68   2                      
  69   2                      }
  70   1              else if((TotalCluster>0)&&(TotalCluster<4085)) {//根据簇的数量决定FAT分区表的类型,FAT12
  71   2                      FAT_TYPE=FAT12;
  72   2                      }
  73   1              else {  //FAT16
  74   2                      FAT_TYPE=FAT16;
  75   2                      }
  76   1              
  77   1      }
  78          
  79          //生成MP3歌曲列表
  80          unsigned char GetMP3List(void)
  81          {
  82   1              unsigned char i=0,j=0,l=0;
  83   1              int k=0;
  84   1              unsigned char MP3[3]={'M','P','3'};
  85   1              Init_FAT_Info();//初始化文件系统
  86   1      
  87   1              k=BootSector+RsdSector+2*SectorofFatSize;
  88   1      //      printuf("BootSector:%x",BootSector);
  89   1      //      printuf("RsdSector:%x",RsdSector);
  90   1      //      printuf("SectorofFatSize:%x",SectorofFatSize);
  91   1      //      printuf("RootDIR:%x",(k&0xff00)>>8);
  92   1      //      printuf("%x\n",k);
  93   1      
  94   1              ReadPage(0+k/32,k%32,Page_Buf);//读根目录区的首页
  95   1      
  96   1              while(Page_Buf[0]!=0){//遍历整个目录
  97   2                      for(j=0;j<16;j++){//每个扇区为512字节,可容纳16个根目录项,每个根目录项32字节
  98   3                                      if(!Page_Buf[j*32]) break;//如果到达根目录的最后,则结束搜索
  99   3                                      if(Page_Buf[j*32]==0xE5) continue;//如果某个文件项是已经被删除了的,则转向下一文件项
 100   3      
 101   3                                      if(!memcmp(MP3,&Page_Buf[j*32+8],3)){   //找到一个扩展名为MP3的文件,file find
 102   4                                              for(i=0;i<11;i++) SONG[l*11+i]=Page_Buf[j*32+i];//将其文件名复制到MP3歌曲列表中
 103   4                                              l++;//歌曲总数计数加1
 104   4                                              }
 105   3                                      }
 106   2                      k++;//指向根目录表的下一个扇区
 107   2                      ReadPage(0+k/32,k%32,Page_Buf);//读取下一个扇区的根目录表项数据
 108   2                      }
 109   1              return(l);//返回找到的MP3歌曲的总数
 110   1      }
 111          
 112          //从当前MP3歌曲中读取512个字节
 113          int ReadSector(unsigned char *Name,unsigned char *databuff)
 114          {
 115   1              int i,k,Page;
C51 COMPILER V6.23a  FAT16                                                                 12/02/2003 11:07:23 PAGE 3   

 116   1              if(DataRead==0) //第一次读取,先查找文件,然后进行读取
 117   1                      {
 118   2                              Page=BootSector+RsdSector+2*SectorofFatSize;
 119   2                              ReadPage(0+Page/32,Page%32,databuff);//读取根目录项
 120   2                              while(databuff[0]!=0){//遍历整个目录
 121   3                              for(i=0;i<16;i++){
 122   4                                                              if(!memcmp(Name,&databuff[i*32],11)){//找到要播放的那个文件
 123   5                                                                      Current_Cluster=databuff[32*i+27]*256+databuff[32*i+26];//得当前文件的首簇
 124   5                                                                      printuf("Current_Cluster:%x",(Current_Cluster&0xff00)>>8);
 125   5                                                                      printuf("%x\n",Current_Cluster);
 126   5                                                                      for(k=31;k>27;k--) DataRemain=(DataRemain<<8)|databuff[i*32+k];//得文件长度
 127   5                                                                      ReadPage((Current_Cluster+0x11d)/32,(Current_Cluster+0x11d)%32,databuff);//读取512个字节
 128   5      
 129   5                                                                      DataRead+=512;//已读字节数加512
 130   5                                                                      DataRemain-=512;//剩余字节数减512
 131   5                                                                      if(DataRemain<0) {DataRead=0;return(DataRemain+512);}//如果数据已全部读完,则返回实际本次读取的有效
             -字节数
 132   5                                                                      else return(512);//若未读完此歌曲,则返回512
 133   5                                                              }
 134   4                                                      }
 135   3                                      Page++;//指向根目录区的下一个扇区
 136   3                                      ReadPage(0+Page/32,Page%32,databuff);//读取根目录区的此扇区内容
 137   3                        }
 138   2                        printu("\nfile is not found!");return(0);
 139   2                      }
 140   1              else
 141   1                      {
 142   2      //                      if((Current_Cluster+0x11d+DataRead/BytesPerSec)%32) Current_Cluster=NextCluster(Current_Cluster);
 143   2                              ReadPage((Current_Cluster+0x11d)/32,(Current_Cluster+0x11d+DataRead/BytesPerSec)%32,databuff);//继续读

⌨️ 快捷键说明

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