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

📄 file_system.lst

📁 一款硬盘MP3的源代码
💻 LST
字号:
C51 COMPILER V7.50   FILE_SYSTEM                                                           11/27/2005 23:13:40 PAGE 1   


C51 COMPILER V7.50, COMPILATION OF MODULE FILE_SYSTEM
OBJECT MODULE PLACED IN file_system.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE file_system.c BROWSE DEBUG OBJECTEXTEND

line level    source

   1          /*file_system.c file
   2            Created by Computer-lov. Date: 2005.3.19
   3            Last edited date: 2005.5.31
   4            Copyright (c) 2005 Computer-lov
   5            version 1.1
   6          */
   7          
   8          #include "file_system.h"
   9          #include "IDE.H"
  10          #include "hardware.h"
  11          #include "lcd.h"
  12          #include "mp3.h"
  13          #include "keyboard.h"
  14          
  15          
  16          FILE xdata file;
  17          unsigned int dir_length;     //文件名长度
  18          unsigned int folder_length;  //文件夹名长度
  19          
  20          ////////////////////////////////////  判断是否为一个 MP3 文件   ///////////////////////////////
  21          unsigned char is_a_mp3_file(void)
  22          {
  23   1      if((file.name[0]==0x00)||(file.name[0]==0xE5)||(file.name[0]=='.'))return 0;
  24   1      if(file.attribute==0x0F)return 0;  //此项目为长文件名项目
  25   1      if(file.attribute & 0x04)return 0;  //此文件为系统文件
  26   1      if(file.attribute & 0x08)return 0;  //此项目为系统标卷
  27   1      if(file.attribute & 0x10)return 0;  //此项目为子目录
  28   1      if((file.name[8]=='M')&&(file.name[9]=='P')&&(file.name[10]=='3'))return 1;
  29   1      else return 0;
  30   1      }
  31          ///////////////////////////////////////////////////////////////////////////////////////////////
  32          
  33          unsigned long int LAST_FAT_LBA; 
  34          //最后一次读取FAT时的逻辑块地址,用来判断本次读取是否需要重新从硬盘中读取,以加快速度
  35          unsigned int disp_count=0;
  36          unsigned char disp_time;
  37          
  38          ////////////////////////////////////////////////////////////////////////////////////////////////
  39          unsigned long int get_next_sector(void)  //根据当前簇号,获取下一个扇区地址
  40          {
  41   1      unsigned long int LBA;
  42   1      unsigned  int i;
  43   1      LBA=(file.next_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4);  //计算扇区地址
  44   1      i=(file.next_cluster_number)*4-LBA*dbr[driver_number].bytes_per_sectors; //计算偏移地址
  45   1      if(LAST_FAT_LBA!=LBA)                  //如果数据不在FAT_buffer[]中,则需要重新读取
  46   1        {
  47   2         LAST_FAT_LBA=LBA;
  48   2         LBA=LBA+FAT_start_sector[driver_number];
  49   2         read_IDE_FAT_sector(LBA);
  50   2        }
  51   1      ((unsigned char *)&(file.next_cluster_number))[3]=FAT_buffer[i];
  52   1      i++;
  53   1      ((unsigned char *)&(file.next_cluster_number))[2]=FAT_buffer[i];
  54   1      i++;
  55   1      ((unsigned char *)&(file.next_cluster_number))[1]=FAT_buffer[i];
C51 COMPILER V7.50   FILE_SYSTEM                                                           11/27/2005 23:13:40 PAGE 2   

  56   1      i++;
  57   1      ((unsigned char *)&(file.next_cluster_number))[0]=FAT_buffer[i];  //获取下一簇号
  58   1      LBA=file.next_cluster_number-(dbr[driver_number].root_cluster_num);                                   //保
             -存簇号
  59   1      LBA=LBA*(dbr[0].sectors_per_cluster)+DATA_start_sector[0];        //转换成扇区地址
  60   1      // IDE_LED=!IDE_LED;                                                 //硬盘指示灯闪烁
  61   1      disp_time++;
  62   1      if(disp_time>3)
  63   1        {
  64   2         disp_time=0; 
  65   2         LCD_go_home();
  66   2         disp_count+=2;
  67   2         for(i=0;i<14;i++)write_LCD_data(((unsigned char *)dir_name)[(i+disp_count)%(dir_length+4)]);
  68   2        }  
  69   1      return LBA;
  70   1      }
  71          ////////////////////////////////////////////////////////////////////////////////////////////////
  72          
  73          /////////////////////////////////////////////////  获取文件夹的下一扇区地址  ///////////////////
  74          unsigned long int get_dir_next_sector(void)
  75          {
  76   1      unsigned long int LBA,LBA2;
  77   1      unsigned int i;
  78   1      LBA=current_dir.current_cluster_number-(dbr[driver_number].root_cluster_num);
  79   1      LBA=LBA*(dbr[driver_number].sectors_per_cluster)+DATA_start_sector[driver_number];
  80   1      LBA2=(current_dir.current_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4);  //计算扇区地址
  81   1      i=(current_dir.current_cluster_number)*4-LBA2*dbr[driver_number].bytes_per_sectors;      //计算偏移地址
  82   1      LBA2=LBA2+FAT_start_sector[driver_number];
  83   1      read_IDE_sector(LBA2);
  84   1      ((unsigned char *)&(current_dir.current_cluster_number))[3]=buffer[i];
  85   1      i++;
  86   1      ((unsigned char *)&(current_dir.current_cluster_number))[2]=buffer[i];
  87   1      i++;
  88   1      ((unsigned char *)&(current_dir.current_cluster_number))[1]=buffer[i];
  89   1      i++;
  90   1      ((unsigned char *)&(current_dir.current_cluster_number))[0]=buffer[i];  //获取下一簇号
  91   1      return LBA;
  92   1      }
  93          ////////////////////////////////////////////////////////////////////////////////////////////////
  94          
  95          ////////////////////////////////////////////////////////////////////////////////////////////////
  96          void get_nst_file(void)       //获取第n个MP3文件
  97          {
  98   1      unsigned int i,j,k,temp_count;
  99   1      unsigned long int LBA;
 100   1      unsigned char xdata temp_buffer[32];
 101   1      disp_count=0;
 102   1      temp_count=0;
 103   1      current_dir.current_cluster_number=current_dir.first_cluster_number;
 104   1      do
 105   1        {
 106   2         LBA=get_dir_next_sector();
 107   2         for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
 108   2          {
 109   3           read_IDE_sector(LBA);
 110   3           for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
 111   3            {
 112   4             if(j==15){for(k=0;k<32;k++)temp_buffer[k]=buffer[k+512-32];}  //如果已到最后一个项,则将之保存
 113   4             for(k=0;k<11;k++)file.name[k]=buffer[j*32+k];
 114   4             file.attribute=buffer[j*32+11];
 115   4             if(is_a_mp3_file())
 116   4              {
C51 COMPILER V7.50   FILE_SYSTEM                                                           11/27/2005 23:13:40 PAGE 3   

 117   5               temp_count++;
 118   5               if(temp_count==play_count)
 119   5                {
 120   6                 ((unsigned char *)&(file.first_cluster_number))[0]=buffer[j*32+0x15];
 121   6                 ((unsigned char *)&(file.first_cluster_number))[1]=buffer[j*32+0x14];
 122   6                 ((unsigned char *)&(file.first_cluster_number))[2]=buffer[j*32+0x1B];
 123   6                 ((unsigned char *)&(file.first_cluster_number))[3]=buffer[j*32+0x1A];
 124   6                 ((unsigned char *)&(file.length))[3]=buffer[j*32+0x1C];
 125   6                 ((unsigned char *)&(file.length))[2]=buffer[j*32+0x1D];
 126   6                 ((unsigned char *)&(file.length))[1]=buffer[j*32+0x1E];
 127   6                 ((unsigned char *)&(file.length))[0]=buffer[j*32+0x1F];
 128   6                 file.next_cluster_number=file.first_cluster_number;
 129   6                 dir_length=folder_length;
 130   6                 if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;}  //如果为第一项,则用刚刚保存

⌨️ 快捷键说明

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