📄 源程序.htm
字号:
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>
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>
// LBA=DATA_start_sector[driver_number];<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>
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>
return;<br>
}<br>
}<br>
}<br>
LBA++;<br>
}<br>
}while(!(current_dir.current_cluster_number>=0xFFFFFFF8));
//直到文件夹结束<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>
<br>
/*<br>
Initial.c file<br>
Created by Computer-lov Date: 2005.3.19<br>
Copyright (c) 2005 Computer-lov<br>
version 1.0<br>
*/<br>
<br>
#include "Initial.h"<br>
#include "IDE.h"<br>
#include "AT89C51SND1C.H"<br>
#include "keyboard.h"<br>
#include "hardware.h"<br>
<br>
//////////////////////////////////////////////////<br>
void PLL_initial(void) //PLL初始化<br>
{<br>
// PLLRDIV=0x02; //使用16M晶振,产生192M频率<br>
// PLLNDIV=0x00;<br>
PLLRDIV=(0x5F)>>2; //使用20M晶振,产生192M频率<br>
PLLNDIV=0x09;<br>
PLLCON=0xC8; //复位PLL<br>
PLLCON=0xC2; //使能PLL<br>
CKCON=0x01;<br>
while(!PLOCK); //等待PLL锁定<br>
}<br>
//////////////////////////////////////////////////<br>
<br>
//////////////////////////////////////////////////<br>
void RAM_initial(void) //RAM初始化<br>
{<br>
AUXR=0x0C; //禁止外部RAM,使用内部2KRAM<br>
}<br>
//////////////////////////////////////////////////<br>
<br>
//////////////////////////////////////////////////<br>
void interrupt_initial(void) //中断初始化<br>
{<br>
EA=0;<br>
EAUD=0;<br>
EMP3=0;<br>
ES=0;<br>
ET1=0;<br>
EX1=0;<br>
ET0=0;<br>
EX0=0;<br>
<br>
IEN1=0x10; //允许键盘中断<br>
<br>
IPH0=0x00; //优先级设置为默认<br>
IPH1=0x00;<br>
IPL0=0x00;<br>
IPL1=0x00;<br>
EA=1;<br>
}<br>
//////////////////////////////////////////////////<br>
<br>
/*void timer_initial(void)<br>
{<br>
<br>
}*/<br>
<br>
<br>
//////////////////////////////////////////////////<br>
void MP3_decoder_initial(void) //MP3解码器初始化<br>
{<br>
MP3CON=0x3F;<br>
MP3CLK=0x07; //MP3解码时钟为32MHz<br>
MP3_decoder_disen(); //先停止MP3解码器<br>
}<br>
//////////////////////////////////////////////////<br>
<br>
//////////////////////////////////////////////////<br>
void DAC_initial(void) //DAC初始化<br>
{<br>
AUDCON0=0x72; // 256Fs<br>
// AUDCON0=0x73; //384Fs<br>
AUDCON1=0x00;<br>
}<br>
//////////////////////////////////////////////////<br>
<br>
//////////////////////////////////////////////////<br>
void keyboard_initial(void) //键盘初始化<br>
{<br>
KBCON=0x00; //低电平触发,允许中断<br>
KBSTA=0x80; //允许键盘从休眠模式唤醒<br>
}<br>
//////////////////////////////////////////////////<br>
<br>
//////////////////////////////////////////////////<br>
void system_initial(void) //系统开机初始化<br>
{<br>
IDE_DATA_L=IDE_Bus_Not_Use;<br>
IDE_ALE=1;<br>
IDE_ALE=0; //IDE数据总线初始化为高阻状态<br>
<br>
PLL_initial();<br>
MP3_decoder_initial();<br>
RAM_initial();<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -