📄 mp3.c
字号:
}
}
}
/*****************************************************************************************
* 名称:GetDay
* 功能:实时计时
* 输入:INT8U mo: 当前月份
* 返回:INT8U daycount: 当月的天数
*****************************************************************************************/
const unsigned char DayTable[] = {31,28,31,30,31,30,31,31,30,31,30,31};
INT8U GetDay(INT8U mo) // 取每个月的日数
{
INT8U daycount;
daycount = DayTable[mo];
return daycount;
}
/*****************************************************************************************
* 名称:InitSystem
* 功能:初始化系统
* 输入:无
* 返回:无
*****************************************************************************************/
void InitSystem()
{
init_pio();
InitI2CGPIO();
key_port(); // 初始化按键端口
spi_init(); // 初始化 SPI 硬件接口
sd_port_init(); // 初始化 SD CARD 硬件接口
SD_Init(); // 初始化 SD CARD 系统
fatInit(); // 初始化FAT文件系统
mp3_port_init(); // 初始化 MP3 硬件接口
vs1003_HardwareReset(); // 初始化 VS1003
StopPlay();
InitCan1();
}
/*****************************************************************************************
* 名称:SaveFileSector
* 功能:将文件在FAT表中存放的信息存入EEPROM中以便以后能在文件中快速定位
* 存放格式(每5个字节1组,最大可保存10组,也就是说允许文件分十片区域存入
* (扇区号 ,连续簇个数) (扇区号,连续簇个数)....
* 输入:INT32U StartCluser
* void *eepaddr
* 返回:
*****************************************************************************************/
void SaveFileSector(INT32U StartCluser,void *eepaddr)
{
// lvhaian
INT8U ClustCnt,ci;
INT32U temp,temp1;
eeprom_read_block(&temp,eepaddr,4);
temp1 = fatClustToSect(StartCluser);
if(temp!=temp1)
{
eeprom_write_block(&temp1,eepaddr,4);
}
ClustCnt = 0;
(INT8U *)eepaddr += 4;
while((StartCluser = fatNextCluster(StartCluser)) != CLUST_EOFE)
{
temp = fatClustToSect(StartCluser);
if((temp - temp1) == SectorsPerCluster)
{
ClustCnt++; //计算连续的簇号数
}
else
{
ci = eeprom_read_byte(eepaddr);
if(ClustCnt!=ci)
{
eeprom_write_byte(eepaddr,ClustCnt);
}
(INT8U *)eepaddr += 1;
eeprom_read_block(&temp1,eepaddr,4);
if(temp!=temp1)
{
eeprom_write_block(&temp,eepaddr,4);
}
(INT8U *)eepaddr += 4;
ClustCnt = 0;
}
temp1 = temp;
}
ci = eeprom_read_byte(eepaddr);
if(ClustCnt!=ci)
{
eeprom_write_byte(eepaddr,ClustCnt);
}
}
/*****************************************************************************************
* 名称:MenuOpter
* 功能:MP3芯片功能选择
* 输入:无
* 返回:无
*****************************************************************************************/
void MenuOpter(void)
{
switch(MenuMode)
{
case PLAY_MODE: // STANDBY
PlayFunc();
break;
case VIEW_MODE: // 浏览文件目录模式
FileView();
break;
case STBY_MODE:
StandbyMode();
break;
case RADIO_MODE: // 收音模式
RadioMode();
break;
default:
break;
};
}
/*****************************************************************************************
* 名称:StandbyMode
* 功能:标准模式
* 输入:无
* 返回:无
*****************************************************************************************/
void StandbyMode(void)
{
;
}
/*****************************************************************************************
* 名称:RadioMode
* 功能:收音模式
* 输入:无
* 返回:无
*****************************************************************************************/
void RadioMode(void)
{
;
}
/*****************************************************************************************
* 名称:FileView
* 功能:文件目录浏览(此模式不放音)
* 输入:无
* 返回:无
*****************************************************************************************/
void FileView(void)
{
TotalFile = SerarchFile(CurDir,fileindex); // 查找所有的文件数目
if(SelIndex > (TotalFile - 1))
{
SelIndex = 0;
}
if((m_c[SelIndex].Type!=0)&&(m_c[SelIndex].Type!=0xff))
{
MenuMode = PLAY_MODE; // 是音乐文件
filelength=m_c[SelIndex].FileLen;
StartPlay(m_c[SelIndex].Clust);
}
}
/*****************************************************************************************
* 名称:SetInverseLine
* 功能:取反色(选中菜单)
* 输入:uchar line
* 返回:无
*****************************************************************************************/
void SetInverseLine(INT8U line)
{
}
/*****************************************************************************************
* 名称:FindSysFile
* 功能:查找系统文件(汉字库文件)
* 输入:无
* 返回:无
*****************************************************************************************/
void FindSysFile(void)
{
INT32U hzk,unit;
GetSysFileClust(&hzk,&unit);
WorkFlag &= ~(bUnicode | bHzk12);
if(hzk != 0)
{
SaveFileSector(hzk,(void*) kHzkClustTbl);
WorkFlag |= bHzk12;
}
else
{
// PrintString(1,0,"Hzk Not Found!");
;
}
if(unit != 0)
{
SaveFileSector(unit,(void*)kUniClustTbl);
WorkFlag |= bUnicode;
}
else
{
// PrintString(2,0,"Uni Not Found!");
;
}
}
/*****************************************************************************************
* 名称:PlayFunc
* 功能:MP3播放模式
* 输入:无
* 返回:无
*****************************************************************************************/
void PlayFunc(void)
{
INT16U i;
static INT8U old_name;
if(WorkFlag & bPlayOvr)
{
switch(PlayMode)
{
case 0: //循环
/*if((SelIndex + fileindex) >= TotalFile)
{
StopPlay();
MenuCnt = 0;
SelIndex = 0;
fileindex = 0;
//MenuMode = STBY_MODE; //歌曲循环完毕
//return;
}
if(SelIndex < 3)
{
SelIndex++;
}
else
{
fileindex++;
}
StopPlay();
TotalFile = SerarchFile(CurDir,fileindex);
filelength = m_c[SelIndex].FileLen;
StartPlay(m_c[SelIndex].Clust); */
StopPlay();
if(music_name != old_name)
{
if (SerarchFile1(CurDir,0,music_name))
{
filelength = m_c[0].FileLen;
StartPlay(m_c[0].Clust);
}
}
else
{
if (SerarchFile1(CurDir,0,0))
{
filelength = m_c[0].FileLen;
StartPlay(m_c[0].Clust);
}
}
old_name = music_name;
break;
case 1: // 重复
StopPlay();
SerarchFile(CurDir,fileindex);
filelength = m_c[SelIndex].FileLen;
StartPlay(m_c[SelIndex].Clust);
break;
case 2: // 随机
break;
case 3: // 列表
break;
case 4:
break; // 停止
};
//WorkFlag &= ~bPlayOvr;
return;
}
switch(KeyVal)
{
case kVolUp:
if(vol<29)
{
vol++;
// eeprom_write_byte((INT8U *)kEepVol,vol); // lvhaian
}
else
{
vol=29;
}
//S0PCCR = 0x40;
set_spi(0);
Write_Byte_SPI(0xff);
vs1003_cmd_write(0x0b,voltbl[vol]);
set_spi(1);
break;
case kVolDown:
if(vol>0)
{
vol--;
// eeprom_write_byte((INT8U *)kEepVol,vol);
}
else
{
vol=0;
}
set_spi(0);
Write_Byte_SPI(0xff);
vs1003_cmd_write(0x0b,voltbl[vol]);
IRQEnable();
set_spi(1);
break;
default:
KeyVal =kNull;
};
KeyVal=kNull;
}
/*****************************************************************************************
* 名称:key_port
* 功能:KeY的按键端口初始化
* 输入:无
* 返回:无
*****************************************************************************************/
void key_port(void)
{
IO0DIR = IO0DIR & 0xffffffff & ((INT32U)~(1 << 23)) & ((INT32U)~(1 << 24));
IO0PIN = IO0PIN & 0xffffffff | (1 << 23) | (1 << 24 );
}
/*****************************************************************************************
* 名称:main
* 功能:主函数
*****************************************************************************************/
int main()
{
InitSystem();
FindSysFile(); // 查找系统文件(汉字库,及编码转换文件)
ReadConfig(); // 读取配置数据
MenuMode = PLAY_MODE;
StopPlay();
while(TRUE)
{
GetKey();
MenuOpter();
MusicPlay();
if(TimeFlag & bT32MS) // 计时 32m秒标志
{
TimeFlag &= ~bT32MS; // 清 32m秒标志
//TimeFlag |= bRtcUpdate; // 更新时间标志
CanProcess();
update_voice();
}
}
return 0;
}
/*****************************************************************************************
* END OF FILE
*****************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -