株式会社ジーテック

制御機器を小ロット多品種で設計製作

グラフィックLCD SG12864ASLB-GB-R01を試す

マイコンでテキスト文字以外のデータを表示したいときももちろんあります。しかしPIC16FマイコンでのグラフィックLCDの取り扱いは少々難がありメモリーを多く必要とします。サンプルのソースでは画面半分のデータを用意し、同じデータをもう半分にも表示させています。よって、実際には画面データを作りながら表示させたり、EEPROMに文字などのキャラクタを登録しておき、読み込みながら表示させるなどの工夫が必要です。

使用機器

使用機器は下記のとおり。他、パソコンや電源、PICKIT2も当然ながら必要です。

バックライト付グラフィック液晶表示器Sunlike Display Tech. Corp. SG12864Aマイコンボード(PIC16F1947搭載)ZEATEC co.,ltd. ZT-PIC16F194701(5V仕様)

プロジェクトファイルも含めたサンプル zt-pic16f194701_sg12864a.zip
開発環境:MPLAB_IDE_8_92 + CCS-C PCMコンパイラVer.4.132

ちょっと解説・・・

sg12864a_outの関数にデータと表示CS番号、データかコマンドかの識別番号を用意して実行すると事前に指定した場所に表示されます。場所の指定はページと列と行があり、ページは8までの数字、行や列は0~63までの数字を加算する事で任意の場所を指定することが出来ます。

//表示データ送信
void sg12864a_write(int *display_data){

    int tmp_cs = 1;
    int tmp_x = 0;
    long tmp_y = 0;

    for(tmp_cs=1;tmp_cs<3;tmp_cs++){
        for(tmp_y=0;tmp_y<8;tmp_y++){
            sg12864a_out((0xb8+tmp_y),tmp_cs,0);//Page set plus 0 to 7
            sg12864a_out(0x40,tmp_cs,0);//Start column 0. plus 0 to 63
            sg12864a_out(0xc0,tmp_cs,0);//Start line 0. plus 0 to 63
            for(tmp_x=0;tmp_x<8;tmp_x++){
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+1],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+2],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+3],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+4],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+5],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+6],tmp_cs,1);
                sg12864a_out(display_data[(tmp_x*8)+(tmp_y*64)+7],tmp_cs,1);
            }
        }
    }
}
「sg12864a.c」ファイルの一部 
//LCDを初期化
void sg12864a_ini(){

    //初期値
    output_bit(PIN_E4,0);// D/I Hで表示データ Lで制御コード
    output_bit(PIN_E5,1);// E 立下りでコードの読み込み
    output_bit(PIN_E6,1);// CS1 Hレベルで左半分を選択
    output_bit(PIN_E7,0);// CS2 Hレベルで右半分を選択
    sg12864a_out(0x3f,1,0);//Display1 on.
    sg12864a_out(0x3f,2,0);//Display2 on.

    delay_us(10);
}

//LCDへデータ・コマンド送信
void sg12864a_out(int data,int chip,int flag){

    if(flag == 0){
        //コマンドの場合
        output_bit(PIN_E4,0);
    }else{
        //データの場合
        output_bit(PIN_E4,1);
    }

    if(chip == 1){
        //CS1を有効
        output_bit(PIN_E6,1);
        output_bit(PIN_E7,0);
    }else{
        //CS2を有効
        output_bit(PIN_E6,0);
        output_bit(PIN_E7,1);
    }

    //データ出力
    output_f(data);

    //H→Lでデータ適用
    output_bit(PIN_E5,1);
    output_bit(PIN_E5,0);
    output_bit(PIN_E5,1);
    delay_us(1);
}

©ZEATEC co.,ltd.