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

📄 main.i

📁 用Mega32+VS1003做的MP3(FAT32文件系统浏览)——源代码
💻 I
📖 第 1 页 / 共 3 页
字号:
    for(;i<offset+2;i++)buf[k++]=Read_Byte_SPI();	
    for(;i<512;i++)Read_Byte_SPI();
    Read_Byte_SPI();
    Read_Byte_SPI();
    reading=0; 
    PORTB  |=0X10    ;        //关闭SD卡         
    return (*((unsigned int*) &((char*)buf)[0])) ; 
}      
//连续读取指定扇区offset偏移位置,bytes个数据
void SD_Read_Bytes(unsigned long address,unsigned char *buf,unsigned int offset,unsigned int bytes)
{
    unsigned char temp=0;unsigned int i=0;
    reading=1;
    temp=SD_Write_Command(17,address<<9);     //读出RESPONSE     
    while (Read_Byte_SPI()!= 0xfe);//直到读取到了数据的开始头0XFE,才继续
 	for(i=0;i<offset;i++)  Read_Byte_SPI();
    for(;i<offset+bytes;i++)   *buf++=Read_Byte_SPI();	
    for(;i<512;i++) Read_Byte_SPI();
    Read_Byte_SPI();
    Read_Byte_SPI();
    reading=0; 
    PORTB  |=0X10    ;        //关闭SD卡
} 

//正点原子@scut 08/09/11
//很多部分参考网友的


 
unsigned long Hzk=0;  //零时变量
unsigned long Hzk=0;  unsigned long Unit=0;  
unsigned long timer=0;//时间计数器
                                

                              
bit LYRIC=0;  //是否有Lrc文件标志
bit SINGLE=0; //单曲循环标志
bit PLAYING=0;//正在播放标志 


unsigned char *menu[4]={"音乐  ","电子书","收音机","其他  "};
unsigned char 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;

//簇定义

 
// 分区类型

//目录要显示的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 字节
{			
	unsigned char	prIsActive;		// 0x80代表该分区为缺省分区
	unsigned char	prStartHead;	// 该分区入口的磁头地址
	unsigned int	prStartCylSect;	// 该分区入口的扇区地址和柱面地址
	unsigned char	prPartType;		// 该分区类型  0b为fat32
	unsigned char	prEndHead;		// 该分区结束的扇区地址
	unsigned int	prEndCylSect;	// 该分区结束的柱面地址
	unsigned long 	prStartLBA;		// 该分区内第一个扇区地址(DBR所在地址)
	unsigned long 	prSize;			// 该分区所包含的扇区总数
};        

struct partsector
{
	unsigned char	psPartCode[512-64-2];		// 启动代码 (446 bytes)
	unsigned char	psPart[64];					// 四个分区表(64 bytes)
	unsigned char	psBootSectSig0;				// 两个签名(2 bytes)
	unsigned char	psBootSectSig1; 
};

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

//文件相关属性
typedef struct {
		unsigned char		deName[8];          // 文件名
		unsigned char		deExtension[3];     // 扩展名
		unsigned char		deAttributes;       // 文件属性 
		

		unsigned char        deLowerCase;        // 系统保留
		unsigned char        deCHundredth;       // 文件创建时间的10MS
		unsigned char        deCTime[2];         // 文件创建时间
		unsigned char        deCDate[2];         // 文件创建日期
		unsigned char        deADate[2];         // 文件最近访问日期
		unsigned int        deHighClust; 	    // 文件起始簇号的高16位
		unsigned char        deMTime[2];         // 文件最近修改时间
		unsigned char        deMDate[2];         // 文件最近修改日期
		unsigned int        deStartCluster;     // 文件起始簇号的低16位
		unsigned long        deFileSize;  	    // 文件长度
}direntry;

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


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

//fat 特性自定义


//在FAT32中,文件名最长可到255个字符
// 目录或文件入口地址结构中的时间结构 

// 目录或文件入口地址结构中的日期结构 

// 调可函数
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 unsigned char BUFFER[512];
unsigned char 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;   //根目录所在的扇区 
/* CodeVisionAVR C Compiler
   Prototypes for standard library functions

   (C) 1998-2003 Pavel Haiduc, HP InfoTech S.R.L.
*/




#pragma used+
#pragma used+

int atoi(char *str);
long int atol(char *str);
float atof(char *str);
void itoa(int n,char *str);
void ltoa(long int n,char *str);
void ftoa(float n,unsigned char decimals,char *str);
void ftoe(float n,unsigned char decimals,char *str);
void srand(int seed);
int rand(void);
void *malloc(unsigned int size);
void *calloc(unsigned int num, unsigned int size);
void *realloc(void *ptr, unsigned int size); 
void free(void *ptr);

#pragma used-
#pragma library stdlib.lib


// CodeVisionAVR C Compiler
// (C) 1998-2007 Pavel Haiduc, HP InfoTech S.R.L.

// Prototypes for string functions



#pragma used+
#pragma used+

char *strcat(char *str1,char *str2);
char *strcatf(char *str1,char flash *str2);
char *strchr(char *str,char c);
signed char strcmp(char *str1,char *str2);
signed char strcmpf(char *str1,char flash *str2);
char *strcpy(char *dest,char *src);
char *strcpyf(char *dest,char flash *src);
unsigned int strlenf(char flash *str);
char *strncat(char *str1,char *str2,unsigned char n);
char *strncatf(char *str1,char flash *str2,unsigned char n);
signed char strncmp(char *str1,char *str2,unsigned char n);
signed char strncmpf(char *str1,char flash *str2,unsigned char n);
char *strncpy(char *dest,char *src,unsigned char n);
char *strncpyf(char *dest,char flash *src,unsigned char n);
char *strpbrk(char *str,char *set);
char *strpbrkf(char *str,char flash *set);
char *strrchr(char *str,char c);
char *strrpbrk(char *str,char *set);
char *strrpbrkf(char *str,char flash *set);
char *strstr(char *str1,char *str2);
char *strstrf(char *str1,char flash *str2);
char *strtok(char *str1,char flash *str2);
 
unsigned int strlen(char *str);
void *memccpy(void *dest,void *src,char c,unsigned n);
void *memchr(void *buf,unsigned char c,unsigned n);
signed char memcmp(void *buf1,void *buf2,unsigned n);
signed char memcmpf(void *buf1,void flash *buf2,unsigned n);
void *memcpy(void *dest,void *src,unsigned n);
void *memcpyf(void *dest,void flash *src,unsigned n);
void *memmove(void *dest,void *src,unsigned n);
void *memset(void *buf,unsigned char c,unsigned n);
unsigned int strcspn(char *str,char *set);
unsigned int strcspnf(char *str,char flash *set);
int strpos(char *str,char c);
int strrpos(char *str,char c);
unsigned int strspn(char *str,char *set);
unsigned int strspnf(char *str,char flash *set);

#pragma used-
#pragma library string.lib


//正点原子@scut 08/09/11
//很多部分参考网友(波仔)的
   
void UniToGB(unsigned char *pbuf); 
unsigned char IsHzk12File(unsigned char *pbuf)
{ 
	unsigned char i;   
	for(i=0;i<11;i++)if(hzk12[0][i]!=pbuf[i]) break;  
    if(i==11)return 1;  //find ok    
    return 0;
}
unsigned char IsUnitogbFile(unsigned char *pbuf)
{ 
	unsigned char i;
	for(i=0;i<11;i++)if(hzk12[1][i]!=pbuf[i])break;   
    if(i==11)return 1;   //find ok    
    return 0;
}           
//返回根目录簇号
unsigned long fatGetRootClust(void)
{
    if(FatType==2)return RootDir.Clust;
    return 0x00000000; 
} 
//*************************************************************************
//读一个扇区
//LBA:物理扇区编号(DBR) 
//************************************************************************* 
void ReadBlock(unsigned long LBA)
{    
    SD_Read_Block(LBA<<9); 
}
//*************************************************************************
//读一个扇区到数组

⌨️ 快捷键说明

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