/******************************************************************************* * Scope Program * ソース名:SD_File_List_Select_MP3_Player_TEST.C * (SD_File_List_Select_TEST.Cからの、拡張版) * * <このTESTの目的> *  @ SDカードに格納されているファイルリストをGLCDに表示してみる *  A SDカードに格納されている、任意の位置の音楽ファイル(MP3及び、WAV) * を読出し、再生する * * <テスト仕様概要> *  @ SDに格納されている、MP3ファイルを、8個まで読出し、そのファイルリスト *    を、GLCDに表示する(GLCDの、1画面分で表示できるキャラクタ行が、 * 最大8行なため、これで制限、また今回は、スクロール機能は無しとする) *  A SELECT SWで、選択したいファイルの所へ、●キャラクタを移動 *  B ENTER SWで、選択を確定する *  C ファイル選択が確定したら、選択されたファイルの後ろに *  スピーカキャラクタを表示し、その音楽ファイルの再生を行う *  D 再生が終了したら、選択画面を初期化し繰返す * * ファイルシステム:MMD File System→ FAT16(FAT32互換) * Graphic LCD(Monochrome): SG12864A * MPEG Audio Codec LSI: VS1011e(EXT CLK:12.288MHz) * * Condition: * 8MHz External X'tal Oscillator, 20x PLL (8MHzx20= 160MHz) * Fcy=160MHz/2=80MHz, Tcy=12.5ns * * CPU: PIC32MX340F256H * * N.Ishii 2013.9.13  **********************************************************************************/ #include /* PIC32 peripheral library */ #include "glcd_lib32k.h" #include #include // コンフィギュレーション設定 // CPU=80MHz Peri=80MHz,HS+PLL,Divider=1/2,PLL=x20,WDT=Off #pragma config FNOSC=PRIPLL, POSCMOD=HS, FPLLIDIV=DIV_2 #pragma config FPLLMUL=MUL_20, FPBDIV=DIV_1, FPLLODIV=DIV_1 #pragma config FWDTEN=OFF, ICESEL=ICS_PGx2 /// ファイルシステム用変数 FSFILE *fptr; // PIC24Fの時は、FSFILE *pfile; size_t result; // 同じ SearchRec Record; SearchRec *rptr = &Record; //char FileName[20][9]; char FileName[20][13]; // 2次元配列: 最大、20ファイルで、1ファイル→13文字(8文字+'.MP3'+NULL)構成 /// VS1011用変数 short Volume, BASS; unsigned char Buffer[256]; /// グローバル変数 short FileNo; short FileNo_temp; short i; /// プロトタイプ void DispFiles(void); short Select(void); //void CopyFile(int No); /******* メインルーチン ***********/ int main(void) { //システム最適設定 SYSTEMConfigPerformance(80000000); mJTAGPortEnable(DEBUG_JTAGPORT_OFF); // JTAGを無効化 //I/O設定 AD1PCFG = 0xFFFE; // デジタルに // GLCD制御信号レベルの初期化 LCD_E = 0; LCD_CS1 = 1; LCD_CS2 = 1; LCD_RW = 1; LCD_DI = 1; LCD_TRIS = 0x0000; // LCDデータバス(DB0-DB7)オール出力(TRISE= 0) TRISD = 0x0F00; // SW2:SEL_SW,SW3:ENT_SW,未使用SW(SW4,SW5):入力 // LCD_CS1,CS2,RS:出力・デバッグLED:出力、他未使用ピンは出力設定 TRISF = 0x0034; // VS1011_SCK1,SDO:出力、SDI1:入力・ LCD_E,RW:出力、他未使用ピンは入力設定 TRISG = 0x028C; // SD_SDO,SCK:出力、SDI:入力・他未使用ピンは入力設定 TRISB = 0x4FDF; // VS1011_CS,RESET,DCS:出力、DREQ:入力・SD_CS:出力、WE,CD:入力、他未使用ピンは入力設定 CNPUE = 0x0060; // SD_CD(CN5),WE(CN6)のみ内部プルアップ LATDbits.LATD3 = 1; // デバッグLED消灯 /// 液晶表示器の初期化 lcd_Init(); /// VS1011eの初期化 VS1011_Init(); // Initialize VS1011 Port+ SPI2(CKP=4M)+ SDI_TestMode+ CLK Doubler Volume = 0x08; // Set Volume = -8[dB] SetVolume(Volume, Volume); BASS = 0; // Set Bass Boost = off SetBassBoost(BASS, 15); delay_ms(1000); // Start VS1011e Sine Test // VS1011_SineTest(); // Start Sin_5kHz /************* メインループ ****************/ while(1) { lcd_Clear(0); // 画面消去 LATDbits.LATD3 = 1; // デバッグLED点灯消灯 /// カード挿入まで待ちファイル有無確認 while(fptr == 0){ lcd_Clear(0); // 画面消去 if(!MDD_MediaDetect()){ // カード挿入中か? lcd_Str(0, 0, "Wait Card Insert!"); // 挿入待ちメッセージ } else{ /*** ファイルオープンとファイル名表示 ***/ lcd_Str(0, 1, "Find Card OK!"); FSInit(); // FS初期化 /* 最初のファイルのサーチ */ result = FindFirst("*.*", ATTR_ARCHIVE, rptr); if(result != 0){ // ファイルありか? lcd_Str(0, 1, "Find No File?"); // ファイル無しメッセージ } else break; // ファイル発見で抜ける } delay_ms(500); // 0.5秒ごとに繰り返し } /// ファイルが発見できた場合の処理 DispFiles(); // ファイル名一覧表示処理 FileNo = Select(); // ファイル選択処理 LATDbits.LATD3 = 0; // デバッグLED点灯 /// ファイルNo.表示 lcd_Char1(7, 16, 0x4E); // 'N'表示 FileNo_temp = FileNo; FileNo = FileNo | 0x30; // FileNo= 0〜 7の範囲を取得するものとして、アスキー変換 lcd_Char1(7, 17, FileNo); /// 選択されたファイルの再生処理 // fptr = FSfopen(FileName[FileNo], "r"); // ファイルを開く fptr = FSfopen(FileName[FileNo_temp], "r"); // ファイルを開く if (fptr != 0) { // Success File Open ? // Out of Music Data As Far as EOF of File do{ MP3_XDCS_IO = 0; /// File Read (Unit 256Byte) result = FSfread(Buffer, 1, 256, fptr); for( i= 0; i=8) // 8個目を超えたか? break; // 終わって抜ける } } /*********************************************** * ファイル選択 * 指定されたMP3ファイルのファイル番号を返す ***********************************************/ short Select(void){ short i, Ptr; lcd_Char(0, 0, 0x8C); // '●'を選択初期位置(先頭)に表示 Ptr = 0; while(PORTDbits.RD10 != 0){ // Enterスイッチチェック if(PORTDbits.RD11 == 0){ // Selectスイッチチェック Ptr++; // 次の行へ for(i=0; i<=Ptr; i++) // 2つ目以降のファイルが選択された場合、 lcd_Char(i, 0, 0x20); // その前に表示されている、選択キャラクタ'●'をクリアする lcd_Char(Ptr, 0, 0x8C); // '●'を選択位置に表示 if(Ptr > 7) { // 最終行で先頭に戻す Ptr = 0; lcd_Char(7, 0, 0x20); // その前に表示されている、選択キャラクタ'●'をクリアする lcd_Char(0, 0, 0x8C); // '●'を選択初期位置(先頭)に表示 } while(PORTDbits.RD11 == 0); // Selestスイッチリリース待ち delay_ms(100); // チャッタリング回避 } } /// ENTERが押されたら、選択位置のファイル名の後に、スピーカーキャラクタを表示: 130912 lcd_Char1(Ptr, 14, 0x9B); return(Ptr); // 行番号を返す }