亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mp3.h

?? 用Mega32+VS1003做的MP3(FAT32文件系統瀏覽)——源代碼
?? H
字號:
#ifndef _MP3_INCLUDED_
#define _MP3_INCLUDED_ 
//正點原子@scut 08/09/11
//很多部分參考網友(波仔)的
//實現功能:播放mp3/wma/wav/midi,支持mp3快進,前一首后一首選擇,
//同時顯示時間比特率和進度條
#include "vs1003.h" 
#include "fat.h" 
#include "snake.h"   

void deal_dsp(uchar keys);
uchar MaxFile=0;//此批次中,最大的文件個數   
bit bt30MS=0;//30MS 時間到   

//定時器1中斷 30ms一次
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{   
    //static unsigned char *pp=pbuffer;//指向長文件名   
    TCNT1H=0xe2;
    TCNT1L=0xb3;//30MS 
    
    if(En_backlight)//使能背光打開
    {
        lasttime++;
        if(MenuOper==Ebook_Mode||(LYRIC&&ENLRC)||GAME_PLAY)lasttime=0;//TXT閱讀/歌詞顯示模式下,背光一直打開 
        LCD_LED=1; 
        if(lasttime>150) //持續點亮4.5m
        {
            En_backlight=0;
            lasttime=0;
            LCD_LED=0;//關閉背光
        }
    }
    bt30MS=1;//標記中斷 
} 
//定時器1,30ms中斷
void timer_init()
{ 
    TCCR1A=0x00;
    TCCR1B=0x03;
    TCNT1H=0xe2;
    TCNT1L=0xb3;
    TIMSK=0x04;
    #asm("sei") 
} 

//在當前的目錄中查找歌詞文件,找到置相關數據至lyric中
//入口: 1.dircluster    當前目錄的首簇號,若是FAT12或FAT16的根目錄則為0
void FindLrcFile(unsigned long dircluster,unsigned char *strName)
{
	FIND_FILE_INFO	fp;
	direntry *de=0;	
	unsigned char  name[8];
	unsigned char i=0;     
	for(i=0;i<8;i++)name[i]=strName[i];//取前面八個字節  
	InitSetPath(&fp,dircluster);//初始化查找目錄地址
	ReadBlock(fp.Sector);       //重新讀取目錄表 
	do 
	{  
		if(!ReadNextDirEntry(&fp)) {lyric.Clust=0;return;}//沒找到任何歌詞 
		de=(direntry *) BUFFER;
		de+=fp.Index; 
		if(*de->deName != 0xe5)
		{
			if((de->deAttributes&ATTR_LONG_FILENAME)!=ATTR_LONG_FILENAME)
			{
			    if((de->deAttributes& ATTR_DIRECTORY)!= ATTR_DIRECTORY)// is it a directory ?
			    {
			        for(i=0;i<8;i++)if(name[i]!=de->deName[i])break;                    
			        if(i==8) //主文件名比較正確 
			        {  
			   	        for(i=0;i<3;i++)//比較后綴
			   	        {
			   	            if((filetype[4][i])!=de->deExtension[i])break;//不符合 
			   	        }
			   	        if(i==3)break;//找到了符合的文件
			        }
			    }
	 	    } 
	    }
	    de++;
	    fp.Index++; 
	    if(de->deName[0]==0) { lyric.Clust=0;  return;} //文件的最后一項
	}while(1);  
	LYRIC=1; //標記找到歌詞 
	lyric.first=1;  
	lyric.t_sec=lyric.t_ms=0;//初始化為0  
	lyric.so=0;
	lyric.sl=0;
	lyric.wl=0;  //初始位置
	lyric.filelen=(unsigned int)de->deFileSize; //保存歌詞文件大小
	lyric.Clust=(unsigned long)((unsigned long)de->deHighClust<<16)+de->deStartCluster;//大小
} 
//check ok 08/09/06
//讀取當前歌詞文件的下一個字節
//支持自動換簇換扇區
unsigned char ReadChar(unsigned char *buf)
{  
	if(lyric.filelen>0)lyric.filelen--;//歌詞長度減少  
	if(lyric.so!=64)//buffer溢出
	{
		return buf[lyric.so++];	
	}else//讀取下一批數據
	{ 
		lyric.wl+=64;//扇區內偏移增加 64	
		if(lyric.wl>=512)//已跨扇區
		{ 
			lyric.wl=0;
			if(++lyric.sl>=SectorsPerCluster)//跨簇,幾率不大
			{
				lyric.sl=0;//簇內偏移增加
				lyric.Clust=fatNextCluster(lyric.Clust);
				if(lyric.Clust==CLUST_EOFE)return 0xff;  //文件結束
			}              
		}	 
		SD_Read_Bytes(fatClustToSect(lyric.Clust)+lyric.sl,buf,lyric.wl,64);//從當前位置向后讀取64字節
		lyric.so=0;
		return buf[lyric.so++];//先得到值,再加加!!!
	}
}  
//讀取一句有效的歌詞記錄  
//check ok 08/09/06
//只支持單向時間
//如[xx:xx.xx][xx:xx.xx]....  則不支持  
void ReadLrcFileData(void)
{  
	unsigned char *lbuf=pbuffer+200;  
	unsigned char c;
	unsigned char i,bDot;  
	uchar work;  
	unsigned int tt;
	unsigned char *pp=pbuffer;//指向長文件名    
	lyric.t_sec=0xffff;lyric.t_ms=0; //時間清空 
	if(lyric.filelen==0) return;//歌詞讀取完了
	//從當前的位置讀取歌詞文件中的64個字節至緩沖區lbuf
	SD_Read_Bytes(fatClustToSect(lyric.Clust)+lyric.sl,lbuf,lyric.wl,64); 
	if(!lyric.first)//歌詞還沒有更新
	{  
		i=0;
		while(lyric.filelen>0)
		{
			c=ReadChar(lbuf);//從緩沖里面讀取出一個字節    
			if(c!=0x0d)//沒讀到回車符號
			{	 
				if(++i<=50)*pp++=c;//讀取二十八個字節到	
			}else//讀到回車符號了
			{
				if(lyric.filelen>0) ReadChar(lbuf); //去除0x0a 
				break;
			}                      
		}
		*pp='\0'; 
		pp=pbuffer;  
		Cleardisplay(1);Cleardisplay(2);//清屏  
		LCD_write_String(1,0,pp,2);     //顯示歌詞 
	}        
	//讀取下一句歌詞
	lyric.first=0;      
	tt=0;work=0;
	bDot=0; 
	while(1)//歌詞信息讀取信息
	{ 
		if(lyric.filelen==0)return;
		c=ReadChar(lbuf);     //讀取一個字節    
		if(work==0)  //支持 [xx:xx.xx] 及[xx:xx] 
		{     
			if(c=='[')work++;//開始讀取時間 
		}else if(work==1)
		{
			if((c>='0')&&(c<='9'))//得到數據
			{
				tt=tt*10+(c-'0');//讀取第一批時間
			}else if(c==':')     //上次讀取的是分鐘
			{
				lyric.t_sec=tt*60;tt=0;
			}else if(c=='.')//上次讀取的是秒鐘
			{     
				lyric.t_sec+=tt;tt=0;
				bDot = 1;
			}else if(c==']')//讀取結束
			{           
				if(bDot==0)
				{
					lyric.t_sec+=tt;	
					lyric.t_ms=0;
				}else lyric.t_ms=tt/3; 
				c=ReadChar(lbuf);
				lyric.filelen++;//長度補償   
				lyric.so--; 
				if(c!='['&&lyric.t_sec>=timer)break;//跳出歌詞尋找 
				tt=0;work=0; bDot=0;  
			}else//讀到非法數據 
			{
			    while(ReadChar(lbuf)!=0x0d);//非法數據忽略 
			    work=0;
			}
		}	 
	} 
}             
//check ok 08/09/06
// 歌詞顯示控制  
//同時控制顯示解碼時間   
//mnum 當前文件的序號 0~3
//注意:只支持單排時間的lrc正常顯示
void LyricDisplayCtrl(uchar mnum)
{  
	static unsigned int time=0xffff;
	static unsigned char ms=0;  
	unsigned long lenth=0; 
	unsigned int t1;  
	if(!bt30MS)  return;//30ms未到
	ms+=3;//ms++
	bt30MS=0;  
	t1=GetDecodeTime(); //讀取播放時間  
	if(t1!=time)//秒鐘不合
	{
		time=t1;ms=0;//同步時間  
		timer=time;  //修改同步時間計數器(這個是歌詞的準確計時器,不是顯示的時間!) 
		             //如果這個亂了的話,歌詞也會亂,所以快進后顯示不了歌詞
		//得到比特率
		t1=GetHeadInfo();  
        //顯示歌曲長度             
        if(t1!=file_bps&&t1>0)//只有當kbps變化時才執行,提高系統速度
        {              
            //顯示比特率Kbps
		    Show_mininum(6,93,t1/10);//顯示高兩位
		    show_minichar(6,105,t1%10);//顯示最低位   
            file_bps=t1;//保存此次信息長度;
            //printf("BIT Rate is:%d\n",file_bps); 
            lenth=m_c[mnum].FileLen/125;//得到文件長度xxxx Kbps
            t1=lenth/t1;
            show_minichar(7,50,11); 
            Show_mininum(7,56,t1/60);//顯示分鐘
            show_minichar(7,68,10);
            Show_mininum(7,74,t1%60);//顯示秒鐘  
		}
		return;
	}
	if(!ENLRC||!LYRIC)return;//無歌詞或者歌詞被禁止使用  
	if(((t1==lyric.t_sec)&&(ms>=lyric.t_ms))||(t1>lyric.t_sec))
	{    
		ReadLrcFileData();  //讀取歌曲數據并顯示
	}   
}      
//顯示歌曲名字
//num:歌曲序號           
void music_name(uchar mnum)
{
    uchar i;
    if(!ENLRC||!LYRIC)
    {   
        while(m_c[mnum].LongName[i]!='\0')//把短名字放中間顯示
        {
            i++;
            if(i>21){i=22;break;}
        }                  
        i=66-3*i;//對13164液晶而言
        LCD_write_String(1,i,m_c[mnum].LongName,2);//無歌詞/歌詞顯示不使能    
    }
}
//播放音樂(選中的)
//支持類型:mp3/wma/wav/midi
//check ok 08/09/05   
//返回狀態值:next,用戶要求播放下一首
//prev:用戶要求播放上一首
//quit:結束播放 
uchar play(uchar mnum)
{
    unsigned long bfactor=0;
    unsigned long bcluster=0; 
    unsigned long prgpos=0;
    uchar count=0; 
    uint i;
    uchar n; 
    bit pause=1; 
    
    bcluster=m_c[mnum].Clust;  
    PLAYING=1;//播放模式標記    
    Audio_Ch=2;//選擇mp3通道 
    LYRIC=0;//歌詞標記清除
    bfactor=fatClustToSect(bcluster);
    vs1003_Reset();//軟復位VS1003  
    FindLrcFile(CurDir.Clust,m_c[mnum].ShortName);//從當前目錄找LRC
    Play_GUI();    //顯示播放時的GUI
    MP3_msg(pause);//顯示mp3的基本信息    
    music_name(mnum);  //顯示歌名
    keyval=0;//鍵值清零
    while(1)
    {
        ReadBlock(bfactor);//放音樂  
        i=0;  
        do //主播放循環
        {  
            if((PINB&MP3_DATA_REQ)&&pause)
            {
                for(n=0;n<32;n++) 
                {     
                    vs1003_data_write(BUFFER[i++]);
                } 
            }   
            if(READY)//有按鍵響應
            {    
                keyval=key_process();//得到鍵值    
                switch(keyval) 
                {
                    case PREV://播放上一首
                    {  
                        if(times>3)   
                        {
                            for(i=0;i<20;i++)//向后偏移三十個簇
                            {
                                bcluster=fatNextCluster(bcluster);//偏移一個簇
                                if(bcluster==0x00)//讀到文件簇尾
                                {
                                    vs1003_Reset();//軟復位   
                                    if(!SINGLE)return NEXT;  //播放結束,播放下一首   
                                    else return 0;//單曲循環
                                }
                            } 
                            i=512;//快進   
                            count=8; 
                            bfactor=SectorsPerCluster;//大于65536
                            prgpos+=bfactor*10752; //progpos遞增
                            prgpos-=512; 
                            break;
                        }  
                    }    
                    case NEXT://播放下一首
                    case QUIT://退出
                    { 
                        vs1003_Reset(); //軟復位   
                        PLAYING=0;      //非播放模式   
                        return keyval; //返回  
                    }
                    case PLAY:pause=!pause;break;//暫停/播放   
                    case 168://歌詞控制
                    {  
                        ENLRC=!ENLRC;//歌詞顯示使能與否 
                        Cleardisplay(1);Cleardisplay(2);//清除中間兩行數據
                        music_name(mnum);//不使能 
                        break;
                    } 
		            case 106: //DSP保存
		            case 242: 
		            case 114: 
		            case 176: 
		            case 112:
		            {
		                deal_dsp(keyval); 
		                music_name(mnum);
		                break;  
		            }                   
                }          
                MP3_msg(pause);//改變后的界面信息
                keyval=0;//清除鍵值  
            }   
        }while(i<511);       
        
        LyricDisplayCtrl(mnum);//顯示歌詞控制
        LED=!LED;//觀看系統相應速度   
        
        prgpos+=512;//進度條增加   
        Pro_msg(prgpos,mnum);//顯示進度條    
        count++;
        bfactor++; //扇區加
        if(count>=SectorsPerCluster)//一個簇結束,換簇
        {
            count=0;
            bcluster=fatNextCluster(bcluster); 
            if(bcluster==0x00)break;  //文件結束
            bfactor=fatClustToSect(bcluster);
        }  
    }
    vs1003_Reset();//軟復位   
    PLAYING=0;     //非播放模式   
    if(!SINGLE)return NEXT;//播放結束,播放下一首   
    else return 0;//單曲循環
}   
void deal_dsp(uchar keys)
{
    uchar t;   
    uchar d=0;
    switch(keys)
    {
        case 106:d=0;break; 
	    case 242:d=1;break; 
	    case 114:d=2;break; 
	    case 176:d=3;break; 
        case 112:d=4;break;        
    } 
    for(t=0;t<4;t++)                            
    {
        if(times>3)DSP[d][t]=voltemp[t];//保存dsp數值?    
        else voltemp[t]=DSP[d][t];//調出dsp?  
    }
    dspram=d;//dsp改變 
    if(times>3)//顯示界面,其實這個時候都已經操作完了
    {
        Cleardisplay(4);//清屏   
        LCD_write_cstr(1,40,"DSP:");
        Show_char(1,74,d+'1',); 
        save_show();
        Play_GUI();//恢復先前的界面 
        READY=0;      
    }
    init_cd3315(Audio_Ch);//改變音量 
} 
#endif


















?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡一区二区中文字幕| 亚洲综合激情另类小说区| 精品一区二区三区欧美| 欧美一级精品在线| 麻豆精品视频在线观看免费| 日韩精品一区二区三区老鸭窝| 人人精品人人爱| 精品精品欲导航| 国产黄色精品网站| 亚洲人精品午夜| 欧美另类高清zo欧美| 奇米四色…亚洲| 国产三级三级三级精品8ⅰ区| 成人一级片在线观看| 一区二区三区在线视频免费| 欧美日韩午夜影院| 精品影院一区二区久久久| 久久精品在这里| 在线一区二区视频| 久草精品在线观看| ...xxx性欧美| 欧美一区二区三区日韩| 国产成人免费视频网站| 一区二区三区精品视频| 精品国产一二三| 91片黄在线观看| 久热成人在线视频| 亚洲免费观看视频| 欧美变态凌虐bdsm| 色婷婷综合久色| 激情综合色综合久久| 亚洲精品高清视频在线观看| 欧美一区二区三区四区视频| 99re在线精品| 精品一区二区三区蜜桃| 亚洲激情男女视频| 久久婷婷色综合| 欧美肥妇毛茸茸| 91美女在线观看| 激情国产一区二区 | 色婷婷av一区二区三区软件| 视频一区视频二区中文| 国产精品色呦呦| 欧美r级在线观看| 欧美日本一区二区三区四区| 不卡一区二区三区四区| 另类调教123区| 亚洲国产精品久久人人爱蜜臀| 国产午夜精品理论片a级大结局| 欧美日韩一区二区三区在线看| 国产福利一区二区三区视频| 日韩国产欧美在线播放| 一区二区三区中文字幕精品精品| 久久综合久久久久88| 欧美精品丝袜中出| 色吧成人激情小说| 成人黄色电影在线| 国产乱人伦偷精品视频不卡| 午夜久久久影院| 亚洲一区二区三区精品在线| 日本一区二区三区四区| 精品国产乱码久久久久久图片| 欧美日本一区二区在线观看| 欧亚洲嫩模精品一区三区| 99精品视频一区二区| 菠萝蜜视频在线观看一区| 国产精品一区二区久激情瑜伽| 蜜桃视频免费观看一区| 日本午夜一本久久久综合| 日韩极品在线观看| 污片在线观看一区二区| 偷拍一区二区三区四区| 午夜成人免费视频| 日本成人中文字幕| 男女视频一区二区| 奇米精品一区二区三区在线观看| 亚洲第一搞黄网站| 亚洲自拍偷拍综合| 亚洲国产成人tv| 日日摸夜夜添夜夜添亚洲女人| 亚洲午夜成aⅴ人片| 亚洲福利视频一区| 亚洲成a人片在线观看中文| 亚洲成人午夜电影| 日韩激情中文字幕| 国产蜜臀97一区二区三区| 亚洲福利视频导航| 欧美视频一区二区在线观看| 99久久久久久| 久久婷婷综合激情| 精品久久一区二区| 91免费视频网| 在线中文字幕不卡| 国产欧美视频一区二区| 亚洲一区二区精品久久av| 国产一区二区三区在线看麻豆| 不卡一二三区首页| 久久综合狠狠综合| 亚洲成人免费电影| 色香蕉成人二区免费| 久久久久久久一区| 首页亚洲欧美制服丝腿| 97se狠狠狠综合亚洲狠狠| 精品美女一区二区三区| 亚洲韩国一区二区三区| 波多野洁衣一区| 久久丝袜美腿综合| 日本特黄久久久高潮| 欧美四级电影在线观看| 国产精品九色蝌蚪自拍| 狠狠色狠狠色合久久伊人| 制服丝袜中文字幕亚洲| 一区二区激情视频| 成人午夜免费视频| 久久久99免费| 久久激情综合网| 欧美一区二区三区日韩视频| 亚洲图片欧美一区| 欧美无人高清视频在线观看| 国产精品三级在线观看| 国产激情视频一区二区三区欧美| 精品免费视频.| 免费欧美在线视频| 51精品视频一区二区三区| 亚洲综合免费观看高清完整版在线 | 91在线一区二区三区| 中文字幕不卡三区| 国产一级精品在线| 久久久久国产精品麻豆ai换脸| 精品在线播放免费| 久久欧美中文字幕| 国产一区二区三区在线观看免费视频| 日韩欧美一区二区在线视频| 天天色天天操综合| 欧美一三区三区四区免费在线看| 亚洲bdsm女犯bdsm网站| 欧美三级资源在线| 亚洲不卡在线观看| 91麻豆精品国产91久久久使用方法| 亚洲成a人v欧美综合天堂| 欧美肥大bbwbbw高潮| 日本成人在线视频网站| 欧美一区二区三区免费| 欧美aa在线视频| 精品乱人伦一区二区三区| 久久99国产精品久久99| 国产人成亚洲第一网站在线播放| 国产精品一区不卡| 亚洲国产成人一区二区三区| 夫妻av一区二区| 综合电影一区二区三区| 日本韩国欧美三级| 五月天一区二区| 欧美r级电影在线观看| 国产成人精品三级| 亚洲六月丁香色婷婷综合久久 | 波多野结衣亚洲| 亚洲精品免费在线观看| 欧美日韩中文国产| 久久精品国产一区二区三区免费看| 亚洲精品一区二区在线观看| 国产成a人亚洲精| 亚洲欧美日韩国产成人精品影院| 欧美三级乱人伦电影| 日本视频一区二区| 国产日产欧美一区二区三区| 91在线丨porny丨国产| 亚洲图片欧美色图| 国产偷v国产偷v亚洲高清| 99精品国产视频| 美女在线一区二区| 国产精品视频九色porn| 欧美亚洲国产一区二区三区va| 日本网站在线观看一区二区三区 | xfplay精品久久| 91在线高清观看| 免费久久精品视频| 中文字幕亚洲在| 欧美一区二区三区免费观看视频| 高清日韩电视剧大全免费| 一区二区三区久久| 久久精品夜色噜噜亚洲a∨| 日本乱码高清不卡字幕| 美女一区二区在线观看| 成人免费一区二区三区视频 | 亚洲国产精品一区二区久久恐怖片| 日韩欧美一级二级三级久久久| 99视频热这里只有精品免费| 天天色综合成人网| 亚洲欧美偷拍三级| 精品国产凹凸成av人导航| 色综合久久88色综合天天6 | 在线中文字幕一区| 国产成人精品在线看| 日本亚洲三级在线| 亚洲综合丝袜美腿| 国产精品日韩成人| 欧美不卡在线视频| 91精品婷婷国产综合久久竹菊| 北条麻妃一区二区三区|