/********************************************************************* * PIC32MX カラーグラフィックLCDテスト * プロジェクト名: ColorLCD_TEST_PCF8833 * 汎用ユニットで動作 * * デバッグ年月日: 2012/12/4 N.Ishii *********************************************************************/ #include /* PIC32 peripheral library */ #include "ColorLCD_Lib_PCF8833.h" #include "imagedata.h" // コンフィギュレーション設定 // 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 /* 3次元グラフ用定数宣言 */ #define X0 5 #define Y0 20 #define PI 3.141592654f #define NODES 20 #define SIDE 6 /* グローバル変数宣言 */ short i,j, k, l, SW, Num, Flag, temp; unsigned char ASCII; short Upper, Lower; char Line, Colum; /* Prototyping */ void D2Graph(short Hight); /******************************************** * 漢字メッセージ シフトJISコードデータ ********************************************/ const short Message[] ={ 0x82,0xB1,0x82,0xEA,0x82,0xCD,0x8A,0xBF,0x8E,0x9A, 0x82,0xC9,0x82,0xE6,0x82,0xE9,0x83,0x81,0x83,0x62, 0x83,0x5A,0x81,0x5B,0x83,0x57,0x82,0xCC,0x95,0x5C, 0x8E,0xA6,0x97,0xE1,0x82,0xC5,0x82,0xB7,0x81,0x42, 0x82,0x64,0x82,0x8E,0x82,0x87,0x82,0x8C,0x82,0x89, 0x82,0x93,0x82,0x88,0x82,0xCC,0x89,0x70,0x95,0xB6, 0x8E,0x9A,0x82,0xE2,0x82,0x4F,0x82,0x50,0x82,0x51, 0x82,0x52,0x82,0xCC,0x82,0xE6,0x82,0xA4,0x82,0xC8, 0x90,0x94,0x8E,0x9A,0x82,0xCC,0x8F,0xEA,0x8D,0x87, 0x82,0xC9,0x82,0xE0,0x82,0x51,0x83,0x6F,0x83,0x43, 0x83,0x67,0x83,0x52,0x81,0x5B,0x83,0x68,0x82,0xC5, 0x82,0xCC,0x95,0x5C,0x8E,0xA6,0x82,0xC6,0x82,0xC8, 0x82,0xE8,0x82,0xDC,0x82,0xB7,0x81,0x42,0x94,0xBC, 0x8A,0x70,0x89,0x70,0x8C,0xEA,0x82,0xCD,0x81,0x41, 0x8E,0x67,0x82,0xA6,0x82,0xDC,0x82,0xB9,0x82,0xF1, 0x82,0xB5,0x81,0x41,0x89,0xFC,0x8D,0x73,0x82,0xE0, 0x8E,0x67,0x82,0xA6,0x82,0xDC,0x82,0xB9,0x82,0xF1, 0x82,0xCC,0x82,0xC5,0x8E,0xA9,0x93,0xAE,0x89,0xFC, 0x8D,0x73,0x82,0xC6,0x82,0xB7,0x82,0xE9,0x82,0xA9, 0x81,0x41,0x8A,0x4A,0x8E,0x6E,0x88,0xCA,0x92,0x75, 0x82,0xF0,0x8E,0x77,0x92,0xE8,0x82,0xB5,0x82,0xC4, 0x95,0xCA,0x83,0x81,0x83,0x62,0x83,0x5A,0x81,0x5B, 0x83,0x57,0x82,0xC6,0x82,0xB5,0x82,0xC4,0x8E,0x77, 0x92,0xE8,0x82,0xB7,0x82,0xE9,0x95,0x4B,0x97,0x76, 0x82,0xAA,0x82,0xA0,0x82,0xE8,0x82,0xDC,0x82,0xB7, 0x81,0x42,0x81,0x40,0x81,0x40,0x81,0x40,0x81,0x40, 0x00,0x00,0x00,0x00}; /****************************************** * スイッチ状態変化割り込み処理 *******************************************/ void __ISR(7, ipl2) INT1Handler(void){ SW++; // SW1 テスト順次アップ if(SW > 8) SW = 0; delay_ms(50); // チャッタ回避 mINT1ClearIntFlag(); // 割り込みフラグクリア } void __ISR(11, ipl2) INT2Handler(void){ SW = 2; // SW2 漢字表示テストへ delay_ms(50); mINT2ClearIntFlag(); // 割り込みフラグクリア } void __ISR(15, ipl2) INT3Handler(void){ SW = 5; // SW3 直線描画へ delay_ms(50); mINT3ClearIntFlag(); // 割り込みフラグクリア } void __ISR(19, ipl2) INT4Handler(void){ SW = 6; // SW4 曲線描画へ delay_ms(50); mINT4ClearIntFlag(); // 割り込みフラグクリア } /******* メインルーチン ***********/ int main(void) { //システム最適設定 SYSTEMConfigPerformance(80000000); mJTAGPortEnable(DEBUG_JTAGPORT_OFF); // JTAGを無効化 //I/O設定 AD1PCFG = 0xFFFE; // デジタルに // LCD_SPI信号のイニシャル・レベル設定: 121126追加 LCD_CS = 1; LCD_SCK = 1; LCD_DIO = 1; LCD_RESET = 0; TRISD = 0xFF07; // LCD,SW TRISE = 0x0000; // LED LATE = 0; // 液晶表示器の初期化と開始メッセージ表示 lcd_Init(); lcd_Clear(BLACK); /* /// デバッグ用: 背景色変化の単純繰返しテスト 121125------------------- while(1) { LATE = 0; LATEbits.LATE7 = 1; lcd_Clear(BLACK); delay_ms(1000); LATEbits.LATE6 = 1; lcd_Clear(WHITE); delay_ms(1000); LATEbits.LATE5 = 1; lcd_Clear(RED); // lcd_Clear(BLUE); delay_ms(1000); LATEbits.LATE4 = 1; lcd_Clear(GREEN); delay_ms(1000); } ///------------------------------------------------------------ */ // 漢字コード初期値 2バイトコード Upper = 0x81; Lower = 0x40; SW = 0; //外部割込み許可 ConfigINT1(EXT_INT_ENABLE | RISING_EDGE_INT | EXT_INT_PRI_2); ConfigINT2(EXT_INT_ENABLE | RISING_EDGE_INT | EXT_INT_PRI_2); ConfigINT3(EXT_INT_ENABLE | RISING_EDGE_INT | EXT_INT_PRI_2); ConfigINT4(EXT_INT_ENABLE | RISING_EDGE_INT | EXT_INT_PRI_2); mINT1ClearIntFlag(); mINT2ClearIntFlag(); mINT3ClearIntFlag(); mINT4ClearIntFlag(); //マルチベクタ割り込み設定、割り込み許可 INTEnableSystemMultiVectoredInt(); /// メイン ループ while(1){ LATDbits.LATD0 ^= 1; /* スイッチの値により各処理へ分岐 */ switch(SW){ /****** ANK文字表示 *********/ case 0: // 文字表示テスト lcd_Clear(WHITE); // クリア for(j=0; j<12; j++){ // ASCII文字全表示 16文字/行 for(i=0; i<16; i++){ ASCII = j*16+i+0x20; // 192文字で繰り返し lcd_Char(j, i, ASCII, RED, WHITE); // 文字表示制御 } } for(j=12; j<16; j++){ // ASCII文字全表示 16文字/行 for(i=0; i<16; i++){ ASCII = (j-12)*16+i+0x20; // 192文字で繰り返し lcd_Char(j, i, ASCII, BLUE, WHITE); // 文字表示制御 } } delay_ms(1500); // 1.5秒待ち break; /******** 文字列表示テスト *******/ case 1: // 文字列の表示テスト lcd_Clear(BLACK); delay_ms(100); lcd_Str(0, 0, "Hello World!!", RED, BLACK); lcd_Str(2, 0, "Graphic LCD Test", GREEN, BLACK); lcd_Str(4, 0, "This is Yellow. ", YELLOW, BLACK); lcd_Str(6, 0, "This is Cyan. ", CYAN, BLACK); lcd_Str(8, 0, "This is Magenta.", MAGENTA, BLACK); lcd_Str(10, 0, "This is Blue and over 16 character case.", BLUE, BLACK); lcd_Str(15, 0, "This is WHITE.", WHITE, BLACK); delay_ms(1500); break; /***** 漢字表示 *****/ case 2: // 漢字表示 lcd_Clear(WHITE); for(Line=0; Line<10; Line++){ // 10行 for(Colum=0; Colum<10; Colum++){ // 10文字/行 KanjiCode(Line, Colum, Upper, Lower, BLACK, WHITE); // 漢字コードアップ Lower++; if(Lower > 0xFC){ Upper++; Lower = 0x40; if(Upper > 0x9F) Upper = 0x81; } } } delay_ms(1000); break; /***** 漢字メッセージ表示 ********/ case 3: lcd_Clear(BLACK); Kanji_Str(0, 0, Message, WHITE, BLACK); delay_ms(1500); break; /***** ピクセル描画テスト(斜め直線) *********/ case 4: /* ピクセル表示機能 */ lcd_Clear(BLACK); // 全クリア for(i=0; i<132; i++){ // 斜め直線の表示 lcd_Pixel(i,131-i,RED); // CS1側 } delay_ms(2000); // 2秒待ち lcd_Clear(WHITE); // 全部黒 for(i=0; i<132; i++){ // 斜め直線表示 lcd_Pixel(i, 131-i, BLUE); } delay_ms(1500); // 1.5秒待ち break; /************ 直線ボックス表示 **************/ case 5: // 直線描画テスト lcd_Clear(WHITE); i = 0; for(j=2; j<66; j+=4){ // ボックス表示 if(Flag){ Flag = 0; lcd_Line(j,j, 131-j, j, RED); // 次第に小さなボックスへ lcd_Line(j,j, j, 131-j, RED); lcd_Line(131-j,131-j, 131-j,j, RED); lcd_Line(131-j,131-j, j,131-j, RED); } else{ Flag = 1; lcd_Line(j,j, 131-j, j, BLUE); // 次第に小さなボックスへ lcd_Line(j,j, j, 131 -j, BLUE); lcd_Line(131-j,131-j, 131-j,j, BLUE); lcd_Line(131-j,131-j, j,131-j, BLUE); } delay_ms(300); } delay_ms(2000); break; /**************** 曲線描画(2次元グラフ表示)****************/ case 6: // 曲線描画 lcd_Clear(WHITE); delay_ms(100); lcd_Str(0, 0, "Graphic Display", BLUE, WHITE); if(i>10) i=0; D2Graph(20*i++); //曲面グラフ表示 delay_ms(1000); break; /******* イメージグラフィック表示 ********/ case 7: // イメージの表示テスト //lcd_Clear(WHITE); lcd_Clear(BLACK); /* lcd_Image(0, Header1, GREEN, WHITE); lcd_Image(8, Header2, BLUE, WHITE); */ lcd_Image(0, Header2, WHITE, BLACK); lcd_Image(8, My_PIC_Scope, GREEN, BLACK); delay_ms(2000); lcd_Scroll(50); delay_ms(2000); break; /******** 全画面クリア(各色クリア) ***********/ case 8: // 全画面クリアのテスト lcd_Clear(WHITE); // 各色の表示 delay_ms(500); lcd_Clear(RED); delay_ms(500); lcd_Clear(GREEN); delay_ms(500); lcd_Clear(BLUE); delay_ms(500); lcd_Clear(CYAN); delay_ms(500); lcd_Clear(MAGENTA); delay_ms(500); lcd_Clear(YELLOW); delay_ms(500); lcd_Clear(BROWN); delay_ms(500); lcd_Clear(ORANGE); delay_ms(500); lcd_Clear(PINK); delay_ms(500); lcd_Clear(BLACK); delay_ms(1000); break; /**** default **********/ default: delay_ms(300); break; } } } /********************************************* * 2次元立体グラフ描画関数 * z(x,y) = 1/(1+SQRT(x2+y2))*COS(SQRT(x2+y2)) * (-3*PI< x,y < 3*PIの範囲) * zの最大値をPOTで変更する **********************************************/ void D2Graph(short Hight) { short i, j, px, py,x, y, z; float zf, xf, yf, sf; struct{ short x; short y; } edge[NODES], prev; lcd_Line(X0, 3, X0, 120 ,GREEN); // z axis lcd_Line(X0-3, Y0, 131, Y0, GREEN); // x axis lcd_Line(X0, Y0-2, X0+66, Y0+66, GREEN); // y axis for(j=0; j