?? mp3._c
字號:
/************************************************************/
/* MP3 Code for M32L */
/* By pasyong */
/* 2006-4 */
/* Base ICC6.31A */
/************************************************************/
#include <iom64v.h>
#include <macros.h>
#include <stdio.h>
#include "1011.h"
#include "mp3.h"
#include "sd.h"
#include "fat.h"
#include "lcd.h"
#include "bmp.h"
#include "delay.h"
void key_port(void)
{
DDRE=0X00;
PORTE=0XFF;
}
void main()
{
key_port();
spi_init();
LCD_Init();
LCD_clear();
LCD_write_String(0,5,"MEGA64L MP3"); // 顯示英文字符串
LCD_draw_map(0,2,AVR_bmp,40,24); // 顯示“AVR”位圖
LCD_draw_map(44,2,china_bmp,36,15); // 顯示”實驗室“位圖
mp3_port_init();vs1003_init();vs1003_init();
sd_port_init();SD_Init();SD_Init();
SPCR = 0x50; //提速
SPSR = 0x01; //setup SPI
fatInit(); //查詢SDFAT格式
if(Fat32Enabled) //設置FAT格式標志
FAT_MASK=FAT32_MASK;
else
FAT_MASK=FAT16_MASK;
while(1)
{
//播放音樂
for(t=3;t<50;t++)
{
flag=0;
mp3_play(fatGetDirEntry(t));
}
}
}
void mp3_play(unsigned long FirstClust)
{
uint32 LBA,NextCluster;
uint16 i,data_pointer,rate;
uint8 n,t1;
NextCluster = FirstClust;
while (1)
{
LBA =fatClustToSect(NextCluster);
for (i=0;i<SectorsPerCluster;i++)
{
if(flag==0) ReadBlock(LBA+i); //讀完后文件指針自動后移
//按鍵處理程序
//ST/PS鍵按下
if(!(PINE&STOP))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&STOP))
{
flag^=0x01;
}
}
//VOLUP鍵按下
if(!(PINE&VOLDOWN))
{
delay_nus(250);
if(!(PINE&VOLDOWN))
{
vol=vol+((uint)(2<<8)+2);
if(vol>=0xFAFA) vol=0xF0F0;
else vs1003_cmd_write(0x0b,vol); //每次左右聲道VOL減2
}
}
//VOLDOWN鍵按下
if(!(PINE&VOLUP))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&VOLUP))
{
vol=vol-((uint)(2<<8)+2);
if(vol<=0x0505) vol=0x0505;
else vs1003_cmd_write(0x0b,vol); //每次左右聲道VOL加2
}
}
//NEXT鍵按下
if(!(PINE&NEXTSONG))
{
while(!(PINE&NEXTSONG));
goto NEXT; //跳到下一首歌曲
}
//PREV鍵按下
if(!(PINE&PREVSONG))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PINE&PREVSONG))
{
t=t-2;goto NEXT; //返回前一首歌曲
}
}
data_pointer=0;
while(data_pointer<512)
{
if(PINB&MP3_DATA_REQ)
{
for(n=0;n<32;n++)
{
vs1003_data_write(BUFFER[data_pointer]);
data_pointer++;
}
}
if (data_pointer==511) break; //如果現在的數據不夠了,則跳出來
}
}
NextCluster = fatNextCluster(NextCluster);
if (NextCluster >=(CLUST_RSRVD&FAT_MASK))break;
}
NEXT: delay_nus(1); /* 下一首歌曲*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -