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

📄 u_func_a.lst

📁 c8051f020+CH375读写U盘文件的程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
 250          ------读A盘扇区程序---------------------------------------------------
 251          ********************************************************************************
 252          说明: 写入单片机中数据缓冲区
 253                入口参数:扇区号LBA
 254                    出口参数:0x14:操作成功,0x1f:操作失败
 255          *******************************************************************************/
 256          unsigned char Rd_Sector_a(unsigned long LBA)
 257          {
 258   1        unsigned char sta,i,j,Next_Num=0;
 259   1        unsigned char xdata *pt;
 260   1        sta=0x1f;
 261   1        pt=Data_Buf;
*** WARNING C182 IN LINE 261 OF U_FUNC_A.C: pointer to different objects
 262   1        CH375HM_INDEX_WR_a( DISK_READ );                        /* 从USB存储器读数据块 */
 263   1        CH375HM_DATA_WR_a( (unsigned char)LBA );                /* LBA的最低8位 */
 264   1        CH375HM_DATA_WR_a( (unsigned char)( LBA >> 8 ) );
 265   1        CH375HM_DATA_WR_a( (unsigned char)( LBA >> 16 ) );
 266   1        CH375HM_DATA_WR_a( (unsigned char)( LBA >> 24 ) );      /* LBA的最高8位 */
 267   1        CH375HM_DATA_WR_a( 1 );                           /* 扇区数 */ 
 268   1        Delay();
 269   1        for(i=0;i<9;i++)
 270   1          {
 271   2              sta=Wait_Int_a();
 272   2           if(sta==0x1f||sta==0x14) return sta;
 273   2               CH375HM_INDEX_WR_a(RD_USB_DATA);
 274   2               Next_Num=CH375HM_DATA_RD_a();
 275   2           for(j=0;j<Next_Num;j++)
 276   2                  {
 277   3                       *pt=CH375HM_DATA_RD_a();
 278   3                       pt++;
 279   3                      }
 280   2                CH375HM_INDEX_WR_a(DISK_RD_GO);
 281   2               }
 282   1      return 0xff;
 283   1      }
 284          
 285          /*******************************************************************************
 286          ------写A盘扇区程序---------------------------------------------------
 287          ********************************************************************************
 288          说明: 入口参数:扇区号LBA
 289                    出口参数:无
 290          *******************************************************************************/
 291          void Wr_Sector_a(unsigned long LBA)
 292          {
 293   1       unsigned char sta,i,j;
 294   1        unsigned char xdata *pt;
 295   1        sta=0x1f;
 296   1        pt=Data_Buf;
*** WARNING C182 IN LINE 296 OF U_FUNC_A.C: pointer to different objects
 297   1        CH375HM_INDEX_WR_a( DISK_WRITE );                        /* 写数据块到USB存储器 */
 298   1        CH375HM_DATA_WR_a( (unsigned char)LBA );                /* LBA的最低8位 */
 299   1        CH375HM_DATA_WR_a( (unsigned char)( LBA >> 8 ) );
 300   1        CH375HM_DATA_WR_a( (unsigned char)( LBA >> 16 ) );
C51 COMPILER V8.02   U_FUNC_A                                                              07/21/2008 09:40:01 PAGE 6   

 301   1        CH375HM_DATA_WR_a( (unsigned char)( LBA >> 24 ) );      /* LBA的最高8位 */
 302   1        CH375HM_DATA_WR_a( 1 );                           /* 扇区数 */ 
 303   1        Delay();
 304   1        for(i=0;i<9;i++)
 305   1          {
 306   2           sta=sta=Wait_Int_a();
 307   2           if(sta==0x1f||sta==0x14) return;
 308   2               CH375HM_INDEX_WR_a(WR_USB_DATA7);
 309   2               CH375HM_DATA_WR_a(64);
 310   2               for(j=0;j<64;j++)
 311   2                 {
 312   3                  CH375HM_DATA_WR_a(*pt);
 313   3                      pt++;
 314   3                 }
 315   2               CH375HM_INDEX_WR_a(DISK_WR_GO);
 316   2              }
 317   1      }
 318          
 319          /*******************************************************************************
 320          ------读CH375的中断状态---------------------------------------------------
 321          ********************************************************************************
 322          说明: 入口参数:无
 323                    出口参数:中断状态
 324          *******************************************************************************/
 325          unsigned char Wait_Int_a()
 326          {
 327   1       unsigned sta=0,temp=0;
 328   1       while(temp!=0x40) 
 329   1         temp=P3IF&0x40;
 330   1       P3IF&=0xbf;//清中断6的中断标志
 331   1       CH375HM_INDEX_WR_a(GET_STATUS);
 332   1       Delay();
 333   1       sta=CH375HM_DATA_RD_a();
 334   1       return sta;
 335   1      }
 336          
 337          
 338          /*******************************************************************************
 339          ------读A盘的基本数据---------------------------------------------------
 340          ********************************************************************************
 341          说明: 入口参数:无
 342                    出口参数:0x14:操作成功,0x1f:操作失败
 343          *******************************************************************************/
 344          unsigned char Get_Base_a()
 345          {
 346   1       unsigned char a,b;
 347   1       unsigned char xdata *pt;
 348   1       Rd_Sector_a(0x00000000);
 349   1       pt=Data_Buf;
*** WARNING C182 IN LINE 349 OF U_FUNC_A.C: pointer to different objects
 350   1       a=*pt;b=*(pt+1);         
 351   1       if(a!=0xeb&&b!=0x58)
 352   1          {
 353   2               hidd_sect_a=*(pt+0x1c6);
 354   2               Rd_Sector_a( (unsigned long)hidd_sect_a );
 355   2              }
 356   1       a=*pt;b=*(pt+1);
 357   1       if(a==0xeb&&b==0x58)
 358   1         {
 359   2          hidd_sect_a=*(pt+0x1c);
 360   2              byte_sect_a=*(pt+0x0b)+(*(pt+0x0c)<<8);
 361   2              sect_clust_a=*(pt+0x0d);
C51 COMPILER V8.02   U_FUNC_A                                                              07/21/2008 09:40:01 PAGE 7   

 362   2              resv_sect_a=*(pt+0x0e)+(*(pt+0x0f)<<8);
 363   2          sect_fat_a=*(pt+0x24)+(*(pt+0x25)<<8);
 364   2              root_a=hidd_sect_a+resv_sect_a+2*sect_fat_a;
 365   2              return 0x14;
 366   2         }
 367   1       else return 0x1f; 
 368   1      }
 369          
 370          /*******************************************************************************
 371          ------显示A盘盘名---------------------------------------------------
 372          ********************************************************************************
 373          说明: 入口参数:无
 374                    出口参数:无
 375          *******************************************************************************/
 376          void Show_Disk_a()
 377          {
 378   1       unsigned char i;
 379   1       unsigned char  *disk_name_a;            
 380   1       unsigned char xdata *pt;
 381   1       unsigned int data charact;                      
 382   1       Rd_Sector_a(root_a);
 383   1       pt=Data_Buf;
*** WARNING C182 IN LINE 383 OF U_FUNC_A.C: pointer to different objects
 384   1       for(i=0;i<16;i++)
 385   1         {
 386   2      //   charact=Data_Buf[0x0b+i*32];       //这种也赋不了
 387   2              charact=*(pt+0x0b+i*32);          //charact不定义为data就赋不了值。???
 388   2          if(charact==0x08) 
 389   2             {
 390   3              disk_name_a=pt+i*32;              //disk_name定义成指向xdata也赋不了值。???
 391   3              *(disk_name_a+11)=0;
 392   3              LCD_Printf(1,2,disk_name_a);
 393   3              return;
 394   3             }
 395   2         }
 396   1      
 397   1      }  
 398          
 399          /*******************************************************************************
 400          ------读长文件项---------------------------------------------------
 401          ********************************************************************************
 402          说明: 入口参数:无
 403                    出口参数:无
 404          *******************************************************************************/
 405          void Get_Lfat_a()
 406          {
 407   1       unsigned char xdata *pt;
 408   1       unsigned char temp1,temp2,i=0,*na,nai=0;
 409   1       unsigned int Temp_Ofst;
 410   1       unsigned char which[26]={1,3,5,7,9,14,16,18,20,22,24,28,30};  //确定长文件名储存的地方
 411   1       pt=Data_Buf;
*** WARNING C182 IN LINE 411 OF U_FUNC_A.C: pointer to different objects
 412   1       na=Fat[Currt_File].name;
 413   1       if(St_Ofst_a==0)                //若短文件名在扇区的第一个32字节,则指向上一个扇区的最后32字节
 414   1          {
 415   2               Rd_Sector_a(Rd_Rec.Last_Sect);
 416   2               Temp_Ofst=480;           
 417   2              }
 418   1       else Temp_Ofst=St_Ofst_a-32;//若短文件名不在本扇区的第一个32字节,则指向上一个32字节
 419   1       do{  //读长文件名  
 420   2          while(i<13)
 421   2              {
C51 COMPILER V8.02   U_FUNC_A                                                              07/21/2008 09:40:01 PAGE 8   

 422   3          temp1=*(pt+Temp_Ofst+which[i]);
 423   3              if(temp1==0x2e) 
 424   3                {
 425   4                 *(na+nai)=0;
 426   4                 break;
 427   4                }
 428   3              temp2=*(pt+Temp_Ofst+which[i]+1);
 429   3              if(temp2!=0)
 430   3                {  
 431   4                 *(na+nai)=0x7e;
 432   4                 *(na+nai+1)=0x31;
 433   4                 *(na+nai+2)=0;
 434   4                 break;
 435   4                }                                      
 436   3              *(na+nai)=temp1;
 437   3              nai++;
 438   3              i++;
 439   3              }
 440   2              if(Temp_Ofst==0)  //若已在本扇区最开始
 441   2          {
 442   3               if(*(pt+Temp_Ofst)<0x3f) break; //若是长文件名的最后一段
 443   3               else
 444   3                 {
 445   4                  Rd_Sector_a(Rd_Rec.Last_Sect);
 446   4                  Temp_Ofst=512;
 447   4                 }
 448   3              }
 449   2              Temp_Ofst-=32;
 450   2         }while(*(pt+Temp_Ofst+32)<0x3f);
 451   1         Rd_Sector_a(Rd_Rec.Currt_Sect);
 452   1      }
 453          
 454          
 455          /*******************************************************************************
 456          ------读A盘文件名---------------------------------------------------
 457          ********************************************************************************
 458          说明: 目前只读一个扇区中的文件名
 459                入口参数:文件夹首簇号
 460                    出口参数:0xff:文件名已读完,其他:已读文件数
 461          *******************************************************************************/
 462          unsigned char Dis_Fat_In_Clust_a(unsigned long Menu_Clust)
 463          {
 464   1       unsigned long Menu_LBA;
 465   1       unsigned char *na,i,j,rd_short=0;
 466   1       unsigned char xdata *pt;
 467   1       St_Ofst_a=0;
 468   1       Currt_File=0;
 469   1       File_Over=0;
 470   1       Menu_LBA=(Menu_Clust-2)*sect_clust_a+root_a;
 471   1       Rd_Rec.Currt_Sect=Rd_Rec.Last_Sect=Menu_LBA;
 472   1       Rd_Rec.Next_Sect=Rd_Rec.Currt_Sect+1;
 473   1      
 474   1      
 475   1       while(Rd_Rec.Currt_Sect-Menu_LBA<sect_clust_a)  //读完整个簇
 476   1         {
 477   2          Rd_Sector_a(Rd_Rec.Currt_Sect);
 478   2         pt=Data_Buf;
*** WARNING C182 IN LINE 478 OF U_FUNC_A.C: pointer to different objects
 479   2          if(*(pt+St_Ofst_a)!=0xe5&&*(pt+St_Ofst_a+11)!=0x0f&&*(pt+St_Ofst_a+11)!=0x08&&*(pt+St_Ofst_a)!=0x2e)         
             -//判断是否为有效文件
 480   2                {
 481   3                na=Fat[Currt_File].ext;                 //读扩展名
C51 COMPILER V8.02   U_FUNC_A                                                              07/21/2008 09:40:01 PAGE 9   

 482   3                for(i=0;i<3;i++)
 483   3                   {
 484   4                         *(na+i)=*(pt+St_Ofst_a+8+i);
 485   4                       }
 486   3                
 487   3      //        Fat[Currt_File].St_Clust=*(pt+St_Ofst+0x1a)+*(pt+St_Ofst+0x1b)<<8+*(pt+St_Ofst+0x14)<<16;       //定义Fat
             -[Currt_File].St_Clust为一个长整型这样赋不了值?
 488   3            
 489   3                Fat[Currt_File].St_Clust.num[3]=*(pt+St_Ofst_a+0x1a);    //起始簇
 490   3                Fat[Currt_File].St_Clust.num[2]=*(pt+St_Ofst_a+0x1b);
 491   3                Fat[Currt_File].St_Clust.num[1]=*(pt+St_Ofst_a+0x14);
 492   3                Fat[Currt_File].St_Clust.num[0]=*(pt+St_Ofst_a+0x15);
 493   3      //        Fat[Currt_File].Big=*(pt+St_Ofst+0x1c)+*(pt+St_Ofst+0x1d)<<8+*(pt+St_Ofst+0x1e)<<16+*(pt+St_Ofst+0x1f
             -)<<24;        //这个跟Fat[Currt_File].St_Clust一样赋不了??
 494   3                Fat[Currt_File].Big.num[0]=*(pt+St_Ofst_a+0x1f);  //文件大小
 495   3                Fat[Currt_File].Big.num[1]=*(pt+St_Ofst_a+0x1e);
 496   3                Fat[Currt_File].Big.num[2]=*(pt+St_Ofst_a+0x1d);
 497   3                Fat[Currt_File].Big.num[3]=*(pt+St_Ofst_a+0x1c);
 498   3      
 499   3                Fat[Currt_File].Sector=Rd_Rec.Currt_Sect;   //文件目录项所在的扇区

⌨️ 快捷键说明

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