📄 fat16.lst
字号:
C51 COMPILER V7.07 FAT16 11/20/2006 17:50:30 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE FAT16
OBJECT MODULE PLACED IN fat16.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE fat16.c LARGE BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /*
2 *
3 * All rights reserved.
4 *
5 * 文件名称:fat16.c
6 * 文件标识:fat16
7 * 摘 要:fat操作的函数实现
8 *
9 * 当前版本:
10 * 作 者:
11 * 完成日期:
12 *
13 */
14 #include "Fat16.h"
15 #include "Flash.h"
16 #include "uart.h"
17 #include "string.h"
18
19 //数据结构与全局变量定义
20 extern unsigned char Page_Buf[];
21 extern unsigned char SONG[];
22
23 long int Current_Cluster, DataRead = 0, DataRemain = 0, Sector_Offset = 0x21d;
24
25
26 unsigned int TotalCluster, BootSector, RsdSector, SectorofFatSize, TotalCapacity, RootEntry, SecPerClus, T
-otalSector, BytesPerSec, FirstDataSec;
27 unsigned char FAT_TYPE;
28
29 void Init_FAT_Info(void)
30 {
31 1 //int i;
32 1
33 1 ///////////////////////////////////////////////////
34 1 //得到引导扇区所在扇区号,如果介质是不带分区的,则0扇区就是BootSector了。
35 1 ReadPage(Begin_Cluster, 0, Page_Buf);
36 1
37 1 if (!(Page_Buf[0] == 0xeb && Page_Buf[2] == 0x90))
38 1 { //通过判断EB ?? 90来看是否已经是BPB了
39 2 //带分区的介质
40 2 BootSector = Page_Buf[454] + Page_Buf[455] * 256 + Page_Buf[456] * (256 * 256) + Page_Buf[457] * (256 *
-256 * 256);
41 2 }
42 1 else
43 1 {
44 2 BootSector = 0;
45 2 }
46 1 ///////////////////////////////////////////////////
47 1
48 1 ////////////////////////////////////////////////
49 1 //得到保留扇区数,总扇区数,总扇区数/每簇扇区数得到簇数,是FAT类型的依据
50 1 ReadPage(Begin_Cluster, BootSector, Page_Buf);
51 1 RsdSector = Page_Buf[14] + Page_Buf[15] * 256;
52 1 SecPerClus = Page_Buf[13];
53 1
C51 COMPILER V7.07 FAT16 11/20/2006 17:50:30 PAGE 2
54 1 BytesPerSec = Page_Buf[12] * 256 + Page_Buf[11];
55 1
56 1 TotalSector = (Page_Buf[20] * 256 + Page_Buf[19]);
57 1 TotalCapacity = TotalSector * BytesPerSec;
58 1 TotalCluster = TotalSector / SecPerClus;//FAT16的簇总数=扇区总数/每簇扇区数
59 1
60 1 SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
61 1 RootEntry = (Page_Buf[18] * 256 + Page_Buf[17]);
62 1
63 1 FirstDataSec = BootSector + RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / Byt
-esPerSec);
64 1
65 1 if (TotalCluster > 65525)
66 1 { //FAT32的扇区总数和FAT表项长度
67 2 FAT_TYPE = FAT32;
68 2
69 2 if (TotalSector == 0)
70 2 {
71 3 TotalSector = (Page_Buf[32] + Page_Buf[33] * 256 + Page_Buf[34] * 256 * 256 + Page_Buf[35] * 256 * 256
-* 256);
72 3 }
73 2 TotalCapacity = TotalSector * BytesPerSec;
74 2 TotalCluster = TotalSector / SecPerClus;
75 2
76 2 SectorofFatSize = (Page_Buf[36] + Page_Buf[37] * 256 + Page_Buf[38] * 256 * 256 + Page_Buf[39] * 256 * 2
-56 * 256);
77 2 if (SectorofFatSize > (TotalCluster * 16 / 512))
78 2 {
79 3 SectorofFatSize = ((Page_Buf[22] + Page_Buf[23] * 256));
80 3 }
81 2 RootEntry = (Page_Buf[44] * 256 + Page_Buf[43]);
82 2 FirstDataSec = BootSector+RsdSector + (SectorofFatSize * 2) + ((RootEntry * 32 + (BytesPerSec-1)) / Byte
-sPerSec);
83 2
84 2 }
85 1 else if ((TotalCluster > 0) && (TotalCluster < 4085))
86 1 {//FAT12
87 2 FAT_TYPE = FAT12;
88 2 }
89 1 else
90 1 { //FAT16
91 2 FAT_TYPE = FAT16;
92 2 }
93 1 printuf("\nFAT : %x", SectorofFatSize >> 8);
94 1 printuf("%x\n", SectorofFatSize & 0xff);
95 1 printuf("\nDATA : %x", FirstDataSec >> 8);
96 1 printuf("%x\n", FirstDataSec & 0xff);
97 1 }
98
99 unsigned char GetMP3List(void)
100 {
101 1 unsigned char i = 0, j = 0, l = 0;
102 1 int k = 0;
103 1 unsigned char MP3[3] = {'M', 'P', '3'};
104 1 Init_FAT_Info();
105 1
106 1 k = BootSector + RsdSector + 2 * SectorofFatSize;
107 1 printuf("BootSector : %x", BootSector);
108 1 printuf("RsdSector : %x", RsdSector);
109 1 printuf("SectorofFatSize : %x", SectorofFatSize);
110 1
111 1 printuf("RootDIR : %x", (k & 0xff00) >> 8);
C51 COMPILER V7.07 FAT16 11/20/2006 17:50:30 PAGE 3
112 1 printuf("%x\n", k);
113 1
114 1 ReadPage(0 + k / 32, k % 32, Page_Buf);
115 1
116 1 while (Page_Buf[0] != 0)
117 1 {//遍历整个目录
118 2 for (j=0; j<16; j++)
119 2 {
120 3 if (!Page_Buf[j * 32]) break;
121 3 if (Page_Buf[j * 32] == 0xE5) continue;
122 3
123 3 if (!memcmp(MP3, &Page_Buf[j * 32 + 8], 3))
124 3 { //file find
125 4 for (i=0; i<11; i++)
126 4 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -