📄 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 + -