/******************************************************************************* * ソース名:PIC32MX_UL024TF_ImageDisp_TEST.C * * <このTESTの目的> *  @ SDカードに収録されている16bitカラーBMPファイル(100*100ドット)を読出し *   UL024TF液晶に、そのイメージを表示する。 * * ※ データフォーマットは、RGB565とする。 * * 簡易テストなので、SWで、次のファイルをサーチする機能は無しにした。 * 但し、SDに収録されている、BMPファイルの、順次繰返し描画は可能にした。 * * PIC32MXトレーニング基板を使用した。 * * ファイルシステム:MMD File System→ FAT16(FAT32互換) * 2.4inch QVGAカラー液晶(aitendo): UL024TF * * Condition: * 8MHz External X'tal Oscillator, 20x PLL (8MHzx20= 160MHz) * Fcy=160MHz/2=80MHz, Tcy=12.5ns * * CPU: PIC32MX340F256H * * N.Ishii 2016.8.27 **********************************************************************************/ #include /* PIC32 peripheral library */ #include "colorlcd_libdsPICVH.h" #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; size_t result; SearchRec Record; SearchRec *rptr = &Record; /// データバッファ unsigned short ImageBuffer[10000]; // 16bitBMPデータバッファ:10000ワード= 100x100 /// プロトタイプ void Glcd_Image2(void); /******* メインルーチン ***********/ int main(void) { //システム最適設定 SYSTEMConfigPerformance(80000000); mJTAGPortEnable(DEBUG_JTAGPORT_OFF); // JTAGを無効化 //I/O設定 AD1PCFG = 0xFFFF; // 全てデジタルに(タッチ用設定は、AN4(X-)、AN3(Y+)なので、0xFFE7) TRISE = 0x0000; // LCDデータバス(DB0-DB7)オール出力 TRISD = 0xFFA7; // LCD_CS,RESET:全て出力・デバッグLED:出力・SW2-5:入力、他未使用ピンは入力設定 TRISB = 0x4FC7; // VS1011_CS,RESET,DCS:出力、DREQ:入力・SD_CS:出力、LCD_WR,LCD_RS:出力、他未使用ピンは入力設定 // (今回は、VS1011は未使用だが、将来使う予定なので、その設定にしておく) TRISF = 0xFFFC; // 今回Fポートは未使用だが、RF0,RF1のみ出力設定にした LATDbits.LATD3 = 1; // デバッグLED消灯 /// 液晶表示器の初期化 Glcd_Init(); Glcd_Clear(BLACK); Glcd_Str(0, 0, "Image Disp Test", CYAN, BLACK); delay_ms(1000); Glcd_Clear(BLACK); /// カード挿入まで待ちファイル有無確認(CDの無いUL024TF使用のため、MDD_MediaDetect()の戻り値を強制的に、'1':挿入にしている。) while(fptr == 0){ Glcd_Clear(BLACK); // 画面消去 if(!MDD_MediaDetect()){ // カード挿入中か? Glcd_Str(0, 0, "Wait Card Insert!", CYAN, BLACK); // 挿入待ちメッセージ(今回はここは常に実行しない) } else{ // 常にカード挿入状態を実行する。 /*** ファイルオープンとファイル名表示 ***/ Glcd_Str(0, 1, "Find Card OK!", CYAN, BLACK); FSInit(); // FS初期化 /* 最初のファイルのサーチ */ result = FindFirst("*.BMP", ATTR_ARCHIVE, rptr); if(result != 0){ // ファイルありか? Glcd_Str(0, 1, "Find No File?", CYAN, BLACK); // ファイル無しメッセージ } else break; // ファイル発見で抜ける } delay_ms(500); // 0.5秒ごとに繰り返し } /// ファイルが発見できた場合の処理 delay_ms(500); Glcd_Str(0, 1, Record.filename, CYAN, BLACK); // ファイル名表示 delay_ms(1000); Glcd_Clear(BLACK); // 画面消去 fptr = FSfopen(Record.filename, "r"); // File Open (Read Mode) /************* メインループ ****************/ while(1) { if(fptr != 0){ // ファイルオープンに成功の場合、以下を実行 FSfread(ImageBuffer,1,138,fptr); // ヘッダ情報部の、規定バイト数:138バイト分は、読み飛ばす FSfread(ImageBuffer,2,10000,fptr); // BMPデータを、バッファへ全て(10000ワード)転送 Glcd_Image2(); // 最上段からイメージ描画する FSfclose(fptr); // イメージ描画が終了したら、ファイルをクローズ delay_ms(2000); // 2秒間表示 Glcd_Clear(BLACK); // 画面消去 /// 次の、BMPファイルをサーチし、繰返す result = FindNext(rptr); // To Next File if ((result==0) && (Record.attributes == ATTR_ARCHIVE)) // 次の、BMPファイルが見つかったら、オープン fptr = FSfopen(Record.filename, "r"); else { // 次の、BMPファイルが見つからなかったら、最初のファイルをサーチして繰返す result = FindFirst("*.BMP", ATTR_ARCHIVE, rptr); if (result == 0) { fptr = FSfopen(Record.filename, "r"); // File Open (Read Mode) } } Glcd_Str(0, 1, Record.filename, CYAN, BLACK); // ファイル名表示 delay_ms(1000); Glcd_Clear(BLACK); // 画面消去 } } } //-------------------------------------------------------------------------------- /******************************************************** * 16bitBMPカラーイメージ表示関数 * 100x100dot対応 *********************************************************/ void Glcd_Image2(void) { short Xpos, Ypos, ptr; /// BMPフォーマットのデータは、左下から右上に向かって配列されているので /// この順で描画すると、上下逆様の画像表示になってしまう。 /// 右上の画素(ptr=9999, Xpos= 99, Ypos= 0)から下に向かって描画する必要がある。 ptr= 9999; for(Ypos=0; Ypos < 100; Ypos++){ for(Xpos=99; Xpos > -1; Xpos--){ Glcd_Pixel(Xpos, Ypos, ImageBuffer[ptr--]); } } }