?? main._c
字號:
//--------------------------- 實驗程序名稱:MP3播放器 ------------------------------
//
//開發平臺:ATmega16教學實驗板
//外設使用:1. T/C0定時器 2. AD模數轉換(通道7) 3. SPI總線
//模塊使用:1.AD鍵盤 2.SD卡 3.VS1003模塊
//頻率:外頻16MHz
//電壓:3.3V
//
//存儲體:SD卡
//文件系統:FAT32
//顯示器:不帶
//音樂文件:SD卡上命名“音樂”文件夾,在“音樂”文件夾內存儲歌曲,格式為“MP3“。
//按鍵操作: | Key6 | Key5 | Key4 | Key3 | Key2 | Key1 |
// | 播放 | 停止 | 上一首 | 音量+ | 音量- | 下一首 |
//
//原理:使用ATmega16讀取SD卡中音樂文件傳輸到VS1003進行解碼播放。
//重點:1.文件系統 2.SD卡驅動
//
//作者:廖華明(師兄)
//日期:2009.7.8
//
//----------------------------------------------------------------------------------
#include "SPI.h"
#include "Usart.h"
#include "fat.h"
#include "vs1003.h"
#include "AD_key.h"
#include "3310LCD_function.h"
#include "bmp_pixel.h"
extern struct DISK_FAT_INFO DiskFATInfo;
extern struct MUSIC_INFO MusicInfoList[3];
//-------------- 音樂播放程序 -------------------//
void VS1003_Play(void);
//----------------- ------------------------------
//
// 主函數
//
//------------------------------------------------
void main()
{
// Usart_Init(9600); // 串口初始化9600bps
SPI_Init(); // SPI初始化,默認速度400Hz
LCD_init();
VS1003_Init(); // VS1003芯片初始化
while(SD_Init()); // SD卡循環初始化
Fat_Init(); // 文件系統初始化
AD_Init(); // AD初始化
TC0_Init(); // T/C0初始化
VS1003_Play(); // 音樂播放
}
//----------------- ------------------------------
//
// 音樂播放函數
//
//------------------------------------------------
void VS1003_Play(void)
{
uint32 n;
uint32 i,j=46;
uint32 size_buf=0; // 已播放的文件大小
uint32 num; // 音樂文件所在的簇
uint8 music_num=0; // 正在播放文件的號碼
uint8 play_flag=1; // 播放標志
uint16 data_pointer=0;
uint8 music_next=0,music_last=0; // 音樂換曲標志
uint8 vol_flag=0; // 音量調節標志
AD_Flag=0; // AD鍵盤標志
AD_time=0; // AD鍵盤采樣次數
key_num=0; // 按鍵號
GetMusicFile(); // 獲取音樂文件
num = MusicInfoList[0].FileStartClustor; // 調用音樂文件
while(1)
{
LCD_clear();
LCD_write_english_string(j,3,MusicInfoList[music_num].FileName);
for(i=0;i<DiskFATInfo.SectorsPerClustor;i++)
{
SD_ReadBlock(DiskFATInfo.FDT_LBA+(num-DiskFATInfo.FDT_StartClustor)*DiskFATInfo.SectorsPerClustor+i,Fat_Buffer); // 獲取音樂文件的數據
do
{
//--------------------------- AD按鍵檢測 ---------------------------//
if(key_num==6&&AD_time==0)play_flag=1; // Key6按下,播放
else if(key_num==5&&AD_time==0)play_flag=0; // Key5按下,停止
else if(key_num==1&&AD_time==0)music_next=1; // Key1按下,下一首
else if(key_num==4&&AD_time==0)music_last=1; // Key4按下,上一首
else if(key_num==3&&AD_time==0)vol_flag=1; // Key3按下,音量+
else if(key_num==2&&AD_time==0)vol_flag=2; // Key2按下,音量-
//-------------- 音量調節 ----------------//
if(vol_flag!=0)
{
if(vol_flag==1)
{
if(VOL>27)VOL=29;
else VOL+=2;
}
else
{
if(VOL<2)VOL=0;
else VOL-=2;
}
VS1003_WriteReg(VS1003_SPI_VOL ,VOL_BUFFER[VOL]); // 送音量數據
while(VS1003_DREQ_STATE() != VS1003_DREQ); // 等待
key_num = 0;
vol_flag=0;
}
//----------------- 換曲操作 -----------------//
if(music_next!=0||music_last!=0)
{
data_pointer=512;
i=8;
}
//---------------- 音樂數據送入 ------------------//
else if(VS1003_DREQ_STATE()== VS1003_DREQ&&play_flag!=0)
{
for(n=0;n<32;n++)
{
VS1003_WriteDat(Fat_Buffer[data_pointer]); // 發送數據
data_pointer++;
}
size_buf+=32;
}
if(size_buf>=MusicInfoList[music_num].FileLength-64)
{
data_pointer=512;
i=8;
size_buf=0;
}
}while(data_pointer<511);
data_pointer=0;
if(i%4 == 0)
{
if(j <= 0) j = 46;
else j--;
}
}
//---------- 下一簇 ------------//
num = FatNextCluster(num);
if(num==CLUST_EOFE||music_next!=0||music_last!=0)
{
if(music_last!=0)
{
if(music_num>0)music_num--;
else music_num = NumOfFile - 1;
}
else
{
if(music_num < NumOfFile-1)music_num++;
else music_num=0;
}
num = MusicInfoList[music_num].FileStartClustor;
play_flag=1;
music_next = 0;
music_last = 0;
key_num=0;
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -