📄 mp3.lst
字号:
347 1 {
348 2 for(i=0;i<1024;i++)//第一次要向解码器缓存中置入1024字节
349 2 {
350 3 if(j==512)//当用完512字节时
351 3 {
352 4 m=ReadSector(SongName,Page_Buf);//读取当前歌曲的下一个512字节
353 4 j=0;
354 4 }
355 3 MP3DAT=Page_Buf[j++];//向MP3解码器数据寄存器送入一个数
356 3 while(!PlayState) ; //如果是暂停状态则等待
357 3 while(ChangeSong) {DataRead=0;ChangeSong=0;return;}//如果选曲时,则重新播放当前曲目
358 3 while(!(MP3STA1&MPBREQ));//等待中断再次产生
359 3
360 3 }
361 2 }
362 1
363 1 //Other MP3 data
364 1 // while(1){
C51 COMPILER V6.23a MP3 12/02/2003 11:07:53 PAGE 7
365 1 while(MP3STA1&MPFREQ) {//解码器数据请求中断产生时
366 2 if(j==512){//当用完512字节时
367 3 j=0;
368 3 if(m<512) {NowPlaying++;return;}//如果上一次从歌曲中读出的数据不足512时,则结束本歌曲播放
369 3
370 3 m=ReadSector(SongName,Page_Buf);//读取当前歌曲的下一个512字节
371 3 }
372 2 MP3DAT=Page_Buf[j++];//向MP3解码器数据寄存器送入一个数
373 2 while(!PlayState) ;//如果是暂停状态则等待
374 2 while(ChangeSong) {DataRead=0;ChangeSong=0;return;}//如果选曲时,则重新播放当前曲目
375 2 while(!(MP3STA1&MPBREQ)) ;//等待中断再次产生
376 2 }
377 1 // }
378 1
379 1 }
380
381 void KeyBoardInit()
382 {
383 1 P1=0x0f; //将端口1的低四位,即键盘对应的4位置1
384 1 KBCON=0x00;//设置键盘有效模式为低电平有效,并使能中断Low Level,Enable Interrupt
385 1 IEN1=IEN1|EKB; //使能键盘中断Enable KeyBoard Interrupt
386 1
387 1 }
388
389 void Func()
390 {
391 1 if(CurrentFun<3) CurrentFun++;//在选曲/音量调节/音效调节三者间切换
392 1 else if(CurrentFun==3) CurrentFun=1;
393 1 }
394 void Next()//按下"下一首/音量减小"键时的处理
395 {
396 1
397 1 switch(CurrentFun){//如果当前处于音量调节功能
398 2 case VOLUME :
399 2 {
400 3 if(MP3VOR>0x00)//当前音量没有达到最小时
401 3 {
402 4 MP3VOR-=0x01;//右声道音量增大一档
403 4 MP3VOL-=0x01;//左声道音量增大一档
404 4 }
405 3
406 3 break;
407 3 }
408 2 case EFFECTION ://如果处于音效调节功能
409 2 {
410 3 if(MP3BAS>7){//降低重音效果
411 4 MP3BAS-=7;
412 4 MP3MED=0x0f;
413 4 MP3TRE+=7;
414 4 }
415 3 break;
416 3 }
417 2 case SELECTSONG ://如果处理MP3选取功能
418 2 {
419 3 if(NowPlaying==(NumofSong-1)) NowPlaying=0;//如果已经处于最后一首了,则指向第一首
420 3 else NowPlaying++; //否则,指向下一首
421 3 ChangeSong=1; //置选曲标志位
422 3 break;
423 3 }
424 2 default:break;
425 2 }
426 1 }
C51 COMPILER V6.23a MP3 12/02/2003 11:07:53 PAGE 8
427 void Previous()//按下"上一首/音量增大"键时的处理
428 {
429 1 switch(CurrentFun){
430 2 case VOLUME ://如果当前处于音量调节功能
431 2 {
432 3 if(MP3VOR<0x1f)//当前音量没有达到最大时
433 3 {
434 4 MP3VOR+=0x01;//右声道音量增大一档
435 4 MP3VOL+=0x01;//左声道音量增大一档
436 4 }
437 3
438 3 break;
439 3 }
440 2 case EFFECTION ://如果处于音效调节功能
441 2 {
442 3 if(MP3BAS<0x1d){//增加重音效果
443 4 MP3BAS+=7;
444 4 MP3MED=0x0f;
445 4 MP3TRE-=7;
446 4 }
447 3 break;
448 3 }
449 2 case SELECTSONG ://如果处理MP3选取功能
450 2 {
451 3 if(NowPlaying>0)NowPlaying--;//如果当前播放歌曲不为第一首,则指向上一首
452 3 else NowPlaying=NumofSong-1;//如果当前已经到达第一首,则指向最后一首
453 3 ChangeSong=1; //置选曲标志位
454 3 break;
455 3 }
456 2 default:break;
457 2 }
458 1 }
459 void PlayPause()
460 {
461 1 PlayState=!PlayState; //按一下播放键时,改变播放状态
462 1
463 1 }
464 void key_interrupt() interrupt 11
465 {
466 1 unsigned char i=0;
467 1 EA=0; //关中断
468 1 IEN1&=(~EKB); //Enable KeyBoard Interrupt
469 1 i=KBSTA; //取键盘中断位
470 1 switch(i){ //依次处理四个键中的某个键被按下时的情况
471 2 case 1: Func();break;
472 2 case 2: Next();break;
473 2 case 4: Previous();break;
474 2 case 8: PlayPause();break;
475 2 default:break;
476 2 }
477 1 IEN1|=EKB; //Enable KeyBoard Interrupt
478 1 EA=1; //开中断
479 1 return;
480 1 }
481
482 void main()
483 {
484 1
485 1 // int i,j;
486 1 printu("UP-TECH MP3 Player Test!\n");
487 1 P3_5 = 0x01;//USBLED off
488 1 P3_3 = 0; //P3_3=0 LCD Power off,P3_3=1 LCD Power on
C51 COMPILER V6.23a MP3 12/02/2003 11:07:53 PAGE 9
489 1
490 1 printu("Entering MP3...\n");
491 1 Flash_Reset();//Flash复位
492 1 MP3Init();//MP3初始化
493 1 KeyBoardInit();//键盘初始化
494 1
495 1 EA=1;//开中断,键盘可以开始工作
496 1 NumofSong=GetMP3List();//得到U盘中的MP3歌曲列表
497 1 printuf("Song:%x\n",NumofSong);//输出歌曲总数信息
498 1 if(NumofSong==0) printu("There is no MP3 file in USB Disk!\n");
499 1 P3_5=0;//打开USB灯亮
500 1
501 1 while(1) {
502 2 if(NumofSong!=0) PlayMP3(&SONG[11*NowPlaying]);//如果处于播放状态,则播放当前歌曲
503 2 if(NowPlaying==NumofSong) PlayState=STOP; //全部歌曲播放完了,播放器停止
504 2 }
505 1
506 1 }
507
508
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1455 ----
CONSTANT SIZE = 290 ----
XDATA SIZE = 95 49
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -