?? main.c
字號:
while(KeySt01==0) Delay(200);
UsrSel=255;
break; //退出
}
else if(KeySt02==0) //向上一項
{
Delay(200); //去抖
while(KeySt02==0) Delay(200);
if(UsrSel==0) UsrSel=5;
else if(UsrSel>0) UsrSel--;
//顯示選擇當前項
PrintOneASCII(0,0,' ');
PrintOneASCII(1,0,' ');
PrintOneASCII(2,0,' ');
PrintOneASCII(3,0,' ');
PrintOneASCII(4,0,' ');
PrintOneASCII(5,0,' ');
PrintOneASCII(UsrSel,0,'>');
}
else if(KeySt03==0) //向下一項
{
Delay(200); //去抖
while(KeySt03==0) Delay(200);
if(UsrSel==5) UsrSel=0;
else if(UsrSel<5) UsrSel++;
//顯示選擇當前項
PrintOneASCII(0,0,' ');
PrintOneASCII(1,0,' ');
PrintOneASCII(2,0,' ');
PrintOneASCII(3,0,' ');
PrintOneASCII(4,0,' ');
PrintOneASCII(5,0,' ');
PrintOneASCII(UsrSel,0,'>');
}
else if(KeySt04==0) //選中當前項
{
Delay(200); //去抖
while(KeySt04==0) Delay(200);
break;
}
}
ClearLCD();
if(UsrSel==0) //LCD背光開關
{
Lcdak=!Lcdak;
LCD_AK_Control(Lcdak); //開關背光
if(Lcdak) PrintConstAscStr(1,0,ScreenStr12[22],16); else PrintConstAscStr(1,0,ScreenStr12[23],16);
Delay(800);
}else if(UsrSel==1) //開關播放時間顯示
{
SWPlayTime=!SWPlayTime;
if(SWPlayTime) PrintConstAscStr(1,0,ScreenStr12[24],16); else PrintConstAscStr(1,0,ScreenStr12[25],16);
Delay(800);
}
else if(UsrSel==2) //音量控制
{
ChangeVS1011Vol(&CurVol);
}
else if(UsrSel==3) //低音調整
{
ChangeVS1011Bass(&CurBass);
}
else if(UsrSel==4) //外接喇叭
{
SWSpeaker=!SWSpeaker;
if(SWSpeaker) PrintConstAscStr(1,0,ScreenStr12[26],16); else PrintConstAscStr(1,0,ScreenStr12[27],16);
Delay(800);
}
else if(UsrSel==5) //快速歌曲定位
{
ChangePlayPosition(pdata);
}
if(CurStatus==1) //播放器當前正在播放
{
ClearLCD();
DisplayNumInt(1,0,*pdata,3);PrintOneASCII(1,24,'/');
DisplayNumInt(1,32,DEF_MAX_SONGS,3);
PrintConstAscStr(0,0,ScreenStr12[7],16); //顯示"正在播放Mp3文件:"
PrintHZ16(Mp3FileName,buff,2,16,8);
}
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
}
SEI();//開中斷
}
void main()
{
unsigned char Dir_Attrib = 0,retry=0;
unsigned long Size = 0;
unsigned long a;
unsigned int b;
unsigned int tmp,old_tmp;
unsigned char flgover;
unsigned char Lcdak=1;
unsigned long Clustervar; //找到字庫文件的起始簇號
MCUMode(10); //MCU不進入休眠模式
IniData_From_EEPROM(); //先讀取一下E2Prom信息
LCD_AK_Control(Lcdak); //打開背光
LCD_Ini();
KeyIni();KeyInput(); //LCD,鍵盤初始化
ClearLCD();
send_cmd(LCD_DISPLAY_NORMAL);
Display_Picture(MainUIPic); //顯示開機畫面
Delay(1500);
ClearLCD();
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
CLI();
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
SEI();
}
//初始化VS1011B,準備播放
SPI_CS_Deassert(); //PB2=1,釋放MMC/SD卡
VS1011B_XRESET_H();//使能芯片 //chip select
{
unsigned char funret;
funret=VS1011B_Init();
Delay(10);
if(funret>0) //初始化VS1011B,失敗
{
ClearLCD();
PrintConstAscStr(3,0,ScreenStr12[8],16);
DisplayNumChar(1,2,funret,3);
while(1) ;
}
}
//顯示正在讀取MMC卡
PrintConstAscStr(3,0,ScreenStr12[1],16);
//打開LM4906_Speaker:
DDRA&=~BIT(4);//端口A的第4位設置為輸出
PORTA|=BIT(4);//端口A的第4位輸出高電平
//關閉Vs1011b,返回到MMC_SD_SPI模式
VS1011B_DDR |= BIT(VS1011B_XCS)|BIT(VS1011B_XRESET); //XCS,XDCS=1
VS1011B_DISABLE();
MMC_SD_Init();//初始化MMC_SD_spi口
Delay(1500);
while(MMC_SD_Reset())//復位SD卡,失敗會retry++;
{
retry++;
if(retry>20) //超時,顯示失敗
{
ClearLCD();
PrintConstAscStr(3,0,ScreenStr12[0],16);
Delay(500);
while(MMC_SD_Reset()==1) ; //直到插入SD卡為止.
}
}
Clustervar=fat_root_dir_addr(buff); //獲取FDT.
//獲取字庫文件的第一個簇,第二個0參數,表明要尋找字庫文件
FONT_ClusterVar = fat_read_dir_ent(0,0,&Size,&Dir_Attrib,buff);
if (FONT_ClusterVar == 0xFFFFFFFF) //出錯,退出返回
{
//測試用代碼:
ClearLCD();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
PrintConstAscStr(3,0,ScreenStr12[2],16);
Delay(1000);
return ;
}else if(FONT_ClusterVar == 0xFFFFFFFE) //根目錄下的文件已經搜索完,返回
{
//測試用代碼:
ClearLCD();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
PrintConstAscStr(3,0,ScreenStr12[3],16);
Delay(1000);
return ;
}
//以后就可以使用該漢字字庫了,下面是一個測試
//ClearLCD();
//PrintConstHZ16(ScreenStr12[10],buff,3,0,16);
//Delay(1500);
//顯示主菜單,并選擇
//MainMenu();
////////////////////////////////////////
//開始進行Mp3文件的搜索與讀取:
fat_root_dir_addr(buff); //獲取FDT.
//////第一次將根目錄下的所有Mp3文件都掃描一遍,獲取歌曲的數目:
while(1)
{
for (tmp = 1;tmp < 999;tmp++)
{
Clustervar = fat_read_dir_ent(0,tmp,&Size,&Dir_Attrib,buff);
////測試使用:
//DisplayLong(Clustervar,1);
//
if (Clustervar == 0xFFFFFFFF) //出錯,退出返回
{
DEF_MAX_SONGS=0;
ClearLCD();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
SWPlayTime=0;
PrintConstAscStr(1,0,ScreenStr12[4],16);
Delay(1000);
while(1) ;
}else if(Clustervar == 0xFFFFFFFE) //根目錄下的文件已經搜索完,返回
{
//更新DEF_MAX_SONGS:
DEF_MAX_SONGS=tmp-1;
ClearLCD();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
//DisplayNumInt(4,32,DEF_MAX_SONGS);
Delay(500);
goto Mp3_Play_Begin;
}
}
}
Mp3_Play_Begin:
//////////////////////////////////////////////////////////
timer0_init(); //打開定時器T0
TotalSongTim[0]=TotalSongTim[1]=TotalSongTim[2]=TotalSongTim[3]=0; //歌曲總播放時間初始0
while(1)
{Begin:
for (tmp = 1;tmp < DEF_MAX_SONGS;tmp++)
{
//順序讀取根目錄下的第tmp個指定文件(在FAT.C中定義),然后播放.
read_Mp3_file:
//關閉Vs1011b,返回到MMC_SD_SPI模式
VS1011B_DDR |= BIT(VS1011B_XCS)|BIT(VS1011B_XRESET); //XCS,XDCS=1
VS1011B_DISABLE();
SPI_CS_Assert();
CurSongTim[0]=CurSongTim[1]=CurSongTim[2]=0; //當前歌曲播放時間初始0
Clustervar = fat_read_dir_ent(0,tmp,&Size,&Dir_Attrib,buff);
////測試使用:
//DisplayLong(Clustervar,1);
//
if (Clustervar == 0xFFFFFFFF) //出錯,退出返回
{
//測試用代碼:
ClearLCD();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
SWPlayTime=0;
PrintConstAscStr(1,0,ScreenStr12[4],16);
Delay(1000);
break;
}else if(Clustervar == 0xFFFFFFFE) //根目錄下的文件已經搜索完,返回
{
ClearLCD();
Display_BattVol(BattVolPic,retry);//顯示ADC電量
PrintConstAscStr(1,0,ScreenStr12[5],16);
Delay(1000);
break;
}
strcpy((char *)Mp3FileName,(char *)pointer_FDT);
//顯示并讀取該文件:
ClearLCD();
//顯示播放歌曲序號
DisplayNumInt(1,0,tmp,3);PrintOneASCII(1,24,'/');
DisplayNumInt(1,32,DEF_MAX_SONGS,3);
Display_BattVol(BattVolPic,retry);//顯示ADC電量
PrintConstAscStr(0,0,ScreenStr12[7],16); //顯示"正在播放Mp3文件:"
PrintHZ16(Mp3FileName,buff,2,16,8);
CurStatus=1; //播放器當前正在播放
for(a=0;;a++)
{
//讀取該文件
flgover = fat_read_file(Clustervar,buff,a,&Dir_Attrib);
if(flgover==1) //讀取文件簇鏈完畢,繼續下一個文件
{
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
CLI();
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
SEI();
}
break;
}else
{
for(b = 0; b < 512; b+=32)
{
//播放文件
if((a*512+b)<Size) //讀取文件還沒有超出其大小
{
//切換到VS1011B:
SPI_CS_Deassert(); //SD_CS=1,釋放MMC/SD卡
VS1011B_XRESET_H();//使能芯片VS1011
while(!(PINA & BIT(VS1011B_DREQ))) ; //等待VS1011B需要讀取數據
{
unsigned char i;
for(i=0;i<32;i++)
VS1011B_WriteDAT(*(buff+b+i));
}
//返回到MMC_SD_SPI模式
VS1011B_DDR |= BIT(VS1011B_XCS)|BIT(VS1011B_XRESET); //XCS,XDCS =1;
SPI_CS_Assert(); //打開MMC/SD
if(KeySt01==0) //打開/關閉背光
{
//等待該鍵釋放
Delay(200);
while(KeySt01==0) Delay(200);
Lcdak=!Lcdak;
LCD_AK_Control(Lcdak); //開關背光
}
else if(KeySt02==0) //Previous
{
//等待該鍵釋放
Delay(200);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
CLI();
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
SEI();
}
while(KeySt02==0) Delay(200);
SPI_CS_Deassert(); //PB2=1,釋放MMC/SD卡
VS1011B_XRESET_H();//使能Vs1011芯片
VS1011B_SoftReset();
tmp--;
if(tmp<1) tmp=DEF_MAX_SONGS; //循環播放
goto read_Mp3_file;
}
else if(KeySt03==0) //Next
{
//等待該鍵釋放
Delay(200);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
CLI();
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
SEI();
}
while(KeySt03==0) Delay(200);
SPI_CS_Deassert(); //PB2=1,釋放MMC/SD卡
VS1011B_XRESET_H();//使能Vs1011芯片
VS1011B_SoftReset();
tmp++;
if(tmp>DEF_MAX_SONGS) tmp=1; //循環播放
goto read_Mp3_file;
}
else if(KeySt04==0) //顯示設置主菜單
{
//等待該鍵釋放
Delay(200);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
CLI();
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
SEI();
}
while(KeySt04==0) Delay(200);
//顯示主菜單,并選擇
old_tmp=tmp; //保存原來的tmp值
MainMenu(&tmp);
if(old_tmp!=tmp) //如果改變了播放曲目的話,就跳轉
goto read_Mp3_file;
//goto Begin;
}
}
else if((a*512+b)>(Size+512)) //超過文件實際大小,強制讀完
{
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
Display_BattVol(BattVolPic,retry);
while(retry==0 && KeySt01!=0) //電量空,提醒用戶充電
{
CLI();
PrintConstAscStr(7,16,Menustr6[6],13);
Delay(500);
ADC_Init(); //進行一次AD轉換,測量電池電量,并且顯示出來
retry=ADC_Convert();
SEI();
}
//強制下一首
SPI_CS_Deassert(); //PB2=1,釋放MMC/SD卡
VS1011B_XRESET_H();//使能芯片 //chip select
VS1011B_SoftReset();
tmp++;
if(tmp>DEF_MAX_SONGS) tmp=1;
goto read_Mp3_file;
}
else //向vs1011b發送0數據
{
//切換到VS1011B:
SPI_CS_Deassert(); //PB2=1,釋放MMC/SD卡
VS1011B_XRESET_H();//使能芯片 //chip select
while(!(PINA & BIT(VS1011B_DREQ))) ; //等待VS1011B需要讀取數據
{
unsigned char i;
for(i=0;i<32;i++)
VS1011B_WriteDAT(0);
b+=32;
}
//返回到MMC_SD_SPI模式
VS1011B_DDR |= BIT(VS1011B_XCS)|BIT(VS1011B_XRESET); //XCS,XDCS =1;
SPI_CS_Assert(); //打開MMC/SD
}
}
}
}
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -