📄 main.i
字号:
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 + -