JavaScript が無効です。有効にしてください。
ななよんのホームページ
トップ > 電子工作 > 各種 IC の使い方 > グラフィック液晶 SG12864ASLB の使い方

グラフィック液晶 SG12864ASLB の使い方

最終更新日さいしゅうこうしんび:2023-08-10
表示例

 SG12864 は、128 x 64 ドットのグラフィック液晶モジュールです。2022 年 4 月現在、秋月電子通商で 1600 円です。バックライト付きで(360 mA とかなりの電流食いなので今回は使用しません)、画面が大きく見やすいのが特徴です。搭載コントローラは、SBN6400 および SBN0064 です。今回はそんな SG12864 の制御方法および表示データの作成方法を解説したいと思います。

ピン配置

 正面から見て、端子を下にしたとき、右側が 1 番ピンで、左端が 20 番ピンです。

ピン配置
# 名前 方向 説明
1 VSS 電源 GND
2 VDD 電源 5 V
3 VO - コントラスト調整。GND-VOUT 間に半固定抵抗を接続し、中間ピンを VO に入力する。
4 D/I 入力 データ、インストラクションコードの選択。
5 R/W 入力 読み出し・書き込みの選択。読み出さない場合、LOW に固定すればピン数を 1 本減らせる。
6 E 入力 イネーブル信号。立下りエッジでデータが取り込まれる。
7 DB0 入出力 データバス
8 DB1 入出力
9 DB2 入出力
10 DB3 入出力
11 DB4 入出力
12 DB5 入出力
13 DB6 入出力
14 DB7 入出力
15 CS1 入力 左半分を選択する。
16 CS2 入力 右半分を選択する。
17 /RES 入力 リセット入力。アクティブロー。
18 VOUT - コントラスト調整用の電圧出力。
19 A LED バックライト LED のアノード。
20 K LED バックライト LED のカソード。

 マイコンと通信する場合、R/W を固定する場合 D/I、E、8 本のデータバス、2 本の CS、リセットで計 13 本の信号線が必要です(リセットは外部回路で信号を作れば減らせると思います)。

制御方法

アドレス

アドレス(1) アドレス(2)

 縦方向は 8 ドットを 1 ページとし、8 ページあります(0 から 7)。横方向(column)は、64 ドット分で 0 から 63 まであります。左半分と右半分は、CS1 と CS2 で切り替えます。

 1 ページは縦 8 ドットなので、これが 1 バイトとなります。つまり、LCD に送るデータは、ページ単位での縦 8 ビット、ということです。

コマンド

 コマンドを示します。E 信号の立ち下りでデータが取り込まれます。

D/I R/W D7 to D0 説明
0 0 0011111X(0x3e + ON/OFF) ディスプレイオンオフ
X=1: ON、X=0: OFF
0 0 11XXXXXX(0xc0 + display start line) Display Start Line
0 0 10111XXX(0xb8 + page) ページを指定する(縦)。
XXX にはページが入る。
0 0 01XXXXXX(0x40 + address) アドレスを指定する(横)。
XXXXXX にはアドレスが入る。
0 1 B0XR0000 ステータスを読み出す。
B=1: busy, 0: ready
X=1: ディスプレイ OFF, 0: ディスプレイ ON
R=1: リセット, 0: ノーマル
1 0 data データを書き込む。
1 1 data データを読み出す。

初期化例

  1. リセット信号を L にする。
  2. 待つ。
  3. リセット信号を H にする。
  4. CS1 を選択してディスプレイオン(0x3f)
  5. CS1 を選択してスタートライン 0(0xc0)
  6. CS2 を選択してディスプレイオン(0x3f)
  7. CS2 を選択してスタートライン 0(0xc0)
  8. 描画。


バックライト LED

 バックライト LED を使用する場合。バックライト LED は順方向電流 360 mA、順方向電圧 4.1 V(最大 4.6 V)です。電流制限抵抗は内蔵されていないので、外部で接続する必要があります。5 V の場合、2.6 Ω、0.325 W 以上の抵抗が必要です。E24 系列だと 2.7 Ω があります。ワット数は、1/2 W 以上必要でしょう。2.7 Ω 1/2 W の抵抗はサトー電気で購入できます。

表示データの作成

 表示データの作成には、LCD Assistant を使用するのが楽です。ペイントソフト等で 2 値の BMP ファイルを作り(私は PictBear を使用しました)、それを読み込ませれば配列を出力してくれます。LCD Assistant の使い方を解説します。

画面の作成

 PictBear で、画面を作りました。白黒の .bmp 形式で保存します。LCD Assistant を起動し、「File」→「Load image」で作成した .bmp を読み込みます。「Table name」で配列の名前を決め、「File」→「Save output」で配列が格納されたファイルを出力できます。.txt 形式で保存しましょう。

LCD Assistant の画面

 保存した .txt ファイルを開くと、配列があるはずなので、それを PIC なり Arduino なりのソースファイルにはっつけます。これで表示データが用意できました。

PIC マイコンで制御する。

 PIC16F1827 を使い、SG12864 を制御してみます。設定は MCC で行います。出力ピンを以下のスクリーンショットのように設定してください。

MCC の設定

ソースコード全体

#include "mcc_generated_files/mcc.h"

const unsigned char data [] = {
	// LCDAssistant で作成した表示データ
};


void out(uint8_t data, bool chip, bool di) {
    if(chip) {
        CS1_SetLow();
        CS2_SetHigh();
    } else {
        CS1_SetHigh();
        CS2_SetLow();
    }
    
    if(di) {
        DI_SetHigh();
    } else {
        DI_SetLow();
    }
    
    LATB = data;
    E_SetLow();
    __delay_us(1);
    E_SetHigh();
    __delay_us(1);
    
    DI_SetLow();
}

void main(void)
{
    SYSTEM_Initialize();

    LATA = 0;
    LATB = 0;
    
    __delay_ms(10);
    RST_SetHigh();
    E_SetHigh();
    
    out(0x3f, 0, 0);
    out(0x3f, 1, 0);
    out(0xc0, 0, 0);
    out(0xc0, 1, 0);
    
    for(int i=0; i<8; i++) {
        // page address set
        out(0b10111000+i, 0, 0);
        for(int j=0; j<64; j++) {
            out(0b01000000+j, 0, 0);        
            out(data[128*i+j], 0, 1);
        }
    }
    for(int i=0; i<8; i++) {
        // page address set
        out(0b10111000+i, 1, 0);
        for(int j=0; j<64; j++) {
            out(0b01000000+j, 1, 0);        
            out(data[128*i+j+64], 1, 1);
        }
    }

    while (1)
    {
    }
}

 MCC の設定を generate 後、このソースコードを PIC16F1827 に書き込み、MCC で設定した通りにピンを配線すると、作成した表示データが表示されるはずです。

Arduino で制御する。

 Arduino UNO で SG12864 を制御してみます。今回はライブラリは使用しません。ピンの配線は、#define を参照してください。

#define DI  2
#define E   3
#define DB0 4
#define DB1 5
#define DB2 6
#define DB3 7
#define DB4 8
#define DB5 9
#define DB6 10
#define DB7 11
#define CS1 12
#define CS2 13
#define RST 14

const unsigned char data [] = {
	// LCDAssistant で作成した表示データ
};

void sendDatatoLCD(uint8_t data, bool cs, bool di) {
  if(cs == 0) {
    digitalWrite(CS1, HIGH);
    digitalWrite(CS2, LOW);
  } else {
    digitalWrite(CS1, LOW);
    digitalWrite(CS2, HIGH);
  }

  if(di) {
    digitalWrite(DI, HIGH);
  } else {
    digitalWrite(DI, LOW);
  }
  
  if(data & 0b00000001) digitalWrite(DB0, HIGH);
  else digitalWrite(DB0, LOW);
  if(data & 0b00000010) digitalWrite(DB1, HIGH);
  else digitalWrite(DB1, LOW);
  if(data & 0b00000100) digitalWrite(DB2, HIGH);
  else digitalWrite(DB2, LOW);
  if(data & 0b00001000) digitalWrite(DB3, HIGH);
  else digitalWrite(DB3, LOW);
  if(data & 0b00010000) digitalWrite(DB4, HIGH);
  else digitalWrite(DB4, LOW);
  if(data & 0b00100000) digitalWrite(DB5, HIGH);
  else digitalWrite(DB5, LOW);
  if(data & 0b01000000) digitalWrite(DB6, HIGH);
  else digitalWrite(DB6, LOW);
  if(data & 0b10000000) digitalWrite(DB7, HIGH);
  else digitalWrite(DB7, LOW);

  digitalWrite(E, LOW);
  digitalWrite(E, HIGH);
}

void setup() {
  pinMode(DI, OUTPUT);
  pinMode(E, OUTPUT);
  pinMode(DB0, OUTPUT);
  pinMode(DB1, OUTPUT);
  pinMode(DB2, OUTPUT);
  pinMode(DB3, OUTPUT);
  pinMode(DB4, OUTPUT);
  pinMode(DB5, OUTPUT);
  pinMode(DB6, OUTPUT);
  pinMode(DB7, OUTPUT);
  pinMode(CS1, OUTPUT);
  pinMode(CS2, OUTPUT);
  pinMode(RST, OUTPUT);

  digitalWrite(E, HIGH);

  digitalWrite(RST, LOW);
  delay(10);
  digitalWrite(RST, HIGH);

  sendDatatoLCD(0x3f, 0, 0);
  sendDatatoLCD(0x3f, 1, 0);
  sendDatatoLCD(0xc0, 0, 0);
  sendDatatoLCD(0xc0, 1, 0);
    
    
  for(int i=0; i<8; i++) {
      // page address set
      sendDatatoLCD(0b10111000+i, 0, 0);
      for(int j=0; j<64; j++) {
          sendDatatoLCD(0b01000000+j, 0, 0);        
          sendDatatoLCD(pgm_read_byte(&data[128*i+j]), 0, 1);
      }
  }
  for(int i=0; i<8; i++) {
      // page address set
      sendDatatoLCD(0b10111000+i, 1, 0);
      for(int j=0; j<64; j++) {
          sendDatatoLCD(0b01000000+j, 1, 0);        
          sendDatatoLCD(pgm_read_byte(&data[128*i+j+64]), 1, 1);
      }
  }
}

void loop() {
}

参考文献

  • SG12864ASLB-GB-G データシート

戻る

右メニュー

【表示がおかしい・崩れる場合】PC では Shift と F5 を同時押し。スマホではキャッシュを削除してみてください。



とうサイトでは Cookieくっきー使用しようします。くわしくは上記じょうきの「プライバシーポリシー・免責事項等めんせきじこうとう」もご確認かくにんください。



上へ戻る