/********************************************************************* * PIC24F用の、カラーOLEDテスト * プロジェクト名: PIC24F_COLOR_OLED_TEST * * PIC24Fトレーニング基板を使い、カラーOLED表示テストを行った。 * * Condition: * 8MHz Internal RC oscillator, 4x PLL (8MHzx4= 32MHz) * Fcy=32MHz/2=16MHz, Tcy=62.5ns * * CPU: PIC24FJ64GA002 * * 0.95インチカラーOLED(aitendo): NYK-064SC012F * * デバッグ年月日: 2017/12/2 N.Ishii *********************************************************************/ #include "p24FJ64GA002.h" #include "SSD1332_OLEDlibPIC24F.h" /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF // JTAGの使用:無効 & GCP_OFF // コードプロテクト:しない & GWRP_OFF // 書き込みプロテクト:しない & BKBUG_OFF // バックグラウンドデバッグ:無効 & COE_OFF // クリップオンエミュレーション:無効 & ICS_PGx1 // EMUC/EMUDをPCG1/PGD1と共用 & FWDTEN_OFF // WDT:無効 ) /// Fosc = FRC (Fosc=32MHz) _CONFIG2( IESO_OFF // 2速度スタートアップ:無効 & FNOSC_FRCPLL // 8MHz Internal RC oscillator, 4x PLL-> 8MHzx4=32MHz & FCKSM_CSDCMD // クロック切り替え・クロックモニタ:供に無効 & OSCIOFNC_ON // OSCOピン機能:RA3ポートとする 161118 & IOL1WAY_OFF // RPレジスタプロテクト:プロテクトしない & I2C1SEL_PRI // I2C1のピン選択:主ピンを使用する & POSCMOD_NONE // 主発振器:使用しない ) int main(void) { int i,j,index; //// I/O設定 AD1PCFG = 0xFFFF; // A/D Digi 選択:全デジタルI/Oに設定 CLKDIV = 0x0000; // System Clock devider 1:1 /// Setup PORT In/Out TRISB = 0x000F; // RB4-15は、OLED制御出力 他は未使用入力 TRISA = 0x0006; // RA0= OLED_VCC_ON出力, RA3= 赤LED、RA4= OLED_RESET出力、他は入力 /// Set Pull Up CNPU1 = 0x0030; // Pull Up Port is RB0(ピン1), RB1(ピン2) TRISAbits.TRISA3= 0; // 赤LED:デバッグ用 LATAbits.LATA3 = 1; // 赤LED消灯 OLEDInit(); // OLEDコントローラー初期化 GCls(BLACK); // 画面消去 OLEDDispON(); // OLED表示スタート OLED_Str(0, 0, "Start Test!!", CYAN, BLACK); delay_ms(2000); GCls(BLACK); // クリア /// 定義カラーコードでの、全画面フィルBOX描画---------------------------------------------------------------------------- GCls(WHITE); delay_ms(2000); GCls(BLACK); delay_ms(2000); GCls(RED); delay_ms(2000); GCls(GREEN); delay_ms(2000); GCls(BLUE); delay_ms(2000); GCls(CYAN); delay_ms(2000); GCls(MAGENTA); delay_ms(2000); GCls(YELLOW); delay_ms(2000); GCls(BROWN); delay_ms(2000); GCls(ORANGE); delay_ms(2000); GCls(PERPLE); delay_ms(2000); GCls(COBALT); delay_ms(2000); delay_ms(5000); // 5秒待ち GCls(BLACK); // クリア ///文字列描画---------------------------------------------------------------------------------------------- OLED_Str(0,0,"Hellow",BLACK,WHITE); OLED_Str(1,1,"World !!",RED,WHITE); OLED_Str(2,2,"Japan",BLUE,WHITE); OLED_Str(3,3,"Tokyo",WHITE,BLACK); OLED_Str(0,4,"Chiyodaku",RED,BLACK); OLED_Str(1,5,"Sotokanda",GREEN,BLACK); OLED_Str(2,6,"Akihabara",RED,YELLOW); OLED_Str(3,7,"AKB48",GREEN,YELLOW); delay_ms(5000); // 5秒待ち GCls(BLACK); // クリア ///-------------------------------------------------------------------------------------------------------- /// ASCII文字(全192文字)の描画---------------------------------------------------------------------------------------- // 1画面目: ASCII文字、12文字/行 * 8文字/列=96文字表示 for(j=0; j<8; j++){ for(i=0; i<12; i++){ index = j*12+i+0x20; // スペースコードから開始し、1行12文字で繰返し if (j<2) OLED_Char(i, j, index, WHITE, BLACK); // 文字表示制御 if ((j>1) && (j<4)) OLED_Char(i, j, index, GREEN, BLACK); if ((j>3) && (j<6)) OLED_Char(i, j, index, RED, BLACK); if ((j>5) && (j<8)) OLED_Char(i, j, index, YELLOW, BLACK); } } delay_ms(5000); // 5秒待ち GCls(BLACK); // クリア // 2画面目: 残り96文字表示 for(j=0; j<8; j++){ for(i=0; i<12; i++){ index = j*12+i+0x20+96; // 0x80='|_'から開始し、1行12文字で繰返し if (j<2) OLED_Char(i, j, index, WHITE, BLACK); // 文字表示制御 if ((j>1) && (j<4)) OLED_Char(i, j, index, GREEN, BLACK); if ((j>3) && (j<6)) OLED_Char(i, j, index, RED, BLACK); if ((j>5) && (j<8)) OLED_Char(i, j, index, YELLOW, BLACK); } } delay_ms(5000); // 5秒待ち GCls(BLACK); // クリア ///-------------------------------------------------------------------------------------------------------- /// 斜め直線描画------------------------------------------------------------------------------------------ OLED_Line(0, ENDROW-1, ENDCOL-1, 0, RED); // 右肩下がり OLED_Line(0, 0, ENDCOL-1, ENDROW-1, BLUE); // 右肩上がり delay_ms(5000); // 5秒待ち GCls(BLACK); // クリア ///----------------------------------------------------------------------------------------------------- /// 直線描画テスト-------------------------------------------------------------------------------------------- i = 0; for(j=0; j<32; j+=2){ // ボックス表示 OLED_Line(j,j, 95-j, j,CYAN); // 次第に小さなボックスへ OLED_Line(j,j, j, 63 -j,CYAN); OLED_Line(95-j,63-j, 95-j,j,CYAN); OLED_Line(95-j,63-j, j,63-j,CYAN); delay_ms(500); } delay_ms(5000); GCls(BLACK); // クリア /// 円の描画------------------------------------------------------------------------------------------------- for(i = 0; i < 10; i++){ OLED_Circle(ENDCOL/2 + 2*i,ENDROW/2,ENDROW/2,GREEN); } delay_ms(5000); GCls(BLACK); // クリア ///---------------------------------------------------------------------------------------------------------- /// カラーBMPイメージの描画----------------------------------------------------------------------------------- OLED_Image(); ///---------------------------------------------------------------------------------------------------------- LATAbits.LATA3 = 0; // 赤LED点灯 while(1); }