SHARP_MEMORYLCD_UTIL
001
SHARPメモリ液晶直接駆動用ライブラリ
|
秋月電子通商などで販売されている、シャープ製メモリ液晶を直接駆動させるためのライブラリです。
「みんなのラボ」から販売されている、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番ピンを結線し、
外部信号を使う結線は下記画像の通りです。
外部信号を使っても使わなくても表示機能自体に変化はありません。
dispOFF関数とかが使えるか使えないかの差です。
MLCD_MONO mlcd(7, 6, 5, 4, 3);としたなら、1番端子(SCLK)とGRボードの7番ピンを接続、2番端子(SI)と6番ピンを接続、3番端子(SCS)と5番ピンを結線し、
外部から液晶の表示を付けたり消したりしたいなら、外部信号結線を使ってください。
それ以外なら簡単結線で問題ありません。
このライブラリは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には、描画モードを指定します。
いずれの関数も引数の中にimmidiateというものが存在します。
immidiateには、即時描画を行うかどうかをtrueかfalseで指定します。
例えばpixel関数で1個打点したあと、immidiate
がtrue
であればすぐに液晶に反映されます。
immidiate
がfalse
の場合、内部画素記憶配列のみを更新し、液晶には反映しません。
1行だけの反映であれば大した時間はかかりませんが、反映する行が増えれば増えるほど
処理の時間がかかってしまいますので、書きたい情報を全部内部画素記憶配列に書き込んでから
一気にドバっと反映するほうが効率的で処理時間の短縮が見込めます。
なので、文字や四角形や格子模様などを複数行広範囲にわたって書き込む場合はimmidiate
をfalse
にして
すべての描画処理が完了したあとにwriteArrayN
関数やwriteArrayA
関数を使用して
ドバっと更新するほうがお得です。
ちなみに、各関数のimmidiate
のデフォルト値はtrue
です。
引数を省略した場合は即時描画されてしまいますのでご注意ください。
COM反転は、液晶の寿命を延ばすために(焼き付き防止?)人間に見えない速度で液晶を明滅させる仕組みです。
COM反転信号はCOM反転を行うタイミングを液晶に伝達するもので、外部信号と内部信号の2種類があります。
このライブラリでは呼ばれたコンストラクタによって処理を変えており、
引数が3つのコンストラクタで呼ばれたらCOM反転は内部信号を使用します。
引数が5つのコンストラクタで呼ばれたらCOM反転は外部信号を使用します。
引数が3つのコンストラクタを呼ぶ場合は、EXTCOMの端子をVSS(GND)に接続し
引数が5つのコンストラクタを呼ぶ場合は、EXTCOMの端子をVDD(3.3-5V)に接続してください。
COM反転信号はMsTimer2などを使用して、周期的にinvertCOM()
関数を呼んでください。
このライブラリでは、ライブラリを通して描かれた全画素の情報ををchar型の一次元配列として記憶します。
故に、小さなRAMしか搭載していないものではOutOfMemoryになり、うまく動作しません。
内部画素記憶配列のサイズは、((表示幅[px] / 8) * 表示高さ[px])[byte]です。
表示幅400px、表示高さ240pxの場合は 12Kbyte(12,000byte)
の領域を要します。
表示幅128px、表示高さ128pxの場合は 2Kbyte(2,048byte)
文字列を扱う場合はさらにメモリ使用量が増えるので、表示幅400px、表示高さ240pxで使用する場合は
参考値として16KB以上のメモリ(RAM)を搭載した製品でお使いください。