⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mp3.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
📖 第 1 页 / 共 2 页
字号:
        }
    }	
}	

/*****************************************************************************************
* 名称: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 + -