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

📄 mp3.c

📁 ARM7 lpc2132+vs1003+sdcard 制作的 MP3 此程序在ADS1.2环境下编译
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************Copyright (c)**************************************************
**                                 上海新时达电气有限公司
**                                     研  发  中  心
**                                        研发一部 
**
**                                 http://www.stepelevatar.com
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: Mp3.c
**创   建   人: 吕海安
**最后修改日期: 2007年05月31日
**描        述: MP3语音报站器主函数
**              
**--------------历史版本信息----------------------------------------------------------------------------
** 创建人: 吕海安
** 版  本: v1.0
** 日 期: 2007.07.03
** 描 述: 原始版本
**
**--------------当前版本修订------------------------------------------------------------------------------
** 修改人: 
** 日 期: 
** 描 述: 
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include <string.h>
#include <stdio.h> 
#include <stdlib.h>
#include "config.h"      
#include "comm.h"
#include "vs1003.h"
#include "mp3.h"
#include "sd.h"
#include "fat.h"
#include "delay.h"   

  
INT32U caipong;
extern INT8U music_name;

MENU_CONECT  m_c[4];  // 保存目录显示的四行文件名


/*********************************************************************************************************
** 函数名称: Timer0Init
** 功能描述: 定时期中断初始化 
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 吕海安
** 日 期: 2007年1月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Timer0Init(void)
{

	/* 定时器0初始化 */
	T0TC   = 0;			    /* 定时器设置为0										*/
	T0PR   = 0;			    /* 时钟不分频											*/
	T0MCR  = 0x03;		    /* 设置T0MR0匹配后复位T0TC,并产生中断标志				*/
	T0MR0  =(Fpclk / 30);	/* 32.768 M秒钟定时									    */
	T0TCR  = 0x01;		    /* 启动定时器											*/
	
 }
 
 /*********************************************************************************************************
** 函数名称: Timer0_Exception
** 功能描述: 定时器中断0, 每 32.768Ms 中断一次
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 吕海安
** 日 期: 2007年1月24日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Timer0_Exception(void)
{
    //static INT8U flag;
    //flag = !flag;
    T0IR = 0x01;
    VICVectAddr = 0;  // interrupt close 通知中断控制器中断结束
    TimeFlag |= (bT32MS | bTkey); 
	Rtime++;
	
	//if(flag) 
	//IO0SET = ((INT32U)0x01 << 29);
    //else    
    //IO0CLR = ((INT32U)0x01 << 29);
}
 
 
/* // lvhaian
// 每一秒中断一次
ISR(SIG_OVERFLOW0)    // Real Time Count every 1s interrupt
{
 	TimeFlag |= bT1S;
}
*/
/*------------------ 初始化IO端口 --------------------------*/
void init_pio(void)
{
    PINSEL0 = 0x0;
    PINSEL1 = 0x0;
    PINSEL2 = 0x00000004;
    
    //IO0DIR = (IO0DIR | 0x20000000);
}


INT8U  MenuCnt;
INT8U  MenuMode;
INT8U  SelIndex;        // 当页显示的文件序号
INT32U CurDir;          // 当前目录
INT8U  fileindex = 1;   // 文件序号
INT16U TotalFile;

#define  VIEW_MODE  1
#define  PLAY_MODE  2
#define  STBY_MODE  3
#define  SET_MODE   4
#define  RADIO_MODE 5
#define  REC_MODE   6

INT32U filelength;
INT16U voltbl[] = { 
	0x9191,0x8c8c,0x8787,0x8282,0x7d7d,0x7878,0x7373,0x6e6e,0x6969,0x6464,
	0x5f5f,0x5a5a,0x5555,0x5050,0x4b4b,0x4646,0x4141,0x3c3c,0x3737,0x3232,
	0x2d2d,0x2828,0x2323,0x1e1e,0x1919,0x1414,0x0f0f,0x0a0a,0x0505,0x0000

	};
	
TIME  rtc;      
        
//extern   unsigned long FileSize;  
extern PARTRECORD PartInfo;


/*****************************************************************************************
* 名称:ReadConfig
* 功能:读配置文件
* 输入:无
* 返回:无
*****************************************************************************************/
void ReadConfig(void)
{
    INT8U flag;
    /*flag = eeprom_read_byte((INT8U*) kEepFlag);
    if(flag != 0xaa)
    {
        vol = 00; 
        fileindex = 1; 
        SelIndex = 0;
        CurDir = fatGetRootClust();
	  	TotalFile = 0; 	
	  	flag = 0xaa;
	  	eeprom_write_byte((INT8U*) kEepFlag,flag);
	  	eeprom_write_byte((INT8U*) kEepVol,vol);
	}
    else
    {
        vol = eeprom_read_byte((INT8U*) kEepVol);
    }
    */
	vol = 15;  
    MenuCnt = 0;  TotalFile = 0;	PlayMode = 0;
    MenuMode = VIEW_MODE;  MenuCnt = 0;
    //vs1003_cmd_write(0x0b,voltbl[vol]);
}


/*****************************************************************************************
* 名称:GetKey
* 功能:按键处理程序
* 输入:无
* 返回:无
*****************************************************************************************/
void GetKey(void)	
{ 
    static INT8U sakey = kNull;
    static INT8U KeyCnt = 0;
    INT8U tempKey;
    caipong = MP3_PIN;
    if(!(TimeFlag & bTkey))  
    {
        return;
    } 
    TimeFlag &= ~bTkey;
    tempKey = kNull;

    if(!(MP3_PIN & VOLDOWN))
    { 
        tempKey = kVolDown;
    }
    else if(!(MP3_PIN & VOLUP)) 
    {
        tempKey = kVolUp;
    }
    
    if(tempKey == sakey)
    { 
        if(tempKey != kNull)
        {
            if(++KeyCnt > 30)           // 处理按钮长按 
            {    
                KeyVal = sakey + 0x10;
            }
        }
        return;
    }
    KeyCnt = 0;
    sakey = tempKey;
    if(sakey != kNull) 
    {    
        KeyVal = sakey;                 // 滤波一次,第二次能够得到键值
    }
}

/*****************************************************************************************
* 名称:ReadFileData
* 功能:读文件数据
* 输入:无
* 返回:TRUE : 读数据成功
*       FALSE: 读数据失败
*****************************************************************************************/ 
BOOL ReadFileData(void)
{
    INT32U LBA;
    if(!(WorkFlag & bDatRdy)) // 不处于数据就绪状态
    {
        if(SectorIndex >= SectorsPerCluster) // 数据多在扇区不处于此簇
        {
            NextCluster = fatNextCluster(NextCluster);    // 取文件系统中下一个簇
            if(NextCluster == CLUST_EOFE)	return FALSE; // 已经是最后一个簇,没有下一个簇了,读文件数据失败
            SectorIndex = 0; // 返回第一个簇
        }
        LBA = fatClustToSect(NextCluster); // 查询数据区下一个簇开始扇区号 
        ReadBlock(LBA + SectorIndex);  // 读一个扇区
        SectorIndex++;
        WorkFlag |= bDatRdy; // 进入数据就绪状态 
    }
    return TRUE; // 读文件数据成功
}


/*****************************************************************************************
* 名称:MusicPlay
* 功能:MP3播放程序
* 输入:无
* 返回:无
*****************************************************************************************/
void MusicPlay(void)
{  
    INT8U n;
    while(TRUE)
    {
        if(!(WorkFlag & bReadOvr))    // 处于数据没有读结束状态
        {
            if(!ReadFileData())	      // 读文件数据失败
            {    
                WorkFlag |= bReadOvr; // 进入读数据结束状态
            }
        }  
//---------数据写入VS1003-----------------------------//	
        if(WorkFlag & bPause)         // 处于暂停状态
        {    
            break;
		}
		if(WorkFlag & bDatRdy) // 处理处于接收有效语音信息状态
		{
            do // 数据小于 512 个字节
            {
            	set_spi(0);
                MP3_PORT_SET = MP3_CMD_CS;   // MP3_CMD_CS=1;
		        MP3_PORT_CLR = MP3_DATA_CS;  // MP3_DATA_CS=0;
		        if(MP3_PIN & MP3_DATA_REQ)    // 送 MP3 数据请求
                {
                    for(n=0; n<32; n++)    
                    { 
                        
                        vs1003_data_write(BUFFER[data_pointer++]);                        
                    }  
                    if(filelength < 32) 
                    { 
                        
                        WorkFlag |= (bPlayOvr | bReadOvr); // 进入播放结束状态和读数据结束状态
                        break; // MP3 数据播放结束
                    }
                    filelength -= 32;
                }
                else
                {
                    MP3_PORT_SET = MP3_DATA_CS;  // MP3_DATA_CS=1;
		            break;
		        } 
		        MP3_PORT_SET = MP3_DATA_CS;  // MP3_DATA_CS=1;	   
		        set_spi(1);
            }
            while(data_pointer < 511);

            if(data_pointer >= 511) 
            {  
                data_pointer = 0;
                WorkFlag &= (~bDatRdy); // 清数据就绪状态位
                continue;
            }
        }
        break;
    } 	  
}


/*****************************************************************************************
* 名称:StopPlay
* 功能:停止 MP3 播放
* 输入:无
* 返回:无
*****************************************************************************************/
void StopPlay()
{	
    vs1003_Reset();
    WorkFlag |= (bPause | bPlayOvr); // 停止放音
    WorkFlag &= ~(bLrc | bDatRdy);   // 清数据就绪状态和歌词链接状态
    data_pointer = SectorIndex = 0;	 // 数据指针复位
}

/*****************************************************************************************
* 名称:StartPlay
* 功能:开始 MP3 播放
* 输入:INT32U FirstClust:第一个簇
* 返回:无
*****************************************************************************************/
void  StartPlay(INT32U FirstClust)
{
    NextCluster = FirstClust;        // 下一个簇指向第一个簇
    WorkFlag &= ~(bReadOvr | bDatRdy | bPlayOvr | bPause); // 清读结束状态,数据就绪状态,播放结束状态,播放暂停状态 
    data_pointer = SectorIndex = 0;	 // 数据指针复位
}

/*****************************************************************************************
* 名称:RtcCount
* 功能:实时计时
* 输入:无
* 返回:无
*****************************************************************************************/
void RtcCount()
{
    if(TimeFlag & bT1S)           // 计时 1 秒标志
    {
        TimeFlag &= ~bT1S;        // 清 1 秒标志
        TimeFlag |= bRtcUpdate;   // 更新时间标志
        if(++rtc.sec >= 60)       // 60秒
        {
            rtc.sec = 0;
            if(++rtc.min >= 60)   // 60 分
            {
                rtc.min = 0;
                if(++rtc.hour >= 24) // 24 小时
                {
                    rtc.hour=0;
                    if(++rtc.day > GetDay(rtc.month)) // 日期
                    {
                        rtc.day = 1;
                        if(++rtc.month > 12) // 月份
                        {
                            rtc.month = 1;
                            rtc.year++; 	
                        }
                    }
                }
            }	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -