📄 02.htm
字号:
指令 ////////////////////////////////////////////////////<BR>void
write_LCD_command(unsigned char
command)<BR>{<BR>wait_LCD_busy();<BR>LCD_RS=0;<BR>LCD_RW=0;<BR>LCD_EN=1;<BR>LCD_DATA=command;<BR>LCD_EN=0;<BR>LCD_DATA=0xFF;<BR>}<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>///////////////////////////
LCD清屏
////////////////////////////////////////////////////////////<BR>void
LCD_cls(void)<BR>{<BR>write_LCD_command(0x01);<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>//////////////////////////// LCD
从第一行开始显示 ///////////////////////////////////////////<BR>void
LCD_go_home(void)<BR>{<BR>write_LCD_command(0x80);<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>//////////////////////////// LCD
换到第二行开始 /////////////////////////////////////////////<BR>void
LCD_line_feed(void)<BR>{<BR>write_LCD_command(0x90);<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>//////////////////////////// LCD
初始化 //////////////////////////////////////////////////////<BR>void
LCD_initial(void)<BR>{<BR>wait_LCD_busy();<BR>write_LCD_command(0x18);<BR>write_LCD_command(0x01);<BR>write_LCD_command(0x0C);<BR>LCD_cls();<BR>black=0;<BR>prints("开机......");<BR>write_LCD_command(0x8E);<BR>write_LCD_data('
');<BR>}<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>//////////////////////////// LCD显示一字符串 ////////////////////////////////////////////////<BR>void
prints(unsigned char *
temp)<BR>{<BR>while((*temp)!='\0')<BR> {<BR> write_LCD_data(*temp);<BR> temp++;<BR> }<BR>}<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>////////////////////////// LCD显示一个长整数 /////////////////////////////////////////////////<BR>void
printf(unsigned long int x)<BR>{<BR>signed char i;<BR>unsigned char
display_buffer[10];<BR>display_buffer[10]=0;<BR>for(i=9;i>=0;i--)<BR> {<BR> display_buffer[i]='0'+x%10;<BR> x/=10;<BR> }<BR>for(i=0;i<9;i++)<BR> {<BR> if(display_buffer[i]!='0')break;<BR> }<BR>for(;i<10;i++)write_LCD_data(display_buffer[i]);<BR>}<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR>////////////////////////////// 将Unicode编码转换为
GB编码 ///////////////////////////////////<BR>void
change_code(unsigned int * x)<BR>{<BR>unsigned int
a,b,c;<BR>if(((*x)>=0x0020)&&((*x)<=0x007E)){if((*x)>='a'&&(*x)<='z')(*x)-='a'-'A';*x+=0xA380;return;}<BR>if((*x)<Unicode[0][0]){*x=0x3F3F;return;}<BR>if((*x)>Unicode[UNICODE_MAX-1][0]){*x=0x3F3F;return;}<BR>a=0;<BR>b=UNICODE_MAX-1;<BR>do //采用二分查表法,因为该表为顺序表<BR> {<BR> c=(a+b)/2;<BR> if((*x)==Unicode[c][0]){*x=Unicode[c][1];return;}<BR> if((*x)<Unicode[c][0]){b=(a+b)/2;}<BR> else
{a=(a+b+1)/2;}<BR> }while(a!=b);<BR>if((*x)==Unicode[a][0]){*x=Unicode[a][1];return;}<BR>*x=0x3F3F; //如果找不到,则显示??<BR>}<BR>////////////////////////////////////////////////////////////////////////////////////////////////////<BR><BR><BR><BR><BR>/*
MP3.C File<BR> The MP3 play
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
"AT89C51SND1C.H"<BR>#include "Initial.h"<BR>#include
"file_system.h"<BR>#include "IDE.H"<BR>#include
"keyboard.h"<BR>#include "hardware.h"<BR>#include
"MP3.H"<BR>#include "LCD.H"<BR><BR>unsigned char
status; //程序运行状态<BR><BR>extern unsigned char
mp3_file_exist;<BR><BR>void DAC_start(unsigned char
clk) //DAC开始工作<BR>{<BR>set_DAC_CLK(clk); //根据MP3文件,设置相应的DAC时钟频率<BR>DAC_interface_en();<BR>DAC_data_request_en();<BR>}<BR><BR><BR>unsigned
char xdata
function,vol,bas,med,tre; //保存音量等设置<BR><BR>code unsigned
char MPEGVer[2][7]={"MPEG-2","MPEG-1"}; //版本显示信息<BR>code unsigned
char
Fs[8]={22,44,24,48,16,32,22,44}; //采样率<BR>code
unsigned char
DACFs[8]={33,16,30,15,46,22,33,16}; //256Fs<BR>//code
unsigned char DACFs[8]={22,10,20,9,30,15,0,0};
//384Fs<BR><BR>/////////////////////////// MP3
play /////////////////////////////////////////<BR>void
play(void)<BR>{<BR>unsigned long int LBA;<BR>unsigned int
i;<BR>unsigned char sectors_count;<BR>signed long int
file_length;<BR>unsigned char count;<BR>unsigned char
MPEG_inf; //用来保存MP3版本和采样率<BR><BR>/*<BR>bit0=0
vertion 2<BR>bit0=1 bertion
1<BR>*/<BR>LCD_go_home();<BR>prints(" ");<BR>LCD_line_feed();<BR>prints(" ");<BR>file_length=file.length;<BR>LBA=file.next_cluster_number-(dbr[driver_number].root_cluster_num);<BR>LBA=LBA*(dbr[driver_number].sectors_per_cluster)+DATA_start_sector[driver_number];<BR><BR>MP3_CRC_disen();<BR><BR>sectors_count
=
dbr[driver_number].sectors_per_cluster;<BR><BR>read_IDE_sector(LBA);<BR>if(buffer[0]!=0xFF){pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}<BR>if((buffer[1]&0x06)!=0x02){pause();MP3_decoder_disen();DAC_interface_disen();key=0;LCD_line_feed();prints("MP3
层错误!! ");while(!key);get_next_file();return;}<BR>////////////////////////
从MP3侦头中获取采样率和压缩版本信息 //////////////<BR>MPEG_inf=buffer[2]&0x0C;
//采样率<BR>MPEG_inf>>=1;<BR>if((buffer[1]&0x18)==0x18)MPEG_inf=MPEG_inf
| 0x01; //版本1<BR>if((buffer[1]&0x18)==0x10)MPEG_inf=MPEG_inf
&
(~0x01); //版本2<BR>///////////////////////////////////////////////////////////////////////////<BR><BR>//////////////////////// 填充1K数据 ////////////////////////////////////<BR>for(i=0;i<512;i++)MP3DAT=buffer[i];<BR>LBA++;<BR>sectors_count--;<BR>if(file_length>512)file_length-=512;<BR>else
{pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}<BR>if(sectors_count==0){LBA=get_next_sector();sectors_count=dbr[driver_number].sectors_per_cluster;}<BR>read_IDE_sector(LBA);<BR>for(i=0;i<512;i++)MP3DAT=buffer[i];<BR>LBA++;<BR>sectors_count--;<BR>if(file_length>512)file_length-=512;<BR>else
{pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}<BR>if(sectors_count==0){LBA=get_next_sector();sectors_count=dbr[driver_number].sectors_per_cluster;}<BR><BR>MP3_decoder_en(); //启动解码器<BR>DAC_start(DACFs[MPEG_inf]);
//初始化DAC接口<BR>byte_offset=512;<BR>key=KEY_FUN;<BR>function=FUN_MAX;<BR>while(1)<BR> {<BR> if(key) //如果有键按下<BR> {<BR> switch
(key)<BR> {<BR> case
KEY_FUN: //功能键按下<BR> {<BR> function++;<BR> if(function>=FUN_MAX)function=FUN_SEL;<BR> switch
(function)<BR> {<BR> case
FUN_SEL:LCD_go_home();for(count=0;count<14;count++)write_LCD_data(((unsigned
char *)dir_name)[count]);LCD_line_feed();prints("当前曲号:
");printf(play_count);LED1=1;LED2=1;LED3=1;break;<BR> case
FUN_VOL:LCD_line_feed();prints("音量:
");printf(vol);prints(" ");LED1=0;LED2=1;LED3=0;break;<BR> case
FUN_BAS:LCD_line_feed();prints("低音:
");printf(bas);prints(" ");LED1=1;LED2=1;LED3=0;break;<BR> case
FUN_MED:LCD_line_feed();prints("中音:
");printf(med);prints(" ");LED1=1;LED2=0;LED3=1;break;<BR> case
FUN_TRE:LCD_line_feed();prints("高音:
");printf(tre);prints(" ");LED1=0;LED2=1;LED3=1;break;<BR> case
FUN_BOOT:LCD_line_feed();prints("重低音:
");if(MP3CON&0x40)prints("开");else
prints("关");prints(" ");LED1=0;LED2=0;LED3=0;break;<BR> }<BR> key=0;break;<BR> }<BR> case
KEY_UP: //上翻键按下<BR> {<BR> switch
(function)<BR> {<BR> case
FUN_SEL:{MP3_decoder_disen();DAC_interface_disen();get_pre_file();LCD_go_home();for(count=0;count<14;count++)write_LCD_data(((unsigned
char *)dir_name)[count]);LCD_line_feed();prints("当前曲号:
");printf(play_count);key=0;return;}<BR> case
FUN_VOL:{if(vol<31)vol++;set_vol(vol);set_vor(vol);LCD_line_feed();prints("音量:
");printf(vol);prints(" ");break;}<BR> case
FUN_BAS:{if(bas<31)bas++;set_bas(bas);LCD_line_feed();prints("低音:
");printf(bas);prints(" ");break;}<BR> case
FUN_MED:{if(med<31)med++;set_med(med);LCD_line_feed();prints("中音:
");printf(med);prints(" ");break;}<BR> case
FUN_TRE:{if(tre<31)tre++;set_tre(tre);LCD_line_feed();prints("高音:
");printf(tre);prints(" ");break;}<BR> case
FUN_BOOT:{MP3_bass_boost();LCD_line_feed();prints("重低音:
");prints("开");prints(" ");break;}<BR> }<BR> key=0;break;<BR> }<BR> case
KEY_DOWN: //下翻键按下<BR> {<BR> switch
(function)<BR> {<BR> case
FUN_SEL:{MP3_decoder_disen();DAC_interface_disen();get_next_file();LCD_go_home();for(count=0;count<14;count++)write_LCD_data(((unsigned
char *)dir_name)[count]);LCD_line_feed();prints("当前曲号:
");printf(play_count);key=0;return;}<BR> case
FUN_VOL:{if(vol>0)vol--;set_vol(vol);set_vor(vol);LCD_line_feed();prints("音量:
");printf(vol);prints(" ");break;}<BR> case
FUN_BAS:{if(bas>0)bas--;set_bas(bas);LCD_line_feed();prints("低音:
");printf(bas);prints(" ");break;}<BR> case
FUN_MED:{if(med>0)med--;set_med(med);LCD_line_feed();prints("中音:
");printf(med);prints(" ");break;}<BR> case
FUN_TRE:{if(tre>0)tre--;set_tre(tre);LCD_line_feed();prints("高音:
");printf(tre);prints(" ");break;}<BR> case
FUN_BOOT:{MP3_no_bass_boost();LCD_line_feed();prints("重低音:
");prints("关");prints(" ");break;}<BR> }<BR> key=0;break;<BR> }<BR> case
KEY_OK:<BR> {<BR> MP3_decoder_disen();<BR> DAC_interface_disen();<BR> status=STOP;<BR> for(i=(folder_length/2);i<(7+folder_length/2);i++)dir_name[i]=0x2020;<BR> LCD_line_feed();<BR> prints("停止 ");<BR> key=0;<BR> return;<BR> }<BR> }<BR> }<BR> while(MPFREQ)<BR> {<BR> if((((unsigned
char
*)&byte_offset)[0])&0xFE)<BR> {<BR> read_IDE_sector(LBA);<BR> LBA++;<BR> byte_offset=0;<BR> sectors_count--;<BR> file_length-=512;<BR> while(MPFREQ)<BR> {<BR> MP3DAT=buffer[byte_offset];<BR> byte_offset++;<BR> if((((unsigned
char
*)&byte_offset)[0])&0xFE)break;<BR> }<BR> if(file_length<=0)
{pause();MP3_decoder_disen();DAC_interface_disen();get_next_file();key=0;return;}<BR> if(sectors_count==0){LBA=get_next_sector();sectors_count=(dbr[driver_number].sectors_per_cluster);}<BR> }<BR> if(MPFREQ)<BR> {<BR> MP3DAT=buffer[byte_offset];<BR> byte_offset++;<BR> }<BR> }<BR> }<BR>}<BR>///////////////////////////////////////////////////////////////////////////////////////////<BR><BR><BR>
<P align=center>
<CENTER></CENTER>
<P></P>
<P><FONT color=#336699><STRONG>签名:</STRONG></FONT><BR>
<DIV align=right>
<TABLE cellSpacing=0 cellPadding=0 border=0>
<TBODY>
<TR>
<TD class=text9><FONT
color=#ff0000>声明:本人所有发言均为个人观点。由此贴带来的后果,<BR> 本人一般不予负责。在您相信本贴之前,请慎重考虑!<BR> <BR> computer00</FONT></TD></TR>
<TR></TR></TBODY></TABLE></DIV>
<P></P></TD></TR></TBODY></TABLE><BR></TD></TR></TBODY></TABLE><IMG height=5
src="C:\Documents and Settings\liweihua\My Documents\硬盘mp3源代码\02.files\blank(1).gif"
width=1><BR>
<CENTER>
<TABLE cellSpacing=3 cellPadding=0 align=center border=0>
<TBODY>
<TR>
<TD>
<SCRIPT language=javascript src="02.files/ShowBoardAd.htm"></SCRIPT>
</TD>
<TD width=119><!--放置站内通告开始 -->
<MARQUEE onmouseover="if (document.all!=null){this.stop()}"
style="HEIGHT: 60px" onmouseout="if (document.all!=null){this.start()}"
scrollAmount=4 scrollDelay=400 direction=up><A
href="http://www.cnhxzy.com/index.htm"
target=_blank>电子线路板制作就像打印一样简单!!!</A> <BR><A href="http://www.whkj.com/"
target=BoardList>微打 编程器 键盘显示芯片 仿真器 实验仪 示波器 虚拟仪器;;我们专业供应!</A> <BR><!--放置站内通告结束 --></MARQUEE></TD></TR></TBODY></TABLE></CENTER>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -