/******************************************************************************* * ソース名:SD_File_List_LoopPlayer16_TEST.C * * 大目的:スクロール表示の実験(16曲MAXのループ再生:8曲×2画面分) * * スクロール機能; * ファイルリスト表示(1画面8ファイルMAXの、スクロール表示) * (既に格納された、FileNameバッファの内容を基に表示) * スクロールさせながら16曲MAXのループ再生を行う * * SKIP SWによる曲送り機能: * 再生中に、SKIP SWを押すと、その曲の再生を中断し、次の曲の再生に移行する * 16曲目に、SKIP SWを押すと、トップの曲に戻る * * 特記事項: * 16曲目で、SKIP SWを押した時の動作が変(すぐにトップに移行しない。そのまま通常 * 再生に戻って再生を終えトップには戻るが・・・)なので、SWセンスの方法を、割込み * から、メインでのエッジセンスに変更してみた * * * ファイルシステム:MMD File System→ FAT16(FAT32互換) * Graphic LCD(Monochrome): SG12864A * MPEG Audio and MIDI Codec LSI: VS1053b(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.11.2 **********************************************************************************/ #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 /// メッセージ・テーブル char str_FileNo[] = "Nxx"; /// ファイルシステム用変数 FSFILE *fptr; size_t result; SearchRec Record; SearchRec *rptr = &Record; 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; short sq; short FN_Top; // 画面先頭に表示するファイル名バッファのポインタ short sw_m0 = 0; // SKIP SW short sw_m1 = 0; short sw_m2 = 0; /// プロトタイプ void StoreFiles_and_DispFiles(void); void itostring(char digit, unsigned int data, char *buffer); //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:SKIP_SW,未使用SW(SW3,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 sq = 0; /************* メインループ ****************/ while(1) { switch (sq) { case 0: /// 最初のファイル発見と、ファイルリスト表示〜最初のファイルオープン lcd_Clear(0); // 画面消去 LATDbits.LATD3 = 1; // デバッグLED消灯 FileNo = 0; FN_Top = 1; fptr = 0; /// カード挿入まで待ちファイル有無確認 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秒ごとに繰り返し } /// ファイルが発見できた場合の処理 StoreFiles_and_DispFiles(); // FileNameバッファへの、SD内音楽ファイル名の格納(最大16ファイル)と、 // 初期ファイル名一覧表示処理(最大8ファイル) /// 最初のファイル番号表示 itostring(2, FileNo, str_FileNo + 1); lcd_Str(7, 15, str_FileNo); /// 最初のファイルを開く fptr = FSfopen(FileName[FileNo], "r"); sq++; break; case 1: /// 初期ファイルリスト画面→ 8曲分再生 while((fptr != 0) && (FileNo < 8)){ // ファイルオープン成功? lcd_Char(FileNo, 0, 0x8C); // '●'を表示 /// Out of Music Data As Far as EOF of File do{ sw_m0 = PORTDbits.RD11; //New SW Data sw_m2 = sw_m1^(sw_m0 & sw_m1); //Neg_Edge Sence SW sw_m1 = sw_m0; //Chenge New Data to Old Data m1 if (sw_m2 != 1) { MP3_XDCS_IO = 0; /// File Read (Unit 32Byte) result = FSfread(Buffer, 1, 32, fptr); for( i= 0; i=16) // 格納ファイルが16個目を超えたか? break; // 終了して抜ける } } /***************************************** * 数値から文字列に変換 *****************************************/ void itostring(char digit, unsigned int data, char *buffer){ char i; buffer += digit; // 文字列の最後 for(i=digit; i>0; i--) { // 最下位桁から上位へ buffer--; // ポインター1 *buffer = (data % 10) + '0'; // その桁数値を文字にして格納 data = data / 10; // 桁-1 } }