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

📄 file_system.c

📁 USB下载文件,汉字LCD显示,FAT32文件系统
💻 C
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////   获取当前目录下 下一个有效文件或者文件夹  /////////////////
void get_next_item(void)
{
 item_count++;
 get_nst_item();
}
///////////////////////////////////////////////////////////////////////////////////////////////

////////////////////////////////    进入一个文件夹    /////////////////////////////////////////
void enter_dir(void)
{
 unsigned char i;
 current_dir.father_dir_cluster_number=current_dir.first_cluster_number;
 current_dir.first_cluster_number=temp_dir.first_cluster_number;
 current_dir.current_cluster_number=current_dir.first_cluster_number;
 not_root_dir++;
 for(i=0;i<13;i++)
  {
   if(item_name[i]==0x2020)break;
   dir_name[folder_length/2]=item_name[i];
   folder_length+=2;
  }
 dir_name[folder_length/2]=0x5C20;
 folder_length+=2;
 item_count=0;
 play_count=0;
}
////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////   找出父文件夹起始簇号   ////////////////////////////////////
unsigned long int find_father_dir(void)
{
 unsigned long int cluster_number;
 unsigned int i,j;
 unsigned long int LBA;
 current_dir.current_cluster_number=current_dir.first_cluster_number;
 do
  {
   LBA=get_dir_next_sector();
   for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
    {
     read_IDE_sector(LBA);
     for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
      {
       if((buffer[j*32+0]=='.')&&(buffer[j*32+1]=='.')&&(buffer[j*32+11]&0x10))  //找到父目录项
        {
         ((unsigned char *)&(cluster_number))[0]=buffer[j*32+0x15];
         ((unsigned char *)&(cluster_number))[1]=buffer[j*32+0x14];
         ((unsigned char *)&(cluster_number))[2]=buffer[j*32+0x1B];
         ((unsigned char *)&(cluster_number))[3]=buffer[j*32+0x1A];
         if(cluster_number==0)
          {
           cluster_number=dbr[0].root_cluster_num;
          }
         return cluster_number;
        }
      }
     LBA++;
    }
  }while((!(current_dir.current_cluster_number>=0xFFFFFFF8))&&(LBA<(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))); //直到文件夹结束
 folder_length=4;   //如果找不到父目录,则发生严重错误,退回到根目录
 for(i=2;i<200;i++)dir_name[i]=0x2020;
 not_root_dir=0;
 current_dir.first_cluster_number=dbr[0].root_cluster_num;
 current_dir.current_cluster_number=current_dir.first_cluster_number;
}
/////////////////////////////////////////////////////////////////////////////////////////////////
unsigned int not_root_dir;   //如果该值不为0,表示不是根目录

/////////////////////////////   退到上一级目录,如果为根目录,则退不动  /////////////////////////
void exit_dir(void)
{
 unsigned char i;
 if(not_root_dir)
  {
   not_root_dir--;
   current_dir.first_cluster_number=current_dir.father_dir_cluster_number;
   current_dir.current_cluster_number=current_dir.first_cluster_number;
   if(not_root_dir)current_dir.father_dir_cluster_number=find_father_dir();
   folder_length--;
   dir_name[folder_length/2]=0x2020;
   for(i=0;i<13;i++)
   {
    folder_length-=2;
    if(((unsigned char *)&(dir_name[folder_length/2]))[0]==0x5C)break;
    if(((unsigned char *)&(dir_name[folder_length/2]))[1]==0x5C)break;
    dir_name[folder_length/2]=0x2020;
   }
   folder_length++;
  }
 play_count=0;
 item_count=0;
}
/////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////    获取当前文件夹中,第n个有效文件或者文件夹  ////////////////
void get_nst_item(void)
{
 unsigned int i,j,k,temp_count;
 unsigned long int LBA;
 unsigned char xdata temp_buffer[32];
 key=0;
 temp_count=0;
 play_count=0;
 current_dir.current_cluster_number=current_dir.first_cluster_number;
 do
  {
   LBA=get_dir_next_sector();
   for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)
    {
     read_IDE_sector(LBA);
     for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)
      {
       if(j==15){for(k=0;k<32;k++)temp_buffer[k]=buffer[k+512-32];}    //如果已到最后一个项,则将之保存
       for(k=0;k<11;k++)file.name[k]=buffer[j*32+k];
       file.attribute=buffer[j*32+11];
       if(is_a_mp3_file())
        {
        if(black)
         {
          write_LCD_command(0x34);
          write_LCD_command(0x05);
          write_LCD_command(0x30);
          black=0;
         }
         temp_count++;
         play_count++;
         if(temp_count==item_count)
          {
           for(k=0;k<11;k++)item_name[k]=buffer[j*32+k];      //保存短文件名
           if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;}   //如果为第一项,则用刚刚保存的一项替换最后一项
           j--;
           if((buffer[j*32+11]==0x0F)&&(buffer[j*32]!=0xE5))    //如果找到长目录,则用长目录名替换短目录名
            {
             for(k=0;k<10;k++)
              {
               ((unsigned char *)item_name)[k]=buffer[j*32+0x02+k];
               k++;
               ((unsigned char *)item_name)[k]=buffer[j*32+k];
              }
             for(k=0;k<12;k++)
              {
               ((unsigned char *)item_name)[10+k]=buffer[j*32+0x0F+k];
               k++;
               ((unsigned char *)item_name)[10+k]=buffer[j*32+0x0D+k];
              }
             ((unsigned char *)item_name)[22]=buffer[j*32+0x1D];
             ((unsigned char *)item_name)[23]=buffer[j*32+0x1C];
             ((unsigned char *)item_name)[24]=buffer[j*32+0x1F];
             ((unsigned char *)item_name)[25]=buffer[j*32+0x1E];
            }
           for(k=0;k<13;k++){if((item_name[k]==0x0000)||(item_name[k]==0xFF00)||(item_name[k]==0xFFFF))break;change_code(&(item_name[k]));}
           for(;k<13;k++)item_name[k]=0x2020;
           file_or_folder=IS_MP3FILE;
           return;
          }
        }
       if(is_a_folder())
        {
        if(!black)
         {
          write_LCD_command(0x34);
          write_LCD_command(0x05);
          write_LCD_command(0x30);
          black=1;
         }
         temp_count++;
         if(temp_count==item_count)
          {
           ((unsigned char *)&(temp_dir.first_cluster_number))[0]=buffer[j*32+0x15];
           ((unsigned char *)&(temp_dir.first_cluster_number))[1]=buffer[j*32+0x14];
           ((unsigned char *)&(temp_dir.first_cluster_number))[2]=buffer[j*32+0x1B];
           ((unsigned char *)&(temp_dir.first_cluster_number))[3]=buffer[j*32+0x1A];
           temp_dir.current_cluster_number=temp_dir.first_cluster_number;
           for(k=0;k<11;k++)item_name[k]=buffer[j*32+k];          //保存短文件名
           if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;}
           j--;
           if((buffer[j*32+11]==0x0F)&&(buffer[j*32]!=0xE5))
            {
             for(k=0;k<10;k++)
              {
               ((unsigned char *)item_name)[k]=buffer[j*32+0x02+k];
               k++;
               ((unsigned char *)item_name)[k]=buffer[j*32+k];
              }
             for(k=0;k<12;k++)
              {
               ((unsigned char *)item_name)[10+k]=buffer[j*32+0x0F+k];
               k++;
               ((unsigned char *)item_name)[10+k]=buffer[j*32+0x0D+k];
              }
             ((unsigned char *)item_name)[22]=buffer[j*32+0x1D];
             ((unsigned char *)item_name)[23]=buffer[j*32+0x1C];
             ((unsigned char *)item_name)[24]=buffer[j*32+0x1F];
             ((unsigned char *)item_name)[25]=buffer[j*32+0x1E];
            }
           for(k=0;k<13;k++){if((item_name[k]==0x0000)||(item_name[k]==0xFF00)||(item_name[k]==0xFFFF))break;change_code(&(item_name[k]));}
           for(;k<13;k++)item_name[k]=0x2020;
           file_or_folder=IS_FOLDER;
           return;
          }
        }
      }
     LBA++;
     if(key)
      {
       if(key==KEY_FUN){key=0;goto exit;}
       else key=0;
      }
    }
  }while((!(current_dir.current_cluster_number>=0xFFFFFFF8))&&(LBA<(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))); //直到文件夹结束

 exit:
 item_count=0;
 play_count=0;
 file_or_folder=IS_EMPTY;
 for(k=0;k<13;k++)item_name[k]=0x2020;
}
////////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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