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

📄 ide.lst

📁 基于AT89C51单片机的程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 216          unsigned int byte_offset;        //字节偏移
 217          unsigned char disk_error=0;     //磁盘错误
 218          
 219          
 220          DPT xdata dpt[4];   //磁盘分区表
 221          DBR xdata dbr[4];   //DOS引导记录
 222          
 223          
 224          unsigned long int xdata FAT_start_sector[4];   //FAT开始扇区
 225          unsigned long int xdata DATA_start_sector[4];  //数据开始扇区
 226          
 227          unsigned char mp3_file_exist=0;
 228          
 229          unsigned char xdata FAT_buffer[512];         //文件分配表FAT缓冲
 230          
 231          //////////////////////////////////////  写扇区计数寄存器   ///////////////////////////////////////////
 232          void write_IDE_sector_count(unsigned char count)
 233          {
 234   1       write_IDE_8(IDE_Sector_Count,count);
 235   1      }
 236          /////////////////////////////////////////////////////////////////////////////////////////////////
 237          
 238          /////////////////////////////////  读取一个FAT扇区,512字节保存在FAT_buffer[]中  ///////////////////////
 239          void read_IDE_FAT_sector(unsigned long int LBA)
 240          {
 241   1       unsigned int i;
C51 COMPILER V7.06   IDE                                                                   03/02/2006 23:11:50 PAGE 5   

 242   1       if(LBA>=(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))return;
 243   1       write_IDE_LBA(LBA);
 244   1       write_IDE_sector_count(1);
 245   1       write_IDE_command(IDE_Read_Sectors);
 246   1       IDE_Address=IDE_Data;
 247   1       set_IDE_address();
 248   1       IDE_DATA_H=0xFF;
 249   1       IDE_DATA_L=0xFF;
 250   1       for(i=0;i<512;i++)
 251   1        {
 252   2         while(!IDE_IORDY);
 253   2         IDE_DIOR=0;
 254   2         FAT_buffer[i]=IDE_DATA_L;
 255   2         i++;
 256   2         FAT_buffer[i]=IDE_DATA_H;
 257   2         IDE_DIOR=1;
 258   2        }
 259   1       IDE_Address=IDE_Bus_Not_Use;
 260   1       set_IDE_address();
 261   1       IDE_DATA_L=0xFF;
 262   1      }
 263          ///////////////////////////////////////////////////////////////////////////////////////////////
 264          
 265          /////////////////////////////////  读取一个数据扇区,512字节保存在buffer[]中 //////////////////
 266          void read_IDE_sector(unsigned long int LBA)
 267          {
 268   1       unsigned int i;
 269   1       if(LBA>=(dpt[driver_number].start_sector+dpt[driver_number].total_sectors))return;
 270   1       write_IDE_LBA(LBA);
 271   1       write_IDE_sector_count(1);
 272   1       write_IDE_command(IDE_Read_Sectors);
 273   1       IDE_Address=IDE_Data;
 274   1       set_IDE_address();
 275   1       IDE_DATA_H=0xFF;
 276   1       IDE_DATA_L=0xFF;
 277   1       for(i=0;i<512;i++)
 278   1        {
 279   2         while(!IDE_IORDY);
 280   2         IDE_DIOR=0;
 281   2         buffer[i]=IDE_DATA_L;
 282   2         i++;
 283   2         buffer[i]=IDE_DATA_H;   
 284   2         IDE_DIOR=1;
 285   2        }
 286   1       IDE_Address=IDE_Bus_Not_Use;
 287   1       set_IDE_address();
 288   1       IDE_DATA_L=0xFF;
 289   1      }
 290          ///////////////////////////////////////////////////////////////////////////////////////////////
 291          
 292          unsigned int play_count;  //当前文件夹中播放曲号
 293          
 294          /////////////////////////////////////   获取磁盘信息  /////////////////////////////////////////
 295          void get_IDE_information(void)
 296          {
 297   1       unsigned int i;
 298   1       unsigned long int LBA=0;
 299   1       mp3_file_exist=0;
 300   1       LBA=0;
 301   1       read_IDE_sector(LBA);
 302   1       for(i=0;i<4;i++)
 303   1       {
C51 COMPILER V7.06   IDE                                                                   03/02/2006 23:11:50 PAGE 6   

 304   2        dpt[i].file_system_type=buffer[0x1C2+i*16];       //文件系统类型
 305   2        ((unsigned char *)&(dpt[i].start_sector))[3]=buffer[0x1C6+i*16];
 306   2        ((unsigned char *)&(dpt[i].start_sector))[2]=buffer[0x1C7+i*16];
 307   2        ((unsigned char *)&(dpt[i].start_sector))[1]=buffer[0x1C8+i*16];
 308   2        ((unsigned char *)&(dpt[i].start_sector))[0]=buffer[0x1C9+i*16];  //分区开始扇区
 309   2        ((unsigned char *)&(dpt[i].total_sectors))[3]=buffer[0x1CA+i*16];
 310   2        ((unsigned char *)&(dpt[i].total_sectors))[2]=buffer[0x1CB+i*16];
 311   2        ((unsigned char *)&(dpt[i].total_sectors))[1]=buffer[0x1CC+i*16];
 312   2        ((unsigned char *)&(dpt[i].total_sectors))[0]=buffer[0x1CD+i*16];  //分区总扇区
 313   2       }
 314   1       
 315   1       if((buffer[510]!=0x55)||(buffer[511]!=0xAA))disk_error=1;
 316   1       LBA=dpt[0].start_sector;          //C盘
 317   1       read_IDE_sector(LBA);
 318   1       DISK_CAPACITY[7]=buffer[0x0B];
 319   1       DISK_CAPACITY[6]=buffer[0x0C];     //每扇区字节数
 320   1       ((unsigned char *)&(dbr[0].bytes_per_sectors))[0]=buffer[0x0C];
 321   1       ((unsigned char *)&(dbr[0].bytes_per_sectors))[1]=buffer[0x0B];  //每扇区字节数
 322   1       dbr[0].sectors_per_cluster=buffer[0x0D];                        //每簇扇区数
 323   1       ((unsigned char *)&(dbr[0].reserve_sectors))[1]=buffer[0x0E];
 324   1       ((unsigned char *)&(dbr[0].reserve_sectors))[0]=buffer[0x0F];   //保留扇区数
 325   1       dbr[0].num_of_FAT=buffer[0x10];                                  //FAT副本数
 326   1       ((unsigned char *)&(dbr[0].FAT16_ROOT_num))[1]=buffer[0x11];
 327   1       ((unsigned char *)&(dbr[0].FAT16_ROOT_num))[0]=buffer[0x12];     //FAT16文件系统的根目录数
 328   1       ((unsigned char *)&(dbr[0].small_sectors))[1]=buffer[0x13];
 329   1       ((unsigned char *)&(dbr[0].small_sectors))[0]=buffer[0x14];
 330   1       ((unsigned char *)&(dbr[0].sectors_per_FAT16))[1]=buffer[0x16];
 331   1       ((unsigned char *)&(dbr[0].sectors_per_FAT16))[0]=buffer[0x17];
 332   1       ((unsigned char *)&(dbr[0].hidden_sectors))[3]=buffer[0x1C];
 333   1       ((unsigned char *)&(dbr[0].hidden_sectors))[2]=buffer[0x1D];
 334   1       ((unsigned char *)&(dbr[0].hidden_sectors))[1]=buffer[0x1E];
 335   1       ((unsigned char *)&(dbr[0].hidden_sectors))[0]=buffer[0x1F];
 336   1       ((unsigned char *)&(dbr[0].large_sectors))[3]=buffer[0x20];
 337   1       ((unsigned char *)&(dbr[0].large_sectors))[2]=buffer[0x21];
 338   1       ((unsigned char *)&(dbr[0].large_sectors))[1]=buffer[0x22];
 339   1       ((unsigned char *)&(dbr[0].large_sectors))[0]=buffer[0x23];
 340   1       DISK_CAPACITY[0]=buffer[0x23];
 341   1       DISK_CAPACITY[1]=buffer[0x22];
 342   1       DISK_CAPACITY[2]=buffer[0x21];
 343   1       DISK_CAPACITY[3]=buffer[0x20];
 344   1       ((unsigned char *)&(dbr[0].sectors_per_FAT32))[3]=buffer[0x24];
 345   1       ((unsigned char *)&(dbr[0].sectors_per_FAT32))[2]=buffer[0x25];
 346   1       ((unsigned char *)&(dbr[0].sectors_per_FAT32))[1]=buffer[0x26];
 347   1       ((unsigned char *)&(dbr[0].sectors_per_FAT32))[0]=buffer[0x27];
 348   1       ((unsigned char *)&(dbr[0].root_cluster_num))[3]=buffer[0x2C];
 349   1       ((unsigned char *)&(dbr[0].root_cluster_num))[2]=buffer[0x2D];
 350   1       ((unsigned char *)&(dbr[0].root_cluster_num))[1]=buffer[0x2E];
 351   1       ((unsigned char *)&(dbr[0].root_cluster_num))[0]=buffer[0x2F];
 352   1       if((buffer[510]!=0x55)||(buffer[511]!=0xAA))disk_error=2;
 353   1       FAT_start_sector[0]=dpt[0].start_sector+dbr[0].reserve_sectors;
 354   1       DATA_start_sector[0]=FAT_start_sector[0]+(dbr[0].num_of_FAT)*(dbr[0].sectors_per_FAT32);
 355   1       LBA=DATA_start_sector[0];
 356   1       driver_number=C_;
 357   1       current_dir.first_cluster_number=dbr[0].root_cluster_num;
 358   1       play_count=1;
 359   1       item_count=1;
 360   1       get_nst_item();
 361   1      }
 362          //////////////////////////////////////////////////////////////////////////////////////////////////////////
             -//
 363          
 364          /*void read_IDE_buffer(void)
C51 COMPILER V7.06   IDE                                                                   03/02/2006 23:11:50 PAGE 7   

 365          {
 366           write_IDE_command(IDE_Read_Buffer);
 367          }*/
 368          
 369          /*void write_IDE_buffer(void)
 370          {
 371           write_IDE_command(IDE_Write_Buffer);
 372          }*/
 373          
 374          /*
 375          void write_IDE_sector(unsigned long int LBA)
 376          {
 377           unsigned int i;
 378           write_IDE_LBA(LBA);
 379           write_IDE_sector_count(1);
 380           write_IDE_command(IDE_Write_Sectors);
 381           IDE_Address=IDE_Data;
 382           set_IDE_address();
 383           for(i=0;i<512;i++)
 384            {
 385             while(!IDE_IORDY);
 386             IDE_DIOW=0;
 387             IDE_DATA_L=buffer[i];
 388             i++;
 389             IDE_DATA_H=buffer[i];
 390             IDE_DIOW=1;
 391            }
 392           wait_IDE_busy();
 393           IDE_Address=IDE_Bus_Not_Use;
 394           set_IDE_address();
 395          }
 396          */
 397          
 398          /////////////////////////////////////////////    IDE 初始化  /////////////////////////////////////////
 399          void IDE_initial(void)
 400          {
 401   1       unsigned char i;
 402   1       reset_IDE();
 403   1       for(i=2;i<200;i++)dir_name[i]=0x2020;
 404   1       do
 405   1        {
 406   2         write_IDE_8(IDE_Drive_Head,0xE0);
 407   2         read_IDE_status();
 408   2        }while(IDE_BSY);
 409   1       wait_IDE_busy();
 410   1       write_IDE_8(IDE_Device_Control,0xFA);//没有中断模式
 411   1       dir_name[0]='C'+0xA380;
 412   1       ((unsigned char *)dir_name)[2]=':';
 413   1       ((unsigned char *)dir_name)[3]='\\';
 414   1       folder_length=4;
 415   1       dir_length=folder_length;
 416   1       not_root_dir=0;
 417   1       get_IDE_information();
 418   1      }
 419          ///////////////////////////////////////////////////////////////////////////////////////////////////////
 420          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   1546    ----
   CONSTANT SIZE    =     11    ----
   XDATA SIZE       =   1204    ----
C51 COMPILER V7.06   IDE                                                                   03/02/2006 23:11:50 PAGE 8   

   PDATA SIZE       =   ----    ----
   DATA SIZE        =     17      16
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


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

⌨️ 快捷键说明

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