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

📄 comm.h~

📁 用Mega32+VS1003做的MP3(FAT32文件系统浏览)——源代码
💻 H~
字号:
#ifndef _COMM_INCLUDED_
#define _COMM_INCLUDED_         

#define CHAR unsigned char
#define BYTE unsigned char
#define WORD unsigned int
#define DWORD unsigned long 

#define MP3_TYPE   0
#define WMA_TYPE   1
#define MID_TYPE   2
#define LRC_TYPE   3
#define TXT_TYPE   4//文本文件
#define MEN_TYPE   5//目录文件    
 
unsigned long Hzk=0;  //零时变量
unsigned long Unit=0;  
unsigned long timer=0;//时间计数器
                                
#define Music_Mode 0
#define Ebook_Mode 1
#define Radio_Mode 2
#define Set_Mode   3 

#define PREV 104   //向上
#define NEXT 240   //向下
#define CYCL 168   //循环模式
#define QUIT 56    //退出
#define PLAY 248   //播放
#define PLAYOVER 0 //播放结束 
                              
bit LYRIC=0;  //是否有Lrc文件标志
bit SINGLE=0; //单曲循环标志
bit PLAYING=0;//正在播放标志 


unsigned char *menu[4]={"音乐  ","电子书","收音机","其他  "};
uchar MenuOper=0; //菜单记录  

//返回值:对应的类型   0,mp3;1,wma;2,wav,3,mid;4,lrc;5,txt;6,file    
flash unsigned char *filetype[7]={"MP3","WMA","WAV","MID","LRC","TXT","   "};
flash unsigned char *hzk12[4]=
{"FONT12  FON",
 "UNITOGB BIN",
 ".          ",
 "..         "
};     
   
unsigned long FAT_MASK;
unsigned int card_size=0;

//簇定义
#define MSDOSFSROOT     0               
#define CLUST_FREE      0               
#define MSDOSFSFREE     CLUST_FREE
#define CLUST_FIRST     2               // 第一个数据簇
#define CLUST_RSRVD     0xfffffff6      // 系统保留簇
#define CLUST_BAD       0xfffffff7      // 坏簇
#define CLUST_EOFS      0xfffffff8      // 第一个结束簇
#define CLUST_EOFE      0xffffffff      // 最后一个结束簇

#define FAT12_MASK      0x00000fff      // FAT12掩码
#define FAT16_MASK      0x0000ffff      // FAT16掩码
#define FAT32_MASK      0x0fffffff      // FAT32掩码
 
// 分区类型
#define PART_TYPE_UNKNOWN		0x00
#define PART_TYPE_FAT12			0x01
#define PART_TYPE_XENIX			0x02
#define PART_TYPE_DOSFAT16		0x04
#define PART_TYPE_EXTDOS		0x05
#define PART_TYPE_FAT16			0x06
#define PART_TYPE_NTFS			0x07
#define PART_TYPE_FAT32			0x0B//11
#define PART_TYPE_FAT32LBA		0x0C
#define PART_TYPE_FAT16LBA		0x0E
#define PART_TYPE_EXTDOSLBA		0x0F
#define PART_TYPE_ONTRACK		0x33
#define PART_TYPE_NOVELL		0x40
#define PART_TYPE_PCIX			0x4B
#define PART_TYPE_PHOENIXSAVE	0xA0
#define PART_TYPE_CPM			0xDB
#define PART_TYPE_DBFS			0xE0
#define PART_TYPE_BBT			0xFF 

//目录要显示的4行文件名
typedef  struct{
    unsigned  char ShortName[12];//短文件名存储	
    unsigned  char LongName[52]; //长文件名存储
    unsigned  long Clust;        //内容的首簇 
    unsigned  long FileLen;      //文件长度    
    unsigned  char Type;         //文件类型  
    unsigned  int  FileIndex;    //文件偏移
}MENU_CONECT; 
MENU_CONECT  m_c[4];
MENU_CONECT CurDir;//记录当前文件夹信息 


//找到的文件信息
typedef struct
{  
	unsigned long Clust;    //当前簇号 
	unsigned int  Nums;     //仅FAT12—FAT16中的根目录区有效
	unsigned char Index;    //当前的BLOCK中目录项索引(偏移量)
	unsigned long Sector;   //当前目录所在的扇区号
	unsigned char NumSector;//决定是否要换簇
}FIND_FILE_INFO; 

//记录第一个分区表的信息
struct partrecord //  16 字节
{			
	BYTE	prIsActive;		// 0x80代表该分区为缺省分区
	BYTE	prStartHead;	// 该分区入口的磁头地址
	WORD	prStartCylSect;	// 该分区入口的扇区地址和柱面地址
	BYTE	prPartType;		// 该分区类型  0b为fat32
	BYTE	prEndHead;		// 该分区结束的扇区地址
	WORD	prEndCylSect;	// 该分区结束的柱面地址
	DWORD	prStartLBA;		// 该分区内第一个扇区地址(DBR所在地址)
	DWORD	prSize;			// 该分区所包含的扇区总数
};        

#define BOOTSIG0        0x55//结束标志
#define BOOTSIG1        0xaa   
struct partsector
{
	CHAR	psPartCode[512-64-2];		// 启动代码 (446 bytes)
	BYTE	psPart[64];					// 四个分区表(64 bytes)
	BYTE	psBootSectSig0;				// 两个签名(2 bytes)
	BYTE	psBootSectSig1; 
};

//系统引导扇区(DOS BOOT RECORD)DBR结构 
//此为磁盘的第一个扇区的数据
#define BOOTSIG2        0
#define BOOTSIG3        0 
struct bootsector710 {
	BYTE	bsJump[3];		 // 跳转指令
	CHAR	bsOEMName[8];	 // 厂商标志和OS版本号
	CHAR	bsBPB[53];		 // BIOS 参数块 BPB
	CHAR	bsExt[26];		 // 扩展BPB
	CHAR	bsBootCode[418]; // 引导扇区代码
	BYTE	bsBootSectSig2;				
	BYTE	bsBootSectSig3;
	BYTE	bsBootSectSig0;	 // 引导扇区签名0x55
	BYTE	bsBootSectSig1;	 // 引导扇区签名0xAA 
};  
//bpb信息 
// BIOS 参数块
struct bpb710 {
		WORD	bpbBytesPerSec;	// 每扇区字节数
		BYTE	bpbSecPerClust;	// 每簇扇区数
		WORD	bpbResSectors;	// 保留区域中的保留扇区数+prStartLBA=FAT表所在扇区
		BYTE	bpbFATs;		// FAT表的份数
		WORD	bpbRootDirEnts;	// 根目录项数
		WORD	bpbSectors;		// 此域为存储卷上的扇区总数
		BYTE	bpbMedia;		// 固定存储介质描述
		WORD	bpbFATsecs;		// FAT表所占的扇区数  fat32=0 ,fat16非0
		WORD	bpbSecPerTrack;	// 每道扇区数
		WORD	bpbHeads;		// 磁头数
		DWORD	bpbHiddenSecs;	// 隐藏扇区数
		DWORD	bpbHugeSectors;	// 总扇区数
		DWORD   bpbBigFATsecs;  // 每个FAT表所占扇区数
		WORD    bpbExtFlags;	// 扩展标志
#define FATNUM    0xf			
#define FATMIRROR 0x80			
		WORD      bpbFSVers;	// 文件系统版本
#define FSVERS    0				
		DWORD     bpbRootClust;	// 根目录簇号
		WORD      bpbFSInfo;	// 文件系统信息扇区号
		WORD      bpbBackup;	// 备份引导扇区
};     

//文件相关属性
typedef struct {
		BYTE		deName[8];          // 文件名
#define SLOT_EMPTY      0x00            // 目录项为空
#define SLOT_E5         0x05            
#define SLOT_DELETED    0xe5            // 文件已被删除
		BYTE		deExtension[3];     // 扩展名
		BYTE		deAttributes;       // 文件属性 
		
#define ATTR_NORMAL     0x00            // 读写
#define ATTR_READONLY   0x01            // 只读
#define ATTR_HIDDEN     0x02            // 隐藏
#define ATTR_SYSTEM     0x04            // 系统文件
#define ATTR_VOLUME     0x08            // 卷标文件
#define ATTR_LONG_FILENAME 0x0f		    // 长文件名文件			    
#define ATTR_DIRECTORY  0x10            // 子目录文件
#define ATTR_ARCHIVE    0x20            // 归档文件 

		BYTE        deLowerCase;        // 系统保留
#define LCASE_BASE      0x08            
#define LCASE_EXT       0x10            
		BYTE        deCHundredth;       // 文件创建时间的10MS
		BYTE        deCTime[2];         // 文件创建时间
		BYTE        deCDate[2];         // 文件创建日期
		BYTE        deADate[2];         // 文件最近访问日期
		WORD        deHighClust; 	    // 文件起始簇号的高16位
		BYTE        deMTime[2];         // 文件最近修改时间
		BYTE        deMDate[2];         // 文件最近修改日期
		WORD        deStartCluster;     // 文件起始簇号的低16位
		DWORD       deFileSize;  	    // 文件长度
}direntry;

// 一个扇区中的目录项数
#define DIRENTRIES_PER_SECTOR	0x10  
// 长文件名入口地址结构
typedef struct
{
		BYTE		weCnt;                //序号
#define WIN_LAST    0x40            
#define WIN_CNT     0x3f
		BYTE		wePart1[10];          //长文件名UNICODE码(第一部分)
		BYTE		weAttributes;         //长文件名目录项标志
#define ATTR_WIN95  0x0f
		BYTE		weReserved1;          //系统保留              
		BYTE		weChksum;             //校验值
		BYTE		wePart2[12];          //长文件名UNICODE码(第二部分)
		WORD       	weReserved2;          //文件开始簇号
		BYTE		wePart3[4];           //长文件名UNICODE码(第三部分)
}winentry;     
 
bit ENLRC=0;//是否显示LRC标志位
typedef struct{ 
	uchar first;   
	uint  t_sec;    //暂存歌词的时间(秒)
	uchar t_ms;     //保存32MS计数脉冲
    ulong Clust;    //歌词文件的当前簇号
    uchar  so;      //缓冲区内的偏移(0-7)         
    uchar  sl;      //簇内扇区偏移(0 -- (SectorsPerCluster-1))
    uint   wl;      //扇内偏移(0-511)   
    //当前文件指针  (fatClustToSect(Clust)+sl)*512+wl*32
    uint  filelen;  //歌词文件的余下的长度
}LYRIC_STRUCT;
LYRIC_STRUCT lyric; //歌词信息


//定义fat根目录的起始位置
typedef union
{
	 unsigned long   Sector;    //FAT12&FAT16有效
	 unsigned long   Clust;     //FAT32时有效
}ROOTDIR_INF;
ROOTDIR_INF RootDir;  //目录区

//fat 特性自定义
#define FAT16 1
#define FAT32 2

#define WIN_CHARS	13      //长文件名入口地址结构可包含13个字符 

//在FAT32中,文件名最长可到255个字符
#define WIN_MAXLEN      255 
// 目录或文件入口地址结构中的时间结构 
#define DT_2SECONDS_MASK        0x1F    // 秒
#define DT_2SECONDS_SHIFT       0
#define DT_MINUTES_MASK         0x7E0   // 分
#define DT_MINUTES_SHIFT        5
#define DT_HOURS_MASK           0xF800  // 时
#define DT_HOURS_SHIFT          11

// 目录或文件入口地址结构中的日期结构 
#define DD_DAY_MASK             0x1F    // 日
#define DD_DAY_SHIFT            0
#define DD_MONTH_MASK           0x1E0   // 月
#define DD_MONTH_SHIFT          5
#define DD_YEAR_MASK            0xFE00  // 年 - 1980
#define DD_YEAR_SHIFT           9  

// 调可函数
void ReadBlock(unsigned long LBA);
unsigned long fatClustToSect(unsigned long clust);
unsigned char fatInit( void);
unsigned int fatClusterSize(void); 
unsigned long fatNextCluster(unsigned long cluster); 

extern uchar BUFFER[512];
uchar pbuffer[512];   

//unsigned char  LONGNAME_BUFFER_ADDR[52];//长文件名缓存
unsigned int  RootDirEnts;       //根目录总的项数(FAT12&FAT16)
unsigned char FatType;  //0:FAT12  1:FAT16   2:FAT32


//unsigned char  DIRNAME_BUFFER_ADDR[30];   
//unsigned char *LongNameBuffer =(unsigned char *) LONGNAME_BUFFER_ADDR;
//unsigned char *DirNameBuffer =	(unsigned char *) DIRNAME_BUFFER_ADDR;
struct partrecord PartInfo;
unsigned char Fat32Enabled;
unsigned long FirstDataSector;  //数据区开始扇区
unsigned int  BytesPerSector;   //每扇区字节数
unsigned int  SectorsPerCluster;//每簇扇区数
unsigned long FirstFATSector;   //fat表所在的扇区
unsigned long FirstDirSector;   //根目录所在的扇区 
#endif

⌨️ 快捷键说明

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