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

📄 api.lst

📁 单片机读写优盘
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V7.06   API                                                                   07/30/2008 08:56:14 PAGE 1   


C51 COMPILER V7.06, COMPILATION OF MODULE API
OBJECT MODULE PLACED IN api.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE api.c LARGE BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          //************************************************************************
   2          //author:dragon
   3          //web:8dragon.com
   4          //2004.2.5完成于桃龙源
   5          //*************************************************************************
   6          #include "AT89X52.h"
   7          #include "api.h"
   8          #include "file.h"
   9          #include "host_811.h"
  10          #include  "ufi.h"
  11          #include "string.h"
  12          #include "math.h"
  13          struct _FILE  ApiFileControl;
  14          extern struct _BPB      SimpleBpb;
  15          extern  FAT_PARAMETER FatParameter;
  16          BYTE BuffFile[8*512];
  17          extern WORD FatCache[2][256];
  18          BYTE CreateFile(char* filename, BYTE attribute)
  19          {       
  20   1              struct _DIR dir,*pdir;
  21   1              BYTE name[11];
  22   1              struct _FILE file;
  23   1      //      WORD NewCluster;
  24   1              BYTE Cache[512];
  25   1              static char NewFileName[12];
  26   1              char * p=NewFileName;
  27   1              ////////////////////////////////////////////////////////////////////////
  28   1              //*Get valid filen name
  29   1              if(!CheckFileName(filename,p))
  30   1                      return FALSE;   
  31   1              //*核对该文件是否已经存在
  32   1              if(LocateFile(filename, NULL)!=0xffffffff)
  33   1                      return FALSE;
  34   1              strncpy(name, p, 11);
  35   1              memset(&dir, 0, sizeof(dir));
  36   1              memcpy(dir.Name, name, 11);
  37   1              dir.Attr = attribute;
  38   1              dir.CrtDate =0;
  39   1              dir.CrtTime =0;
  40   1              dir.CrtTimeTenth =0;
  41   1              dir.FileSize =0;
  42   1              DelayMs(5);
  43   1              if(!LocateDir(&dir, &file))
  44   1                      return FALSE;   
  45   1      //      NewCluster=SeekEmptyCluseter();
  46   1      //      if(NewCluster==0xffff)
  47   1      //              return FALSE;
  48   1              DelayMs(15);
  49   1              if(!Read(file.DirSectorNum,1,(BYTE *)Cache))
  50   1                      return FALSE;
  51   1              pdir = (struct _DIR *)Cache;
  52   1              pdir += file.DirIndex;
  53   1              pdir->FstClusLO =0x00;//WordSwap(NewCluster);
  54   1              pdir->FileSize=0;
  55   1              if(!Write(file.DirSectorNum,1,Cache,TRUE))
C51 COMPILER V7.06   API                                                                   07/30/2008 08:56:14 PAGE 2   

  56   1                      if(!Write(file.DirSectorNum,1,Cache,TRUE))
  57   1                      return FALSE;           
  58   1       return OpenFile(filename);     
  59   1      }
  60          BYTE WriteFile(const char* buffer, UINT bytes)
  61          {
  62   1              BYTE *pCache;
  63   1              WORD Cache[512];
  64   1              UINT write_bytes =0,flag=0;
  65   1              UINT max_write_bytes_in_sector;
  66   1              WORD Cluster;
  67   1              ////////////////////////////////////////////////////////////////////////
  68   1              //如果打开的文件是一个空文件,则进入下面
  69   1              //为其寻找一个开始的数据蔟,标记为0xffff
  70   1              //数据直接填在该簇对应的扇区内
  71   1              if(ApiFileControl.StartSectorNum<FatParameter.FirstDataSector)
  72   1              {
  73   2                      Cluster=SeekEmptyCluster();
  74   2                      if(!Read(FatParameter.FirstFatSecNum+(2*Cluster/SimpleBpb.BytsPerSec),1,(BYTE *)Cache))
  75   2                              return FALSE;
  76   2                      Cache[Cluster%(SimpleBpb.BytsPerSec/2)]=0xffff;
  77   2                      if(!Write(FatParameter.FirstFatSecNum+(2*Cluster/SimpleBpb.BytsPerSec),1,(BYTE *)Cache,0))
  78   2                              return FALSE;
  79   2                      ApiFileControl.dir.FstClusLO=WordSwap(Cluster);
  80   2                      ApiFileControl.StartSectorNum=ApiFileControl.CurrentSectorNum=ClusterToSec(Cluster);
  81   2                      flag=1;
  82   2              }
  83   1              ///////////////////////////////////////////////////////////////////////////////
  84   1              //
  85   1              //如过前一个WriteFile函数的字节或者打开一个已经有为内容的文件的字节偏移刚好为
  86   1              //SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus的整数倍,为了保持总的算法一致
  87   1              //(都是先写好某簇为0xffff然后再写该簇的内容)则开始的时候必须先为其准备好
  88   1              //一个未有内容的簇,标记好为0xffff,然后数据直接填在该簇对应的扇区内。
  89   1              //
  90   1              //////////////////////////////////////////////////////////////////////////////
  91   1              if((ApiFileControl.SectorOffset==0)&&flag==0)
  92   1                      {
  93   2                              Cluster =LinkClusterList(SecToCluster(ApiFileControl.CurrentSectorNum));
  94   2                                      if(Cluster == 0xffff)
  95   2                                              return FALSE;           
  96   2                                      ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
  97   2                      }
  98   1              for(;;)
  99   1              {
 100   2                      pCache=BuffFile;//Cache;
 101   2                      pCache += ApiFileControl.SectorOffset;
 102   2                      if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - write_bytes))
 103   2                              max_write_bytes_in_sector =  (bytes - write_bytes);
 104   2                      else
 105   2                              max_write_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);
 106   2                      memcpy(pCache, buffer, max_write_bytes_in_sector);
 107   2                      ApiFileControl.SectorOffset += max_write_bytes_in_sector;
 108   2                      if(ApiFileControl.SectorOffset>=SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus)
 109   2                      {                               
 110   3                                      if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE*)BuffFile,FALSE))
 111   3                                              if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE*)BuffFile,FALSE))
 112   3                                                      return FALSE;           
 113   3                                      if((write_bytes+max_write_bytes_in_sector)<bytes)
 114   3                                              {
 115   4                                                      Cluster =LinkClusterList(SecToCluster(ApiFileControl.CurrentSectorNum));
 116   4                                                      if(Cluster == 0xffff)
 117   4                                                              return FALSE;           
C51 COMPILER V7.06   API                                                                   07/30/2008 08:56:14 PAGE 3   

 118   4                                                      ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);                        
 119   4                                              }
 120   3                              
 121   3                              ApiFileControl.SectorOffset = 0;
 122   3                      }
 123   2                      write_bytes += max_write_bytes_in_sector;
 124   2                      buffer = (char*)buffer + max_write_bytes_in_sector;
 125   2                      ApiFileControl.dir.FileSize +=  max_write_bytes_in_sector;
 126   2                      if(write_bytes >= bytes)
 127   2                              return TRUE;                                    
 128   2              }//end for cycle 
 129   1        return FALSE;
 130   1      }
 131          BYTE AddWriteFile(const char* buffer, UINT bytes)
 132          {
 133   1              UINT write_bytes =0;
 134   1              UINT max_write_bytes_in_sector;
 135   1              ////////////////////////////////////////////////////////////////////////
 136   1      //      WORD Cluster;
 137   1      //      DWORD Sector;
 138   1              BYTE *pCache;
 139   1      //      BYTE BuffFile[4*512];
 140   1              /////////////////////////////////////////////////////////////////////////////
 141   1              //
 142   1              //****如果文件的大小不是SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus
 143   1              //的整数倍,则进入下面的语句可以保证加写的东西精确到到字节
 144   1              //
 145   1              //////////////////////////////////////////////////////////////////////////////
 146   1              if(0<ApiFileControl.SectorOffset<SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus)
 147   1              {       
 148   2                      pCache=BuffFile;        
 149   2                      if((SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset) > (bytes - write_bytes))
 150   2                              max_write_bytes_in_sector =  (bytes - write_bytes);
 151   2                      else
 152   2                              max_write_bytes_in_sector=(SimpleBpb.BytsPerSec*SimpleBpb.SecPerClus - ApiFileControl.SectorOffset);    
 153   2              //      Cluster=SecToCluster(ApiFileControl.CurrentSectorNum);
 154   2              //      Sector=ClusterToSec(Cluster);           
 155   2                      if(!Read(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile))
 156   2                              return FALSE;
 157   2                      pCache += ApiFileControl.SectorOffset;
 158   2                      memcpy(pCache, buffer, max_write_bytes_in_sector);
 159   2                      if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile,TRUE))
 160   2                              if(!Write(ApiFileControl.CurrentSectorNum,SimpleBpb.SecPerClus,(BYTE *)BuffFile,TRUE))
 161   2                                      return FALSE;           
 162   2                      write_bytes += max_write_bytes_in_sector;
 163   2                      buffer = (char*)buffer + max_write_bytes_in_sector;
 164   2                      ApiFileControl.dir.FileSize +=  max_write_bytes_in_sector;
 165   2                      if((bytes-max_write_bytes_in_sector)>0)
 166   2                              ApiFileControl.SectorOffset=0;  
 167   2              }               
 168   1                      if(!WriteFile(buffer,(bytes -write_bytes)))
 169   1                              return FALSE;
 170   1                      return TRUE;
 171   1      }
 172          BYTE OpenFile(const char* filename)
 173          {
 174   1              DWORD FileFirstSector;
 175   1              WORD  Cluster;
 176   1              ////////////////////////////////////////////////////////////////////////
 177   1              FileFirstSector=LocateFile(filename, &ApiFileControl);
 178   1              if(FileFirstSector==0xffffffff)
 179   1                      return FALSE;   
C51 COMPILER V7.06   API                                                                   07/30/2008 08:56:14 PAGE 4   

 180   1              ApiFileControl.StartSectorNum = FileFirstSector;
 181   1              Cluster=WordSwap(ApiFileControl.dir.FstClusLO);
 182   1              for(;;)
 183   1              {
 184   2                      if((GetListCluster(Cluster)==0xffff)||(Cluster==0))
 185   2                              break;                          
 186   2                      Cluster=GetListCluster(Cluster);
 187   2              }
 188   1              //ApiFileControl.CurrentSectorNum为该簇对应的第一个扇区
 189   1              ApiFileControl.CurrentSectorNum = ClusterToSec(Cluster);
 190   1              ApiFileControl.SectorOffset=(DWordSwap(ApiFileControl.dir.FileSize)%(SimpleBpb.BytsPerSec*SimpleBpb.SecPe
             -rClus));
 191   1              ApiFileControl.dir.FileSize=DWordSwap(ApiFileControl.dir.FileSize);
 192   1              return TRUE;
 193   1      }
 194          BYTE ReadFile(void* buffer, UINT bytes)
 195          {
 196   1              BYTE*pCache;
 197   1              UINT read_bytes =0;
 198   1              UINT max_copy_bytes_in_sector;
 199   1              WORD Cluster,i;
 200   1              DWORD FileSize;
 201   1      //      BYTE buf[600];
 202   1      //      for(i=0;i<600;i++)
 203   1      //              buf[i]='a';
 204   1      //      memcpy(buffer,buf,400);
 205   1      //      return TRUE;
 206   1              ////////////////////////////////////////////////////////////////////////
 207   1              FileSize = ApiFileControl.dir.FileSize;
 208   1              if(bytes>=FileSize)
 209   1                      bytes=FileSize;

⌨️ 快捷键说明

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