/**************************************************************************** * メイン・プログラム:UG-2864HSWEG01 OLEDモジュール表示テスト * * 2017.10.25 N.Ishii *****************************************************************************/ #include "p24FJ64GA002.h" #include "SSD1306_OLEDlibPIC24F.h" //#include /// コンフィギュレーション ビットの設定 _CONFIG1( JTAGEN_OFF // JTAGの使用:無効 & GCP_OFF // コードプロテクト:しない & GWRP_OFF // 書き込みプロテクト:しない & BKBUG_OFF // バックグラウンドデバッグ:無効 & COE_OFF // クリップオンエミュレーション:無効 & ICS_PGx1 // EMUC/EMUDをPCG1/PGD1と共用 & FWDTEN_OFF // WDT:無効 ) /// Fosc = FRC (8MHz),Fcy= 4MHz or FRC (8MHz) 4x PLL= 32Mz, Fcy= 16MHz /// 以下は、Fosc = FRC (8MHz),Fcy= 4MHzの設定 /// Fcy= 16MHzにするには、FNOSC_FRCPLLのコメントアウトを外し、FNOSC_FRCPLLにコメントアウトする。 _CONFIG2( IESO_OFF // 2速度スタートアップ:無効 & FNOSC_FRC // 発振器の選択:FRCを選択する // & FNOSC_FRCPLL // 8MHz Internal RC oscillator, 4x PLL-> 8MHzx4=32MHz & FCKSM_CSDCMD // クロック切り替え・クロックモニタ:供に無効 // & OSCIOFNC_OFF // OSCOピン機能:OSCOまたはFosc/2の出力する & OSCIOFNC_ON // OSCOピン機能:RA3ポートとする 161118 & IOL1WAY_OFF // RPレジスタプロテクト:プロテクトしない & I2C1SEL_PRI // I2C1のピン選択:主ピンを使用する & POSCMOD_NONE // 主発振器:使用しない ) unsigned char SegmentBuffer[128][8]; // picは初期化しなても全エリア、リセット後は、0x00になっている。 /// プロトタイプ宣言 //void ltostring(char digit, unsigned long data, char *buffer); int main(void) { unsigned char i,y; unsigned char x0=0,y0=0,x1=127,y1=63; // 次第に小さな四角形描画テスト用 //// I/O設定 AD1PCFG = 0xFFFF; // A/D Digi 選択:全デジタルI/Oに設定 CLKDIV = 0x0000; // System Clock devider 1:1 /// Setup PORT In/Out TRISB = 0x0000; // all output TRISAbits.TRISA3= 0; // 赤LED:デバッグ用 N.Ishii 161118 TRISAbits.TRISA4= 0; // 緑LED:デバッグ用 N.Ishii 161118 LATAbits.LATA3 = 1; // 赤LED消灯 161118 LATAbits.LATA4 = 1; // 緑LED消灯 161118 /// OLED表示器の初期化と開始メッセージ表示 OLED_init(); //// 文字列(メッセージ)表示-------------------------------------------------------------------------------- OLED_ROMstr("Start Test !!"); // 1stメッセージ OLED_locate(18,2); // x=4キャラ目(横4キャラ目より表示:1キャラ幅5dot+1dot自動スペースで1文字構成=6dot幅 // になるので、4キャラ目のx座標(dot単位)指定= (4-1)*6= 18 になる。) OLED_ROMstr("by N.Ishii"); // 2stメッセージ delay_ms(5000); //// 全キャラクタ表示(192文字)----------------------------------------------------------------------------- /// 1画面目: 168文字表示 OLED_locate(0,0); y=0; for(i=0; i<168; i++) { if((i>20) && (i%21==0)){ y++; OLED_locate(0,y); } OLED_char(i+0x20); } delay_ms(5000); /// 2画面目: 残り24文字表示 OLED_clear_all(BLACK); // 全画面クリア y= 0; for(i=0; i<24; i++) { if((i>20) && (i%21==0)){ y++; OLED_locate(0,y); } OLED_char(i+(0x20+168)); // 0xC8='ne'から } delay_ms(5000); OLED_clear_all(BLACK); // 全画面クリア //// 次第に小さな四角形描画 --------------------------------------------------------------------------- for(i=0; i<32; i+=2){ Draw_Rectangle_Line(x0+i,y0+i,x1-i,y1-i,WHITE); // 最初は、FULL SIZE 次第に小さな四角形描画 delay_ms(500); } delay_ms(5000); OLED_clear_all(BLACK); // 全画面クリア //// 斜め直線描画_1(ドット描画関数のテスト)----------------------------------------------------------------- for(i=0; i<64; i++){ // 斜め直線の表示 Draw_Pixel(i, i, WHITE); Draw_Pixel(64+i, i, WHITE); } delay_ms(5000); OLED_clear_all(WHITE); // 全画面クリア白 for(i=0; i<64; i++){ // 斜め直線白抜き表示 Draw_Pixel(i, i, BLACK); Draw_Pixel(64+i, i, BLACK); } delay_ms(5000); OLED_clear_all(BLACK); // 全画面クリア //// 斜め直線描画_2(ライン描画関数のテスト:画面一杯にクロス斜め直線描画)----------------------------------- Draw_Line(0, 0, 127, 63, WHITE); Draw_Line(127, 0, 0, 63, WHITE); delay_ms(5000); OLED_clear_all(BLACK); // 全画面クリア //// 円の描画 -------------------------------------------------------------------------------- for(i = 0; i < 10; i++){ Draw_Circle(OLED_WIDTH/2 + 2*i,OLED_HEIGHT/2,OLED_HEIGHT/2,WHITE); } delay_ms(5000); OLED_clear_all(BLACK); // 全画面クリア //// 簡易FFTアナライザ(予定)の、グラフ軸・目盛描画デモ ------------------------------------------------- Draw_Horizontal_Line(0,53,127,WHITE); // 下段0-127(y=53)に水平線描画 // 目盛描画 for(i= 0; i < 128; i+= 4){ Draw_Vertical_Line(i,53,54,WHITE); } // デビジョン表示 OLED_locate(72,7); // x=13キャラ目のx座標(dot単位)指定= (13-1)*6= 72 OLED_ROMstr("250Hz/div"); LATAbits.LATA4 = 0; // 緑LED点灯 while(1); } /* ///////////////////////////////////////// // 数値からASCII文字列に変換する関数 ///////////////////////////////////////// void ltostring(char digit, unsigned long data, char *buffer) { char i; buffer += digit; // 文字列の最後へ for(i=digit; i>0; i--) { // 最下位桁から上位へ buffer--; // ポインター1 *buffer = (data % 10) + '0'; // その桁数値を文字にして格納 data = data / 10; // 桁-1 } /// ブランキング処理 i = 0; // buffer++; while((i < digit-1)&&(*buffer == '0')) // 上位桁が0の間 { *buffer = ' '; // ブランクに変換 buffer++; i++; } } */