|
可通過UISO查看鏡像文件,感興趣的小伙伴們可以完善程序,添加一些有趣的命令。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
微信圖片_20181009214741.png (94.16 KB, 下載次數: 123)
下載附件
2018-10-10 19:57 上傳
0.png (56.41 KB, 下載次數: 122)
下載附件
2018-10-11 00:19 上傳
單片機源程序如下:
- #include "../config.h"
- INT8U xdata BufDat[512];
- FATInfo xdata BPBInfo;
- FILE xdata *FileInfo;
- INT8U OpenFileFlag;
- void Read_Sector(INT32U offset)
- {
- read_IDE_DAT_sector(offset,&BufDat[0]);
- }
- INT32U B2S(INT32U Data,INT8U DataLen) //小端轉為大端
- {
- INT32U temp=0;
- INT32U fact=1;
- INT8U i;
- Data <<= ((4 - DataLen) * 8);
- for(i=0;i<DataLen;i++)
- {
- temp += ((INT8U*)&(Data))[i] * fact;
- fact *= 256;
- }
- return temp;
- }
- Get_FatInfo(INT32U offset)
- {
- DBR *Bpb = (DBR*)BufDat;
- Read_Sector(offset);
- BPBInfo.FATSectors = B2S(Bpb -> BPB_FATSz32,4); //一個FAT表所占的扇區數
- BPBInfo.BytePerSector = B2S(Bpb -> BPB_BytesPerSec,2); //每扇區字節數
- BPBInfo.SectorsPerClust = Bpb -> BPB_SecPerClus; //第簇扇區數
- BPBInfo.FirstDirClust = B2S(Bpb -> BPB_RootClus,4); //根目錄在第幾簇
- BPBInfo.FirstFATSector = B2S(Bpb -> BPB_RsvdSecCnt,2); //第一個FAT表的位置
- BPBInfo.RootDirSector = BPBInfo.FirstFATSector + (BPBInfo.FATSectors * Bpb -> BPB_NumFATs); //根目錄在哪個扇區
- }
- Get_File(INT32U offset)
- {
- FILE xdata *FileInfo;
- Read_Sector(BPBInfo.RootDirSector);
- FileInfo = (FILE*)&BufDat[offset];
- if((FileInfo -> FileAttributes == (ATTR_READ_ONLY|ATTR_HIDDEN|ATTR_SYSTEM|ATTR_VOLUME_ID))||(FileInfo -> FileName[0] == NOPDIR)||(FileInfo -> FileName[0] == NOPDIRF))return;
- Prints(FileInfo -> FileName,8);
- if(FileInfo -> FileAttributes != ATTR_DIRECTORY)
- {
- Prints(".",513);
- Prints(FileInfo -> FileExtension,3);
- Prints(" is ",513);
- Prints(FileInfo -> FileExtension,3);
- Prints(" File",513);
- }else{Prints(" is Direct",513);}
- Prints("\x0d\x0a",2);
- }
- INT32U FindNextClust(INT32U Clust)
- {
- INT32U *NextClust;
- Read_Sector(BPBInfo.FirstFATSector+(INT32U)((Clust*4)/512));
- NextClust = &BufDat[Clust*4];
- return B2S(NextClust[0],4);
- }
-
- INT32U Sector2Clust(INT32U NowSector)
- {
- return NowSector/BPBInfo.SectorsPerClust;
- }
- INT32U Clust2Sector(INT32U Clust)
- {
- return Clust*BPBInfo.SectorsPerClust;
- }
- void OpenTxtFile()
- {
- INT16U i;
- INT32U FileRootSector;
- INT32U FileRootClust;
- INT32U NextClust;
- Read_Sector(BPBInfo.RootDirSector);
- // Prints("Start Open ",513);
- // Prints(FileInfo -> FileName,8);
- // Prints(".",1);
- // Prints(FileInfo -> FileExtension,3);
- // Prints(" File\x0d\x0a",513);
- FileRootClust = (INT32U)(B2S(FileInfo -> FileHighClust,2))<<16|(INT32U)(B2S(FileInfo -> FileLowClust,2));
- FileRootSector = Clust2Sector(FileRootClust-BPBInfo.FirstDirClust)+BPBInfo.RootDirSector;
- while(NextClust != FileOverClust)
- {
- for(i=0;i<BPBInfo.SectorsPerClust;i++)
- {
- Read_Sector(Clust2Sector(FileRootClust-BPBInfo.FirstDirClust)+BPBInfo.RootDirSector+i);
- Prints(BufDat,512);
- }
- NextClust = FindNextClust(FileRootClust);
- FileRootClust = NextClust;
- }
- }
- void Disp_FileCreateDate()
- {
- INT8U xdata TimeBuf[11];
- INT8U month,day;
- INT16U year;
- year = (B2S(FileInfo -> FileMDate,2)&0xf800)>>9;
- year+=1980;
- month = (B2S(FileInfo -> FileMDate,2)&0x1e0)>>5;
- day = (B2S(FileInfo -> FileMDate,2)&0x001f);
- TimeBuf[0] = year/1000+'0';
- TimeBuf[1] = year%1000/100+'0';
- TimeBuf[2] = year%1000%100/10+'0';
- TimeBuf[3] = year%10+'0';
- TimeBuf[4] = '-';
- TimeBuf[5] = month/10+'0';
- TimeBuf[6] = month%10+'0';
- TimeBuf[7] = '-';
- TimeBuf[8] = day/10+'0';
- TimeBuf[9] = day%10+'0';
- Prints("\r\n",513);
- Prints(TimeBuf,11);
- }
- void Disp_FileCreateTime()
- {
- INT8U xdata TimeBuf[5];
- INT8U hour,mine;
- hour = (B2S(FileInfo -> FileMTime,2)&0xf800)>>11;
- mine = (B2S(FileInfo -> FileMTime,2)&0x07e0)>>5;
- TimeBuf[0] = hour/10+'0';
- TimeBuf[1] = hour%10+'0';
- TimeBuf[2] = ':';
- TimeBuf[3] = mine/10+'0';
- TimeBuf[4] = mine%10+'0';
- Prints(" ",513);
- Prints(TimeBuf,5);
- Prints(" ",513);
- }
-
- void int2string(INT32U dat,INT8U *buf)
- {
- INT8U temp;
- if(dat<1024);
- {
- temp = 0;
- }
- if((dat>=1024)&&(dat<1048576))
- {
- dat/=1024;
- temp = 1;
- }
- if(dat>=(1048576)&&dat<1073741824)
- {
- dat/=1048576;
- temp = 2;
- }
- if(dat>=1073741824)
- {
- dat/=1073741824;
- temp = 3;
- }
- buf[2] =dat%10 + '0';
- buf[1] = dat%100/10 + '0';
- buf[0] = dat%1000/100 +'0';
- Prints(buf,3);
- switch(temp)
- {
- case 0:
- Prints("B ",513);
- break;
- case 1:
- Prints("KB",513);
- break;
- case 2:
- Prints("MB",513);
- break;
- case 3:
- Prints("GB",513);
- break;
- }
- }
-
- INT8U FindFile(INT8U *FileName,INT8U *FileExtension)
- {
- INT32U NowClust,NextClust,Sector,offset;
- INT32U xdata FileSize;
- INT8U xdata FILESIZEBUF[4];
- INT8U FileNum,DirNum;
- NowClust=BPBInfo.FirstDirClust;
- while(NowClust!=FileOverClust)
- {
- for(Sector=0;Sector<BPBInfo.SectorsPerClust;Sector++)
- {
- Read_Sector(BPBInfo.RootDirSector+Clust2Sector(NextClust) + Sector);
- for(offset=0;offset<16;offset++)
- {
- FileInfo = (FILE*)&BufDat[offset*32];
- if((FileInfo -> FileAttributes == (ATTR_READ_ONLY|ATTR_HIDDEN|ATTR_SYSTEM|ATTR_VOLUME_ID))||(FileInfo -> FileName[0] == NOPDIR)||(FileInfo -> FileName[0] == NOPDIRF))continue;
- {
- if((strncmp(FileName,FileInfo -> FileName,8) == 0)||(FileName[0] == '*'))
- if((strncmp(FileExtension,FileInfo -> FileExtension,3) == 0)||(FileExtension[0] == '*'))
- {
- if(OpenFileFlag == 0)
- {
- FileSize = B2S(FileInfo -> FileSize,4);
- Disp_FileCreateDate();
- Disp_FileCreateTime();
- if(FileInfo -> FileAttributes == ATTR_DIRECTORY)Prints("<DIR> ",513);
- else
- {
- int2string(FileSize,&FILESIZEBUF[0]);
- Prints(" ",513);
- }
- Prints(FileInfo -> FileName,8);
- if(FileInfo -> FileAttributes != ATTR_DIRECTORY)
- {
- Prints(".",513);
- Prints(FileInfo -> FileExtension,3);
- FileNum++;
- }else DirNum++;
- }
- else return 1;
- if((FileName[0] != '*')&&(FileExtension[0] != '*'))return 1;
- }
- }
- }
- }
- NextClust=FindNextClust(NowClust);
- NowClust=NextClust;
- }
- if(OpenFileFlag != 1)
- {
- Prints("\r\n ",513);
- FILESIZEBUF[0] = FileNum/100+'0';
- FILESIZEBUF[1] = FileNum%100/10+'0';
- FILESIZEBUF[2] = FileNum%10+'0';
- Prints(FILESIZEBUF,3);
- Prints(" File(s)",513);
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
psufs.rar
(1.87 MB, 下載次數: 45)
2018-10-10 19:58 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|