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

📄 u_func_b.lst

📁 c8051f020+CH375读写U盘文件的程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
 503   3                 if(CtnsNum*32==FDTBuf.FDTNum)   //如果找到足够的FDT
 504   3                    {
 505   4                         temp_ofst=j*32;
 506   4                         break;
 507   4                        }
 508   3                }
 509   2         if(j<16)                //如果是因为找到足够的FDT而跳出上一个循环
 510   2               {
 511   3                SectOfst=i;
 512   3            break;
 513   3               }
 514   2        }
 515   1        if(i==sect_clust_a) return;   //如果没找到空FDT
 516   1       for(i=0;i<CtnsNum;i++)
 517   1          {
 518   2               for(j=0;j<32;j++)
 519   2                   {
 520   3                        *(pt+temp_ofst+j)=FDTBuf.Buf[32*i+j];
 521   3                       }
 522   2           if(temp_ofst==0)
 523   2                   {
 524   3                        Wr_Sector_a(root_a+SectOfst);
 525   3                        SectOfst--;
 526   3                        Rd_Sector_a(root_a+SectOfst);
 527   3                        temp_ofst=480;
 528   3                       }
 529   2               else temp_ofst-=32;
 530   2              }
 531   1        Wr_Sector_a(root_a+SectOfst);
 532   1      }
 533          
 534          unsigned long WrFAT_a(unsigned char file_num)
 535          {
 536   1       unsigned char xdata *pt;
 537   1       unsigned char SectFirst,SectChange;
 538   1       UINT32 data ClustNum;
 539   1       UINT32 temp_clust;
 540   1       struct{
C51 COMPILER V8.02   U_FUNC_B                                                              07/21/2008 09:40:01 PAGE 10  

 541   1                  unsigned long SectOfst;
 542   1                      unsigned int ByteOfst;
 543   1             }c1,c2;
 544   1       unsigned long data i;
 545   1       unsigned char data j;
 546   1       unsigned long fat_a,ChangeClust=0,SumClust,FirstClust=0;
 547   1       pt=Data_Buf;
*** WARNING C182 IN LINE 547 OF U_FUNC_B.C: pointer to different objects
 548   1      
 549   1       SumClust=Fat[file_num].Big.value/(512*sect_clust_a)+1;
 550   1       fat_a=hidd_sect_a+resv_sect_a;
 551   1       for(i=0;i<sect_fat_a;i++)
 552   1          {
 553   2           Rd_Sector_a(fat_a+i);
 554   2               SectFirst=1;
 555   2               SectChange=0;
 556   2               for(j=0;j<128;j++)
 557   2                  {
 558   3                       ClustNum.num[3]=*(pt+j*4);
 559   3                       ClustNum.num[2]=*(pt+j*4+1);
 560   3                       ClustNum.num[1]=*(pt+j*4+2);
 561   3                       ClustNum.num[0]=*(pt+j*4+3);
 562   3                       if(ClustNum.value==0)           //是否为空
 563   3                          {
 564   4                               SectChange=1;
 565   4                               if(FirstClust==0)
 566   4                                 {
 567   5                                      FirstClust=j+128*i;              //首簇号
 568   5                                      c1.SectOfst=i;
 569   5                                      c1.ByteOfst=j*4;
 570   5                                      c2.SectOfst=i;
 571   5                                      c2.ByteOfst=j*4;
 572   5                                      SectFirst=0;
 573   5                                      }
 574   4                               else
 575   4                                  {
 576   5                                       c2.SectOfst=i;
 577   5                                       c2.ByteOfst=j*4;
 578   5                                       temp_clust.value=j+128*i;        //c2指向的簇号
 579   5                                       if(SectFirst==1)               //若为此扇区的第一空簇
 580   5                                          {
 581   6                                               Rd_Sector_a(fat_a+c1.SectOfst);
 582   6                                               *(pt+c1.ByteOfst)=temp_clust.num[3];
 583   6                                               *(pt+c1.ByteOfst+1)=temp_clust.num[2];
 584   6                                               *(pt+c1.ByteOfst+2)=temp_clust.num[1];
 585   6                                               *(pt+c1.ByteOfst+3)=temp_clust.num[0];
 586   6                                               Wr_Sector_a(fat_a+c1.SectOfst);
 587   6                                               Wr_Sector_a(fat_a+sect_fat_a+c1.SectOfst);     //写FAT2
 588   6                                               Rd_Sector_a(fat_a+c2.SectOfst);
 589   6                                               c1=c2;
 590   6                                               SectFirst=0;   
 591   6                                              }
 592   5                                        else
 593   5                                          {
 594   6                                               *(pt+c1.ByteOfst)=temp_clust.num[3];
 595   6                                               *(pt+c1.ByteOfst+1)=temp_clust.num[2];
 596   6                                               *(pt+c1.ByteOfst+2)=temp_clust.num[1];
 597   6                                               *(pt+c1.ByteOfst+3)=temp_clust.num[0];
 598   6                                               c1=c2;
 599   6                                              }                                       
 600   5                                       }
 601   4                              ChangeClust++;
C51 COMPILER V8.02   U_FUNC_B                                                              07/21/2008 09:40:01 PAGE 11  

 602   4                              if(ChangeClust>=SumClust) 
 603   4                                 {
 604   5                                  *(pt+c2.ByteOfst)=0xff;
 605   5                                  *(pt+c2.ByteOfst+1)=0xff;
 606   5                                      *(pt+c2.ByteOfst+2)=0xff;
 607   5                                      *(pt+c2.ByteOfst+3)=0x0f;
 608   5                                  break;                          
 609   5                                 }                    
 610   4                              }
 611   3                      }
 612   2                if(SectChange==1)
 613   2                    {
 614   3                     Wr_Sector_a(fat_a+i);//此扇区修改完毕,写入,注:最后一空簇可能未写
 615   3                     Wr_Sector_a(fat_a+sect_fat_a+c1.SectOfst);    //写FAT2
 616   3                     if(ChangeClust>=SumClust) return FirstClust;
 617   3                        }
 618   2              }
 619   1      }
 620          
 621          unsigned char ReadBB(unsigned char file_num)    
 622          {
 623   1       static unsigned char data TempSectOfstBB;
 624   1       unsigned char xdata *Fpt;
 625   1       unsigned int data temp_ofst;
 626   1       static unsigned long data BaseSectBB,SumSectorBB,SectorBB=0;
 627   1       Fpt=FATBufB; 
 628   1       if(SectorBB==0)
 629   1          {
 630   2           ClusterB.NextClust.value=Fat[file_num].St_Clust.value;                
 631   2           SumSectorBB=Fat[file_num].Big.value/512+1;
 632   2              }
 633   1       if(SectorBB<=SumSectorBB)
 634   1          {
 635   2               
 636   2               if(SectorBB%sect_clust_b==0)
 637   2                  {
 638   3                       
 639   3                       if(ClusterB.NextClust.value/128!=ClusterB.CurrtClust/128||SectorBB==0)
 640   3                          {
 641   4                               ClusterB.CurrtClust=ClusterB.NextClust.value;
 642   4                               Rd_FAT_b(ClusterB.NextClust.value/128+resv_sect_b+hidd_sect_b);
 643   4                              }
 644   3                       else
 645   3                          {
 646   4                                ClusterB.CurrtClust=ClusterB.NextClust.value;
 647   4                              }
 648   3                                temp_ofst=(ClusterB.CurrtClust%128)*4;                        
 649   3                                ClusterB.NextClust.num[3]=*(Fpt+temp_ofst);
 650   3                                ClusterB.NextClust.num[2]=*(Fpt+temp_ofst+1);
 651   3                                ClusterB.NextClust.num[1]=*(Fpt+temp_ofst+2);
 652   3                                ClusterB.NextClust.num[0]=*(Fpt+temp_ofst+3);
 653   3                                BaseSectBB=(ClusterB.CurrtClust-2)*sect_clust_b+root_b;
 654   3                                TempSectOfstBB=0;                     
 655   3                      }
 656   2               Rd_Sector_b(BaseSectBB+TempSectOfstBB);                   //读一扇区
 657   2               TempSectOfstBB++;
 658   2               SectorBB++;
 659   2              }
 660   1        if(SectorBB>=SumSectorBB)
 661   1          {
 662   2               SectorBB=0;
 663   2           return 0x00;
C51 COMPILER V8.02   U_FUNC_B                                                              07/21/2008 09:40:01 PAGE 12  

 664   2              }
 665   1        else return 0xff;
 666   1      }
 667          
 668          unsigned char WriteBA(unsigned long FirstClust,unsigned char file_num)          //BA表示B为主盘,对A操作
 669          {
 670   1       static unsigned char data TempSectOfstBA;
 671   1       unsigned char xdata *Fpt;
 672   1       unsigned int data temp_ofst;
 673   1       static unsigned long data SectorBA=0,SumSectorBA,BaseSectBA;
 674   1       Fpt=FATBufA;
 675   1       if(SectorBA==0)
 676   1           {
 677   2            ClusterA.NextClust.value=FirstClust;
 678   2            SumSectorBA=Fat[file_num].Big.value/512+1;
 679   2               }
 680   1       if(SectorBA<=SumSectorBA)
 681   1          {
 682   2               
 683   2               if(SectorBA%sect_clust_a==0)
 684   2                  {
 685   3                       
 686   3                       if(ClusterA.NextClust.value/128!=ClusterA.CurrtClust/128||SectorBA==0)
 687   3                          {
 688   4                               ClusterA.CurrtClust=ClusterA.NextClust.value;
 689   4                               Rd_FAT_a(ClusterA.NextClust.value/128+resv_sect_a+hidd_sect_a);
 690   4                              }
 691   3                       else
 692   3                          {
 693   4                                ClusterA.CurrtClust=ClusterA.NextClust.value;
 694   4                              }
 695   3                                temp_ofst=(ClusterA.CurrtClust%128)*4;                        
 696   3                                ClusterA.NextClust.num[3]=*(Fpt+temp_ofst);
 697   3                                ClusterA.NextClust.num[2]=*(Fpt+temp_ofst+1);
 698   3                                ClusterA.NextClust.num[1]=*(Fpt+temp_ofst+2);
 699   3                                ClusterA.NextClust.num[0]=*(Fpt+temp_ofst+3);
 700   3                                BaseSectBA=(ClusterA.CurrtClust-2)*sect_clust_a+root_a;
 701   3                                TempSectOfstBA=0;                     
 702   3                      }
 703   2               Wr_Sector_a(BaseSectBA+TempSectOfstBA);                   //读一扇区
 704   2               TempSectOfstBA++;
 705   2               SectorBA++;
 706   2              }
 707   1        if(SectorBA>=SumSectorBA) 
 708   1            {
 709   2                 SectorBA=0;
 710   2                 return 0x00;
 711   2                }
 712   1        else return 0xff;
 713   1      }
 714          
 715          
 716          
 717          unsigned char Rd_FAT_b(unsigned long LBA)
 718          {
 719   1        unsigned char sta,i,j,Next_Num=0;
 720   1        unsigned char xdata *pt;
 721   1        sta=0x1f;
 722   1        pt=FATBufB;
 723   1        CH375HM_INDEX_WR_b( DISK_READ );                        //从USB存储器读数据块 
 724   1        CH375HM_DATA_WR_b( (unsigned char)LBA );                //LBA的最低8位 
 725   1        CH375HM_DATA_WR_b( (unsigned char)( LBA >> 8 ) );
C51 COMPILER V8.02   U_FUNC_B                                                              07/21/2008 09:40:01 PAGE 13  

 726   1        CH375HM_DATA_WR_b( (unsigned char)( LBA >> 16 ) );
 727   1        CH375HM_DATA_WR_b( (unsigned char)( LBA >> 24 ) );      //LBA的最高8位 
 728   1        CH375HM_DATA_WR_b( 1 );                           //扇区数 
 729   1        Delay();
 730   1        for(i=0;i<9;i++)
 731   1          {
 732   2              sta=Wait_Int_b();
 733   2           if(sta==0x1f||sta==0x14) return sta;
 734   2               CH375HM_INDEX_WR_b(RD_USB_DATA);
 735   2               Next_Num=CH375HM_DATA_RD_b();
 736   2           for(j=0;j<Next_Num;j++)
 737   2                  {
 738   3                       *pt=CH375HM_DATA_RD_b();
 739   3                       pt++;
 740   3                      }
 741   2                CH375HM_INDEX_WR_b(DISK_RD_GO);
 742   2               }
 743   1      return 0xff;
 744   1      }
 745                                                                            


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   7545    ----
   CONSTANT SIZE    =     59    ----
   XDATA SIZE       =   ----     164
   PDATA SIZE       =   ----    ----
   DATA SIZE        =     26      15
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  9 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

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