first commit

Dependencies:   LCD192GC00 mbed

main.cpp

Committer:
og
Date:
2016-09-30
Revision:
0:3ab6473fa4f7

File content as of revision 0:3ab6473fa4f7:

/**
    reference:
    http://www.picfun.com/PIC24F/AP/app24F15.html

    NNUCLEO_F103RB  処理速度が遅い
    NNUCLEO_F446RE  Ok
    ARCH_PRO        Ok
    LPC1768 + Mbed Shield   電源の問題あり
**/

#include "mbed.h"
#include "LCD192GC00.h"
#include "imagedata.h"


#if defined(TARGET_ARCH_PRO)
LCD192GC00 tft(A0, A1, A2, A3, A4, D2, D3, D4, D5, D6, D7, D8, D9);
Serial pc(USBTX, USBRX);
//SDFileSystem sd(D11, D12, D13, D10, "sd"); // mosi miso sclk cs
#elif defined(TARGET_LPC1768)
LCD192GC00 tft(p15, p16, p17, p18, p19, p8, p26, p25, p24, p23, p10, p9, p22);
Serial pc(USBTX, USBRX);
//SDFileSystem sd(p5, p6, p7, p21, "sd"); // mosi miso sclk cs
#elif defined TARGET_NUCLEO_F446RE
/* D0, D1 short SB62,SB63*/
LCD192GC00 tft(A0, A1, A2, A3, A4, D2, D3, D4, D5, D6, D7, D8, D9);
Serial pc(USBTX, USBRX);
//SDFileSystem sd(D11, D12, D13, D10, "sd"); // mosi miso sclk cs

#elif defined TARGET_NUCLEO_F103RB
LCD192GC00 tft(A0, A1, A2, A3, A4, D2, D3, D4, D5, D6, D7, D8, D9);
Serial pc(USBTX, USBRX);
//SDFileSystem sd(D11, D12, D13, D10, "sd"); // mosi miso sclk cs
#endif

int16_t i, j, SW, Flag, Size, XOffset, YOffset;
uint8_t ASCII;
/* Prototyping  */
void D2Graph(short Hight);

int main() {
    tft.lcd_Init();
    tft.lcd_Clear(BLACK);
    SW=6;
    while(1) {
        SW++;
        if(SW==7)
            SW = 0;
        /* スイッチの値により各処理へ分岐 */
        switch(SW){
            /****** ANK文字表示 *********/
            case 0:                                         // 文字表示テスト              
                tft.lcd_Clear(BLACK);                               // クリア
                for(j=0; j<4; j++){                         // ASCII文字全表示 XChar文字/行
                    for(i=0; i<XChar; i++){
                        ASCII = j*XChar+i+0x20;             // XChar文字で繰り返し
                        tft.lcd_Char(i, j, ASCII, WHITE, BLACK);    // 文字表示制御
                    }
                }
                for(j=4; j<8; j++){                         // ASCII文字全表示 XChar文字/行
                    for(i=0; i<XChar; i++){
                        ASCII = j*XChar+i+0x20;             // XChar文字で繰り返し
                        tft.lcd_Char(i, j, ASCII, GREEN, BLACK);    // 文字表示制御
                    }
                }
                for(j=8; j<12; j++){                            // ASCII文字全表示 Xchar文字/行
                    for(i=0; i<XChar; i++){
                        ASCII = j*XChar+i+0x20;             // XChar文字で繰り返し
                        tft.lcd_Char(i, j, ASCII, RED, BLACK);      // 文字表示制御
                    }
                }
                for(j=12; j<YLine; j++){                        // ASCII文字全表示 XChar文字/行
                    for(i=0; i<XChar; i++){
                        ASCII = j*XChar+i+0x20;             // XChar文字で繰り返し
                        tft.lcd_Char(i, j, ASCII, YELLOW, BLACK);   // 文字表示制御
                    }
                }
                wait_ms(3000);                             // 1.5秒待ち
                break;
            /******** 文字列表示テスト *******/
            case 1:                                         // 文字列の表示テスト
                tft.lcd_Clear(BLACK);
                wait_ms(100);              
                tft.lcd_Str(0, 0, "Hello World!!", RED, BLACK);
                tft.lcd_Str(0, 2, "Graphic LCD Test", GREEN, BLACK);
                tft.lcd_Str(0, 4, "This is Yellow. ", YELLOW, BLACK);
                tft.lcd_Str(0, 6, "This is Cyan.   ", CYAN, BLACK);
                tft.lcd_Str(0, 8, "This is Magenta.", MAGENTA, BLACK);
                tft.lcd_Str(0, 10, "This is Blue and over 30 character case.", BLUE, BLACK); 
                tft.lcd_Str(0, 12, "This is WHITE.", WHITE, BLACK);
                tft.lcd_Str(0, 14, "This is PINK.", PINK, BLACK);
                tft.lcd_Str(0, YLine-1, "This is ORANGE.", ORANGE, BLACK);
                wait_ms(3000);
                break;
            /***** 直線描画テスト(斜め直線) *********/         
            case 2:                                         /* ピクセル表示機能 */                          
                tft.lcd_Clear(BLACK);                               // 全クリア
                for(i=0; i<=ENDPAGE; i++){                      // 斜め直線の表示
                    tft.lcd_Pixel(i*1.33,i,RED);                    // CS1側
                }
                wait_ms(2000);                             // 2秒待ち
                tft.lcd_Clear(WHITE);                               // 全部白
                for(i=0; i<=ENDCOL; i++){                       // 斜め直線表示
                    tft.lcd_Pixel(i*1.33, i, BLUE);
                }
                wait_ms(1500);                             // 1.5秒待ち
                break;
            /************ 直線ボックス表示 **************/
            case 3:                                         // 直線描画テスト
                tft.lcd_Clear(BLACK);
                if(ENDPAGE < ENDCOL){
                    Size = ENDPAGE;
                    XOffset = (ENDCOL - ENDPAGE) / 2;
                    YOffset = 0;
                }
                else{
                    Size = ENDCOL;
                    XOffset = 0;
                    YOffset = (ENDPAGE - ENDCOL) / 2;
                }       
                for(j=0; j<Size/2; j+=4){                       // ボックス表示
                    if(Flag){
                        Flag = 0;
                        // 次第に小さなボックスへ
                        tft.lcd_Line(j+XOffset,j+YOffset, Size-j+XOffset, j+YOffset, RED);
                        tft.lcd_Line(j+XOffset,j+YOffset, j+XOffset, Size-j+YOffset, GREEN);
                        tft.lcd_Line(Size-j+XOffset,Size-j+YOffset, Size-j+XOffset,j+YOffset, RED);
                        tft.lcd_Line(Size-j+XOffset,Size-j+YOffset, j+XOffset,Size-j+YOffset, GREEN);
                    }
                    else{
                        Flag = 1;
                        // 次第に小さなボックスへ
                        tft.lcd_Line(j+XOffset,j+YOffset, Size-j+XOffset, j+YOffset, YELLOW);
                        tft.lcd_Line(j+XOffset,j+YOffset, j+XOffset, Size-j+YOffset, BLUE);
                        tft.lcd_Line(Size-j+XOffset,Size-j+YOffset, Size-j+XOffset,j+YOffset, YELLOW);
                        tft.lcd_Line(Size-j+XOffset,Size-j+YOffset, j+XOffset,Size-j+YOffset, BLUE);
                    }
                }
                wait_ms(3000);
                break;
            /**************** 曲線描画(2次元グラフ表示)****************/
            case 4:
                for(i=0; i<8; i++){                     // 曲線描画
                    tft.lcd_Clear(BLACK);                           
                    tft.lcd_Str(0, 0, "Graphic Display", BLUE, BLACK);
                    D2Graph(20*i);                      //曲面グラフ表示
                    wait_ms(2000);
                }
                break;
            /******* イメージグラフィック表示 ********/
            case 5:                                     // イメージの表示テスト
                tft.lcd_Clear(BLACK);
                tft.lcd_Image(0, Header1, MAGENTA, BLACK);
                tft.lcd_Image(8, Header2, CYAN, BLACK);
                wait_ms(3000);
                break;
            /******** 全画面クリア(各色クリア) ***********/
            case 6:                                     // 全画面クリアのテスト   
                tft.lcd_Clear(WHITE);                           // 各色の表示
                wait_ms(1500);
                tft.lcd_Clear(RED);
                wait_ms(500);
                tft.lcd_Clear(GREEN);
                wait_ms(500);
                tft.lcd_Clear(BLUE);
                wait_ms(500);
                tft.lcd_Clear(CYAN);
                wait_ms(500);
                tft.lcd_Clear(MAGENTA);
                wait_ms(500);
                tft.lcd_Clear(YELLOW);
                wait_ms(500);
                tft.lcd_Clear(BROWN);
                wait_ms(500);
                tft.lcd_Clear(ORANGE);
                wait_ms(500);
                tft.lcd_Clear(PINK);
                wait_ms(500);
                tft.lcd_Clear(BLACK);
                wait_ms(1000);
                break;
            /**** default **********/       
            default: wait_ms(300);
                 break;
        }

    }
}

/*********************************************
*  2次元立体グラフ描画関数
*   z(x,y) = 1/(1+SQRT(x2+y2))*COS(SQRT(x2+y2))
*    (-3*PI< x,y < 3*PIの範囲)
*   zの最大値をPOTで変更する
**********************************************/
/* グローバル定数 */
#define X0  5
#define Y0  20
#define PI  3.141592654f
#define NODES   38
#define SIDE    6
// 描画関数
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;

    tft.lcd_Line(X0, 3, X0, ENDPAGE-12 ,GREEN);             // z axis
    tft.lcd_Line(X0-3, Y0, ENDCOL, Y0, GREEN);              // x axis
    tft.lcd_Line(X0, Y0-2, X0+140, Y0+140, GREEN);          // y axis
    for(j=0; j<NODES; j++) {
        edge[j].x = X0 + j*SIDE/2;
        edge[j].y = Y0 + j*SIDE/2;
    }
    for(i=0; i<NODES; i++) {
        x = i *SIDE;
        xf = (6 * PI / 200) *(float)(x-100);
        prev.y = Y0;
        prev.x = X0 + x;
        for(j=0; j<NODES; j++) {
            y = j * SIDE;
            yf = (6 * PI /200) * (float)(y -100);
            sf = sqrt(xf * xf + yf * yf);
            zf = 1/(1+sf) * cos(sf);
            z = zf * Hight;
            px = X0 + x + y/2;
            py = Y0 + z + y/2;
            tft.lcd_Pixel(px, ENDPAGE-5-py, 1);
            tft.lcd_Line(px, py, prev.x, prev.y, RED);
            tft.lcd_Line(px, py, edge[j].x, edge[j].y, RED);
            prev.x = px;
            prev.y = py;
            edge[j].x = px;
            edge[j].y = py;
        }
    }
}