📄 01.htm
字号:
PLAY:{play();break;} //播放<BR> case
USB:
{usb();break;} //USB下载<BR> key=0;<BR> }<BR> }<BR>}<BR>/////////////////////////////////////////////////////////////////////////////////////////<BR><BR><BR><BR><BR>/*file_system.c
file<BR> Created by Computer-lov. Date:
2005.3.19<BR> Last edited date:
2005.5.31<BR> Copyright (c) 2005
Computer-lov<BR> version 1.1<BR>*/<BR><BR>#include
"file_system.h"<BR>#include "IDE.H"<BR>#include
"hardware.h"<BR>#include "lcd.h"<BR>#include "mp3.h"<BR>#include
"keyboard.h"<BR><BR><BR>FILE xdata file;<BR>unsigned int
dir_length; //文件名长度<BR>unsigned int
folder_length; //文件夹名长度<BR><BR>//////////////////////////////////// 判断是否为一个
MP3 文件 ///////////////////////////////<BR>unsigned
char
is_a_mp3_file(void)<BR>{<BR>if((file.name[0]==0x00)||(file.name[0]==0xE5)||(file.name[0]=='.'))return
0;<BR>if(file.attribute==0x0F)return
0; //此项目为长文件名项目<BR>if(file.attribute & 0x04)return
0; //此文件为系统文件<BR>if(file.attribute & 0x08)return
0; //此项目为系统标卷<BR>if(file.attribute & 0x10)return
0; //此项目为子目录<BR>if((file.name[8]=='M')&&(file.name[9]=='P')&&(file.name[10]=='3'))return
1;<BR>else return
0;<BR>}<BR>///////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>unsigned
long int LAST_FAT_LBA;
<BR>//最后一次读取FAT时的逻辑块地址,用来判断本次读取是否需要重新从硬盘中读取,以加快速度<BR>unsigned int
disp_count=0;<BR>unsigned char
disp_time;<BR><BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>unsigned
long int
get_next_sector(void) //根据当前簇号,获取下一个扇区地址<BR>{<BR>unsigned
long int LBA;<BR>unsigned int
i;<BR>LBA=(file.next_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4); //计算扇区地址<BR>i=(file.next_cluster_number)*4-LBA*dbr[driver_number].bytes_per_sectors;
//计算偏移地址<BR>if(LAST_FAT_LBA!=LBA) //如果数据不在FAT_buffer[]中,则需要重新读取<BR> {<BR> LAST_FAT_LBA=LBA;<BR> LBA=LBA+FAT_start_sector[driver_number];<BR> read_IDE_FAT_sector(LBA);<BR> }<BR>((unsigned
char
*)&(file.next_cluster_number))[3]=FAT_buffer[i];<BR>i++;<BR>((unsigned
char
*)&(file.next_cluster_number))[2]=FAT_buffer[i];<BR>i++;<BR>((unsigned
char
*)&(file.next_cluster_number))[1]=FAT_buffer[i];<BR>i++;<BR>((unsigned
char
*)&(file.next_cluster_number))[0]=FAT_buffer[i]; //获取下一簇号<BR>LBA=file.next_cluster_number-(dbr[driver_number].root_cluster_num); //保存簇号<BR>LBA=LBA*(dbr[0].sectors_per_cluster)+DATA_start_sector[0]; //转换成扇区地址<BR>//
IDE_LED=!IDE_LED; //硬盘指示灯闪烁<BR>disp_time++;<BR>if(disp_time>3)<BR> {<BR> disp_time=0;
<BR> LCD_go_home();<BR> disp_count+=2;<BR> for(i=0;i<14;i++)write_LCD_data(((unsigned
char
*)dir_name)[(i+disp_count)%(dir_length+4)]);<BR> } <BR>return
LBA;<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>///////////////////////////////////////////////// 获取文件夹的下一扇区地址 ///////////////////<BR>unsigned
long int get_dir_next_sector(void)<BR>{<BR>unsigned long int
LBA,LBA2;<BR>unsigned int
i;<BR>LBA=current_dir.current_cluster_number-(dbr[driver_number].root_cluster_num);<BR>LBA=LBA*(dbr[driver_number].sectors_per_cluster)+DATA_start_sector[driver_number];<BR>LBA2=(current_dir.current_cluster_number)/((dbr[driver_number].bytes_per_sectors)/4); //计算扇区地址<BR>i=(current_dir.current_cluster_number)*4-LBA2*dbr[driver_number].bytes_per_sectors; //计算偏移地址<BR>LBA2=LBA2+FAT_start_sector[driver_number];<BR>read_IDE_sector(LBA2);<BR>((unsigned
char
*)&(current_dir.current_cluster_number))[3]=buffer[i];<BR>i++;<BR>((unsigned
char
*)&(current_dir.current_cluster_number))[2]=buffer[i];<BR>i++;<BR>((unsigned
char
*)&(current_dir.current_cluster_number))[1]=buffer[i];<BR>i++;<BR>((unsigned
char
*)&(current_dir.current_cluster_number))[0]=buffer[i]; //获取下一簇号<BR>return
LBA;<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>void
get_nst_file(void) //获取第n个MP3文件<BR>{<BR>unsigned
int i,j,k,temp_count;<BR>unsigned long int LBA;<BR>unsigned char
xdata
temp_buffer[32];<BR>disp_count=0;<BR>temp_count=0;<BR>current_dir.current_cluster_number=current_dir.first_cluster_number;<BR>do<BR> {<BR> LBA=get_dir_next_sector();<BR> for(i=0;i<dbr[driver_number].sectors_per_cluster;i++)<BR> {<BR> read_IDE_sector(LBA);<BR> for(j=0;j<dbr[driver_number].bytes_per_sectors/32;j++)<BR> {<BR> if(j==15){for(k=0;k<32;k++)temp_buffer[k]=buffer[k+512-32];} //如果已到最后一个项,则将之保存<BR> for(k=0;k<11;k++)file.name[k]=buffer[j*32+k];<BR> file.attribute=buffer[j*32+11];<BR> if(is_a_mp3_file())<BR> {<BR> temp_count++;<BR> if(temp_count==play_count)<BR> {<BR> ((unsigned
char
*)&(file.first_cluster_number))[0]=buffer[j*32+0x15];<BR> ((unsigned
char
*)&(file.first_cluster_number))[1]=buffer[j*32+0x14];<BR> ((unsigned
char
*)&(file.first_cluster_number))[2]=buffer[j*32+0x1B];<BR> ((unsigned
char
*)&(file.first_cluster_number))[3]=buffer[j*32+0x1A];<BR> ((unsigned
char
*)&(file.length))[3]=buffer[j*32+0x1C];<BR> ((unsigned
char
*)&(file.length))[2]=buffer[j*32+0x1D];<BR> ((unsigned
char
*)&(file.length))[1]=buffer[j*32+0x1E];<BR> ((unsigned
char
*)&(file.length))[0]=buffer[j*32+0x1F];<BR> file.next_cluster_number=file.first_cluster_number;<BR> dir_length=folder_length;<BR> if(j==0){for(k=0;k<32;k++)buffer[k+512-32]=temp_buffer[k];j=16;} //如果为第一项,则用刚刚保存的一项替换最后一项<BR> {<BR> j--;<BR> if((buffer[j*32+11]==0x0F)&&(buffer[j*32]!=0xE5)) //如果找到长目录,则用长目录名替换短目录名<BR> {<BR> for(k=0;k<10;k++)<BR> {<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x02+k];<BR> k++;<BR> dir_length++;<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+k];dir_length++;<BR> }<BR> for(k=0;k<12;k++)<BR> {<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x0F+k];<BR> dir_length++;<BR> k++;<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x0D+k];<BR> dir_length++;<BR> }<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x1D];dir_length++;<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x1C];dir_length++;<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x1F];dir_length++;<BR> ((unsigned
char
*)dir_name)[dir_length]=buffer[j*32+0x1E];dir_length++;<BR> }<BR> for(k=folder_length/2;k<13+folder_length/2;k++){if((dir_name[k]==0x0000)||(dir_name[k]==0xFF00)||(dir_name[k]==0xFFFF))break;change_code(&(dir_name[k]));}<BR> dir_length=folder_length+(k-folder_length/2)*2;<BR> for(;k<100;k++)dir_name[k]=0x2020;<BR> }<BR> return;<BR> }<BR> }<BR> }<BR> LBA++;<BR> }<BR> }while((!(current_dir.current_cluster_number>=0xFFFFFFF8))&&(LBA<(dpt[driver_number].start_sector+dpt[driver_number].total_sectors)));
//直到文件夹结束<BR>play_count=1;status=STOP;<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>void
get_pre_file(void) //打开上一个MP3文件,文件信息保存在file结构中<BR>{<BR>if(play_count>=2)play_count--;<BR>else
{file.next_cluster_number=file.first_cluster_number;return;}
//如果已到达该文件夹最前一个文件,则播放原文件<BR>get_nst_file();<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>void
get_next_file(void) //打开下一个MP3文件<BR>{<BR>play_count++;<BR>get_nst_file();<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>DIR
xdata current_dir;<BR>unsigned int xdata
dir_name[200];<BR><BR>unsigned int xdata item_name[13];<BR>unsigned
int item_count;<BR>DIR xdata temp_dir;<BR><BR>unsigned char
file_or_folder;<BR><BR>//////////////////////////////////// 判断是否为一个文件夹 ///////////////////////////////<BR>unsigned
char
is_a_folder(void)<BR>{<BR>if((file.name[0]==0x00)||(file.name[0]==0xE5)||(file.name[0]=='.'))return
0;<BR>if(file.attribute==0x0F)return
0; //此项目为长文件名项目<BR>if(file.attribute & 0x04)return
0; //此文件为系统文件<BR>if(file.attribute & 0x08)return
0; //此项目为系统标卷<BR>if(file.attribute & 0x10)return
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -