SHARP_MEMORYLCD_UTIL  001
SHARPメモリ液晶直接駆動用ライブラリ
SHARP_MEMORYLCD_UTIL 詳解

シャープ製メモリ液晶直接駆動用ライブラリ

秋月電子通商などで販売されている、シャープ製メモリ液晶を直接駆動させるためのライブラリです。
「みんなのラボ」から販売されている、SRAMを介すもの(メモリ液晶ブレークアウト基板)では動作しません。

2015年時点で販売されている、同じ駆動方式のLCD一覧:(このライブラリで駆動可能)

(LS012B7DD01, LS013B7DH06は駆動方式が異なるため使用できません)

図形や文字列を比較的簡単に表示させることが可能です。
また、メモリに余裕があれば日本語(全角文字)も描画可能です。

文字描画のアルゴリズムは、こちらのページで公開されていた
日本語ビットマップフォント表示アルゴリズムを改変して使用しています。
松浦光洋様、素晴らしいアルゴリズムを公開していただきありがとうございます。
現在ソースコードの公開は停止されている模様です。


配線方法

端子一覧

端子一覧画像
液晶を表示面側から見たとき、右側の端子が1番、左側の端子が10番になります。
データシートには逆っぽく書いてますが、実際コレで大丈夫です。

簡単な結線

一番簡単な結線は、vSCK, vSI, vCSと電源+とGNDの5本線を結線する方法です。

簡単結線画像
もし、プログラム側で

MLCD_MONO mlcd(7, 6, 5);
としたなら、1番端子(SCLK)とGRボードの7番ピンを接続、2番端子(SI)と6番ピンを接続、3番端子(SCS)と5番ピンを結線し、
図の5,6,7(DISP,VDDA,VDD)の端子を全部ショート(つなげて)させて、電源+(+3.3V)に接続
8,9,10の端子を全部ショート(つなげて)させて、GNDに接続。

外部信号を使う場合の結線

外部信号を使う結線は下記画像の通りです。
外部信号を使っても使わなくても表示機能自体に変化はありません。
dispOFF関数とかが使えるか使えないかの差です。

簡単結線画像
プログラム側で

MLCD_MONO mlcd(7, 6, 5, 4, 3);
としたなら、1番端子(SCLK)とGRボードの7番ピンを接続、2番端子(SI)と6番ピンを接続、3番端子(SCS)と5番ピンを結線し、
4番端子(EXTCOMIN)と4番ピンを接続、5番端子(DISP)と3番ピンを接続、
6,7,8をの端子を全部ショート(つなげて)させて、電源+(+3.3V)に接続
9,10の端子を全部ショート(つなげて)させて、GNDに接続。

外部から液晶の表示を付けたり消したりしたいなら、外部信号結線を使ってください。
それ以外なら簡単結線で問題ありません。


使用準備

このライブラリはSPIポートを占拠しません。
digitalWriteができるピンであればどれでも使用可能です。

前述の一番簡単な結線をした場合、以下のような宣言でMLCD_MONOクラスの使用準備(インスタンス化)ができます。

MLCD_MONO mlcd(7, 6, 5); //mlcdの名前は自由、ピン番号は各自環境に合わせて変更

実際にプログラムとして書いてみると、

#include 
#include 
#include "SH_MEMORYLCD.h"

//COM反転処理間隔(ミリ秒)
#define TIMER_VAL_MS 200

//インスタンス化
MLCD_MONO mlcd(7, 6, 5);

//COM反転処理
void invCOM(){
    mlcd.invertCOM();
}

//セットアップ:最初の1回だけ実行される
void setup(){
    pinMode(PIN_LED1,OUTPUT); //LED1
    pinMode(PIN_LED2,OUTPUT); //LED2
    pinMode(PIN_LED3,OUTPUT); //LED3

    pinMode(PIN_SW,INPUT); //押しボタン(青)

    digitalWrite(PIN_LED1, HIGH); //LED1点灯
    digitalWrite(PIN_LED2, HIGH); //LED2点灯
    digitalWrite(PIN_LED3, HIGH); //LED3点灯

    while(digitalRead(PIN_SW) == 1); //押しボタン(青)が押されるまで待ち続ける
    digitalWrite(PIN_LED2, LOW); //LED2消灯
    
    //MsTimer2にinvCOMを登録してタイマー開始
    MsTimer2::set(TIMER_VAL_MS, invCOM);
    MsTimer2::start();

    mlcd.init(); //液晶初期化
}

//ループ:繰り返し実行されるのでexit(1)で1回だけ実行しておわる
void loop(){
    mlcd.pixel(5, 5); //←座標(5, 5)に点を打つ
    
    //~~のこりの描画処理など~~
    
    exit(1);
}
このようになります。


図形描画関数について

MLCD_MONOクラスは、さまざまなグラフィック描画関数を備えています。


引数:modeについて

いずれの関数も引数の中にmodeというものが存在します。
modeには、描画モードを指定します。


引数:immidiateについて

いずれの関数も引数の中にimmidiateというものが存在します。
immidiateには、即時描画を行うかどうかをtruefalseで指定します。

例えばpixel関数で1個打点したあと、immidiatetrueであればすぐに液晶に反映されます。
immidiatefalseの場合、内部画素記憶配列のみを更新し、液晶には反映しません。

1行だけの反映であれば大した時間はかかりませんが、反映する行が増えれば増えるほど
処理の時間がかかってしまいますので、書きたい情報を全部内部画素記憶配列に書き込んでから
一気にドバっと反映するほうが効率的で処理時間の短縮が見込めます。

なので、文字や四角形や格子模様などを複数行広範囲にわたって書き込む場合はimmidiatefalseにして
すべての描画処理が完了したあとにwriteArrayN関数やwriteArrayA関数を使用して
ドバっと更新するほうがお得です。

ちなみに、各関数のimmidiateのデフォルト値はtrueです。
引数を省略した場合は即時描画されてしまいますのでご注意ください。


COM反転信号について

COM反転は、液晶の寿命を延ばすために(焼き付き防止?)人間に見えない速度で液晶を明滅させる仕組みです。
COM反転信号はCOM反転を行うタイミングを液晶に伝達するもので、外部信号と内部信号の2種類があります。
このライブラリでは呼ばれたコンストラクタによって処理を変えており、
引数が3つのコンストラクタで呼ばれたらCOM反転は内部信号を使用します。
引数が5つのコンストラクタで呼ばれたらCOM反転は外部信号を使用します。

引数が3つのコンストラクタを呼ぶ場合は、EXTCOMの端子VSS(GND)に接続し
引数が5つのコンストラクタを呼ぶ場合は、EXTCOMの端子VDD(3.3-5V)に接続してください。
COM反転信号はMsTimer2などを使用して、周期的にinvertCOM()関数を呼んでください。


ボード本体に搭載されているメモリ(RAM)のサイズをご確認ください

このライブラリでは、ライブラリを通して描かれた全画素の情報ををchar型の一次元配列として記憶します。
故に、小さなRAMしか搭載していないものではOutOfMemoryになり、うまく動作しません

内部画素記憶配列のサイズは、((表示幅[px] / 8) * 表示高さ[px])[byte]です。
表示幅400px、表示高さ240pxの場合は 12Kbyte(12,000byte) の領域を要します。
表示幅128px、表示高さ128pxの場合は 2Kbyte(2,048byte)

文字列を扱う場合はさらにメモリ使用量が増えるので、表示幅400px、表示高さ240pxで使用する場合は
参考値として16KB以上のメモリ(RAM)を搭載した製品でお使いください


動画(youtube)