📄 mp3.c
字号:
/****************************************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 + -