📄 mp3.c
字号:
#include <iom32v.h>
#include <macros.h>
#include <string.h>
#include <stdio.h>
#include "1011.h"
#include "12232.h"
#include "mp3.h"
#include "375interface.h"
unsigned int vol=0X2020; //音量变量
unsigned int c; //歌曲INDEX
unsigned char flag=0; //停止按键开关量
/* 以下定义的详细说明请看CH375HF9.H文件 */
#define LIB_CFG_FILE_IO 1 /* 文件读写的数据的复制方式,0为"外部子程序",1为"内部复制" */
#define LIB_CFG_INT_EN 0 /* CH375的INT#引脚连接方式,0为"查询方式",1为"中断方式" */
/* 单片机的RAM有限,其中CH375子程序用512字节,剩余RAM部分可以用于文件读写缓冲 */
#define FILE_DATA_BUF_LEN 0x0200 /* 外部RAM的文件数据缓冲区,缓冲区长度不小于一次读写的数据长度 */
/* 如果准备使用双缓冲区交替读写,那么不要定义FILE_DATA_BUF_LEN,而是在参数中指定缓冲区起址,用CH375FileReadX代替CH375FileRead,用CH375FileWriteX代替CH375FileWrite */
#define CH375_INT_WIR ( PINC & 0x08 ) /* PINC.3, CH375的中断线INT#引脚,连接CH375的INT#引脚,用于查询中断状态 */
#include "CH375HFB.H"
void mp3_pause(void)
{
while(1);
}
void mDelaymS( UINT32 ms )
{
UINT16 i;
while ( ms -- ) for ( i = 2600; i != 0; i -- );
}
void test_1011(void) ;void mp3_play(char *s);
void main()
{
uint i;uchar t0,data,t1,t2;
spi_init();
mp3_port_init();vs1011_init();vs1011_init();
SPCR = 0x50; //提速
SPSR = 0x01; //setup SPI
CH375_PORT_INIT( );
//lcd_init();lcd_init();lcd_display(1,1,"章英永的郭能");
DDRD=0x00; //按键输入
/* 初始化CH375程序库和CH375芯片,操作成功返回0 */
i=CH375LibInit( );
//if(i==0) test_1011();
while ( CH375DiskStatus != DISK_CONNECT ) xQueryInterrupt( ); /* 查询CH375中断并更新中断状态,等待U盘插入 */
mDelaymS( 200 ); /* 延时,可选操作,有的USB存储器需要几十毫秒的延时 */
/* 检查U盘是否准备好,有些U盘不需要这一步,但是某些U盘必须要执行这一步才能工作 */
for ( i = 0; i < 5; i ++ ) /* 有的U盘总是返回未准备好,不过可以被忽略 */
{
if ( CH375DiskReady( ) == ERR_SUCCESS ) break; /* 查询磁盘是否准备好 */
}
/* 查询磁盘物理容量 */
//LCD_write_english_string(0,0,"DiskSize" );
i = CH375DiskSize( );
data= (unsigned char)(mCmdParam.DiskSize.mDiskSizeSec >> 11);
t1=data/100;
//LCD_set_XY(56,0);
//LCD_write_char(t1+48);
data=data%100;
t1=data/10;
//LCD_write_char(t1+48);
t2=data%10;
//LCD_write_char(t2+48);
//LCD_write_english_string(76,0,"M" );
/*枚举根目寻下的MP3文件*/
while(1)
{
for ( c = 0; c < 255; c ++ )
{ /* 最多搜索前255个文件 */
strcpy( mCmdParam.Open.mPathName,"\\*" ); /* 搜索根目录下文件名*/
i = strlen( (char *)mCmdParam.Open.mPathName ); /* 计算文件名长度,以处理文件名结束符 */
mCmdParam.Open.mPathName[ i ] =0xFF; /* 将结束符替换为255说明序号在变量中 */
CH375vFileSize=c; /*指定搜索的序号,几乎没有上限*/
i = CH375FileEnumer( ); /* 文件名中含有通配符*,则为搜索文件而不打开 */
if ( i == ERR_MISS_FILE ) break; /* 再也搜索不到匹配的文件,已经没有匹配的文件名 */
if ( i != ERR_SUCCESS ) break; /* 搜索到与通配符相匹配的文件名,文件名及其完整路径在命令缓冲区中 */
if(CH375vFileSize!=0xFFFFFFFF) /*枚举到MP3文件*/
{
//else LCD_write_english_string(0,5,"this is mp3file" );
mp3_play( (char *)mCmdParam.Open.mPathName );
}
//else LCD_write_english_string(0,5,"directory" );
}
}
//播放MP3程序
/*mp3_play("\\神话.MP3");
mp3_play("\\一往情深.MP3");
mp3_play("\\温光.MP3");
mp3_play("\\学友.MP3");
mp3_play("\\C51\\SXY.MP3");
test_1011();*/
}
//1011测试
void test_1011()
{
UINT16 data_pointer;UINT8 i;
while ( 1)
{
data_pointer=0;
while(data_pointer<4800)
{
if(PINB&MP3_DATA_REQ)
{
for(i=0;i<32;i++)
{
vs1011_data_write(vsBeepMP3[data_pointer]);
data_pointer++;
}
if(data_pointer==4799) break; //如果现在的数据不够了,则跳出来
}
}
}
}
//播放MP3程序
void mp3_play(char *s)
{
uint i;uchar t0,data,t1,t2;UINT16 data_pointer;
/* 播放MP3 */
strcpy( (char *)mCmdParam.Open.mPathName, s);
/* 打开文件 */
i=CH375FileOpen( );
//查询当前文件的信息
CH375FileQuery( );
//LCD_write_english_string(0,1,"SongSize" );
data=(unsigned char)(CH375vFileSize/102400);
t1=data/10;
//LCD_set_XY(56,1);
//LCD_write_char(t1+48);
//LCD_write_english_string(64,1,"." );
//LCD_set_XY(68,1);
t2=data%10;
//LCD_write_char(t2+48);
//LCD_write_english_string(76,1,"M" );
//显示开始播放
//LCD_write_english_string(0,2,"Playing" );
while ( 1 )
{
mCmdParam.Read.mSectorCount =1; // 指定读取的扇区数
if(flag==0) CH375FileRead(); //读完后文件指针自动后移
//按键处理程序
//ST/PS键按下
if(!(PIND&STOP))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PIND&STOP))
{
flag^=0x01;
}
}
//VOLUP键按下
if(!(PIND&VOLDOWN))
{
delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PIND&VOLDOWN))
{
vol=vol+((uint)(2<<8)+2);
if(vol>=0xF0F0) vol=0xF0F0;
else vs1011_cmd_write(0x0b,vol); //每次左右声道VOL减2
}
}
//VOLDOWN键按下
if(!(PIND&VOLUP))
{
delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PIND&VOLUP))
{
vol=vol-((uint)(2<<8)+2);
if(vol<=0x0505) vol=0x0505;
else vs1011_cmd_write(0x0b,vol); //每次左右声道VOL加2
}
}
//NEXT键按下
if(!(PIND&NEXTSONG))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PIND&NEXTSONG)) goto NEXT; //跳到下一首歌曲
}
//PREV键按下
if(!(PIND&PREVSONG))
{
delay_nus(250);delay_nus(250);delay_nus(250);delay_nus(250);
if(!(PIND&PREVSONG))
{
c=c-2;goto NEXT; //返回前一首歌曲
}
}
//处理数据
data_pointer=0;
while(data_pointer<512)
{
if(PINB&MP3_DATA_REQ) //加载数据
{
for(i=0;i<32;i++)
{
vs1011_data_write(FILE_DATA_BUF[data_pointer]);
data_pointer++;
}
}
if (data_pointer==511) break; //如果现在的数据不够了,则跳出来
}
if (mCmdParam.Read.mSectorCount<1 ) break; // 实际读出的扇区数较小则说明文件已经结束
}
NEXT: CH375FileClose( ); /* 关闭文件 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -