秋月電子などで販売されているSHARP製HR-TFTモノクロメモリ液晶を、直接駆動するためのライブラリです。 図形、文字列の描画が可能です。 日本語のフォントも内包していますが、FlashサイズやRAMサイズが小さいものだと扱いきれないかもしれません。 既存のライブラリとは違い、貴重なSPIポートを占拠しません。DigitalOut端子3本でSPIモドキを実現しています。 結線方法については、デモプログラムのページをご参照ください。
Dependents: SHARP_MEMORYLCD_WJ
内部画素記憶配列に関する注意
このライブラリでは、ライブラリを通して描かれた全画素の情報ををchar型の一次元配列として記憶します。
故に、小さなRAMしか搭載していないものではOutOfMemoryになり、うまく動作しません。
init関数で固まる場合は、memset(R, -1, siz);
で配列が初期化できずに止まっている可能性があります。
内部画素記憶配列のサイズは、((表示幅[px] / 8) * 表示高さ[px])[byte]です。
表示幅400px、表示高さ240pxの場合は 12Kbyte(12,000byte)
の領域を要します。
シャープ製メモリ液晶直接駆動用ライブラリ
秋月電子などで販売されている、シャープ製のモノクロメモリ液晶を
直接駆動させるためのライブラリとデモプログラムです。
図形や文字列を比較的簡単に表示させることが可能です。
また、メモリに余裕があれば日本語(全角文字)も描画可能です。
文字描画のアルゴリズムは、こちらのページで公開されていた
日本語ビットマップフォント表示アルゴリズムを改変して使用しています。
松浦光洋様、素晴らしいアルゴリズムを公開していただきありがとうございます。
現在ソースコードの公開は停止されている模様です。
また、ビットマプフォントにはM+ BITMAP FONTSで公開されている
Mplus-gothic-medium-R-normal 12pxを使用しています。
使用できる液晶製品
LS027B7DH01Aと同一の駆動方式であれば駆動可能です。
対応済みと思われる製品(テストはLS027B7DH01Aで行っています)
LS012B7DD01とLS013B7DH06は駆動方式が異なるため使用できません。
直接結線して駆動することを前提としてコードを書いているので、
間にSRAMやEEPROMなどを挟んだり、4線式SPIの使用を前提としたものでは動作しません。
デモプログラムのページ(結線方法など)
描画方式と内部画素記憶配列について
メモリ液晶の描画方式は
- ゲートラインアドレス(1から始まる行番号)を選択
- 1行あたりの画素数を8画素ごとに区切って連続転送する(幅 / 8の数だけ)
というものです。
つまり2値(白黒)の8画素なので、char型(1byte)の配列で画素をコントロールすることが可能です。
一見単純に見えますが、行ごとの更新では更新したくない画素も更新対象に入ってしまいます。
例えば、このような行がある場合、
11111011 11111111
13番目の画素に黒点を打つために「11111111 11110111」のデータを送ると・・・
11111111 11110111 ←6番目の画素も上書きされてしまう
更新したくない画素も更新されてしまいます。
これでは意図した描画が簡単に行えませんので、このライブラリでは現在の画素情報を
char型の1次元配列で保管し(サイズは 幅 / 8 * 高さ)、この記憶情報を更新してから、液晶に
送ることによって図形などの描画を実現しています。
例えば、
11111011 11111111
13番目の画素に黒点を打つために「11111111 11110111」のデータを表示したい・・・
.......11111011 11111111 ←もともと表示されていたデータ
AND)...11111111 11110111 ←表示したいデータと論理積をとる
++++++++++++++++++++++++
.......11111011 11110111 ←液晶に書き込むべき値がでてくる
これで更新すべき値を算出して、液晶に流し込んでいます。
また、この液晶は1が白、0が黒です。
これもわかりにくいので、このライブラリ内では1を黒、0を白として扱っています。
即時描画(immidiate)について
関数の最後の引数にbool型のimmidiate
というものがありますが、これは即時描画を行うかどうかのフラグです。
例えばpixel関数で1個打点したあと、immidiate
がtrue
であればすぐに液晶に反映されます。
immidiate
がfalse
の場合、内部画素記憶配列のみを更新し、液晶には反映しません。
1行だけの反映であれば大した時間はかかりませんが、反映する行が増えれば増えるほど
処理の時間がかかってしまいますので、書きたい情報を全部内部画素記憶配列に書き込んでから
一気にドバっと反映するほうが効率的で処理時間の短縮が見込めます。
なので、文字や四角形や格子模様などを複数行広範囲にわたって書き込む場合はimmidiate
をfalse
にして
すべての描画処理が完了したあとにwriteArrayN
関数やwriteArrayA
関数を使用して
ドバっと更新するほうがお得です。
ちなみに、各関数のimmidiate
のデフォルト値はtrue
です。
引数を省略した場合は即時描画されてしまいますのでご注意ください。
COM反転信号
COM反転は、液晶の寿命を延ばすために(焼き付き防止?)人間に見えない速度で液晶を明滅させる仕組みです。
COM反転信号はCOM反転を行うタイミングを液晶に伝達するもので、外部信号と内部信号の2種類があります。
このライブラリでは呼ばれたコンストラクタによって処理を変えており、
引数が3つのコンストラクタで呼ばれたらCOM反転は内部信号を使用します。
引数が5つのコンストラクタで呼ばれたらCOM反転は外部信号を使用します。
(ただし、引数が5つでもDigitalOutができないピンであれば内部信号に切り替わる)
引数が3つのコンストラクタを呼ぶ場合は、EXTCOMの端子をVSS(GND)に接続し 引数が5つのコンストラクタを呼ぶ場合は、EXTCOMの端子をVDD(3.3-5V)に接続してください。
COM反転信号はTickerを使って自動的に送出される仕組みになっていますが
init関数を呼ぶまではタイマーは作動しません。ユーザーがderegTimer関数でタイマーを解除した場合も、
regTimer関数で再度タイマーを開始するまでは止まったままになります。
また、int main()が終了した場合もSH_MLCD_Jクラスのインスタンスそのものが削除されて
COM反転信号が止まりますので、プログラムの終了を意図的に遅延させるか、プログラム終了後は
速やかに液晶を取り外してください。