秋月電子などで販売されている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の使用を前提としたものでは動作しません。


デモプログラムのページ(結線方法など)

mbed LPC1768用デモプログラム


描画方式と内部画素記憶配列について

メモリ液晶の描画方式は

  1. ゲートラインアドレス(1から始まる行番号)を選択
  2. 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個打点したあと、immidiatetrueであればすぐに液晶に反映されます。
immidiatefalseの場合、内部画素記憶配列のみを更新し、液晶には反映しません。

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

なので、文字や四角形や格子模様などを複数行広範囲にわたって書き込む場合はimmidiatefalseにして
すべての描画処理が完了したあとに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反転信号が止まりますので、プログラムの終了を意図的に遅延させるか、プログラム終了後は
速やかに液晶を取り外してください。

Committer:
Yajirushi
Date:
Fri Dec 11 05:24:50 2015 +0000
Revision:
0:8512c64be557
GR-SAKURA???????mbed????

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Yajirushi 0:8512c64be557 1 #include "SH_MLCD_J.h"
Yajirushi 0:8512c64be557 2
Yajirushi 0:8512c64be557 3 //ショートカット
Yajirushi 0:8512c64be557 4 #define SCK_LOW pinSCK->write(0)
Yajirushi 0:8512c64be557 5 #define SCK_HIGH pinSCK->write(1)
Yajirushi 0:8512c64be557 6 #define CS_LOW pinSCS->write(0)
Yajirushi 0:8512c64be557 7 #define CS_HIGH pinSCS->write(1)
Yajirushi 0:8512c64be557 8 #define WAIT_SPI wait_us(SHMLCD_J_SPIWAIT)
Yajirushi 0:8512c64be557 9 #define WAIT_1US wait_us(1)
Yajirushi 0:8512c64be557 10 #define WAIT_3US wait_us(3)
Yajirushi 0:8512c64be557 11
Yajirushi 0:8512c64be557 12 //フォントファイル
Yajirushi 0:8512c64be557 13 #include "MPLUS12.txt"
Yajirushi 0:8512c64be557 14
Yajirushi 0:8512c64be557 15 //コンストラクタ(オーバーロード +3) =================================
Yajirushi 0:8512c64be557 16 SHMLCD_J::SHMLCD_J(PinName vSCK, PinName vSI, PinName vCS, PinName vCOM, PinName vDISP){
Yajirushi 0:8512c64be557 17 //画面サイズゼロクリア
Yajirushi 0:8512c64be557 18 _width = 0;
Yajirushi 0:8512c64be557 19 _height = 0;
Yajirushi 0:8512c64be557 20 _bytes = 0;
Yajirushi 0:8512c64be557 21
Yajirushi 0:8512c64be557 22 //使用ピン保存
Yajirushi 0:8512c64be557 23 pinSCK = new DigitalOut(vSCK);
Yajirushi 0:8512c64be557 24 pinSI = new DigitalOut(vSI);
Yajirushi 0:8512c64be557 25 pinSCS = new DigitalOut(vCS);
Yajirushi 0:8512c64be557 26 pinCOM = new DigitalOut(vCOM);
Yajirushi 0:8512c64be557 27 pinDISP = new DigitalOut(vDISP);
Yajirushi 0:8512c64be557 28
Yajirushi 0:8512c64be557 29 //外部COM、外部DISPを使用するかどうか
Yajirushi 0:8512c64be557 30 useEcom = (vCOM != NC);
Yajirushi 0:8512c64be557 31 useEdisp = (vDISP != NC);
Yajirushi 0:8512c64be557 32
Yajirushi 0:8512c64be557 33 //COMフラグ初期化
Yajirushi 0:8512c64be557 34 comFlag = false;
Yajirushi 0:8512c64be557 35
Yajirushi 0:8512c64be557 36 //命令送信フラグ初期化
Yajirushi 0:8512c64be557 37 busySPI = false;
Yajirushi 0:8512c64be557 38 }
Yajirushi 0:8512c64be557 39
Yajirushi 0:8512c64be557 40 //コンストラクタ(オーバーロード +3) =================================
Yajirushi 0:8512c64be557 41 SHMLCD_J::SHMLCD_J(DigitalOut *vSCK, DigitalOut *vSI, DigitalOut *vCS, DigitalOut *vCOM, DigitalOut *vDISP){
Yajirushi 0:8512c64be557 42 //画面サイズゼロクリア
Yajirushi 0:8512c64be557 43 _width = 0;
Yajirushi 0:8512c64be557 44 _height = 0;
Yajirushi 0:8512c64be557 45 _bytes = 0;
Yajirushi 0:8512c64be557 46
Yajirushi 0:8512c64be557 47 //使用ピン保存
Yajirushi 0:8512c64be557 48 pinSCK = vSCK;
Yajirushi 0:8512c64be557 49 pinSI = vSI;
Yajirushi 0:8512c64be557 50 pinSCS = vCS;
Yajirushi 0:8512c64be557 51 pinCOM = vCOM;
Yajirushi 0:8512c64be557 52 pinDISP = vDISP;
Yajirushi 0:8512c64be557 53
Yajirushi 0:8512c64be557 54 //外部COM、外部DISPを使用するかどうか
Yajirushi 0:8512c64be557 55 useEcom = true;
Yajirushi 0:8512c64be557 56 useEdisp = true;
Yajirushi 0:8512c64be557 57
Yajirushi 0:8512c64be557 58 //COMフラグ初期化
Yajirushi 0:8512c64be557 59 comFlag = false;
Yajirushi 0:8512c64be557 60
Yajirushi 0:8512c64be557 61 //命令送信フラグ初期化
Yajirushi 0:8512c64be557 62 busySPI = false;
Yajirushi 0:8512c64be557 63 }
Yajirushi 0:8512c64be557 64
Yajirushi 0:8512c64be557 65 //コンストラクタ(オーバーロード +3) =================================
Yajirushi 0:8512c64be557 66 SHMLCD_J::SHMLCD_J(PinName vSCK, PinName vSI, PinName vCS){
Yajirushi 0:8512c64be557 67 //画面サイズゼロクリア
Yajirushi 0:8512c64be557 68 _width = 0;
Yajirushi 0:8512c64be557 69 _height = 0;
Yajirushi 0:8512c64be557 70 _bytes = 0;
Yajirushi 0:8512c64be557 71
Yajirushi 0:8512c64be557 72 //使用ピン保存
Yajirushi 0:8512c64be557 73 pinSCK = new DigitalOut(vSCK);
Yajirushi 0:8512c64be557 74 pinSI = new DigitalOut(vSI);
Yajirushi 0:8512c64be557 75 pinSCS = new DigitalOut(vCS);
Yajirushi 0:8512c64be557 76 pinCOM = new DigitalOut(NC);
Yajirushi 0:8512c64be557 77 pinDISP = new DigitalOut(NC);
Yajirushi 0:8512c64be557 78
Yajirushi 0:8512c64be557 79 //外部COM、外部DISPを使用するかどうか
Yajirushi 0:8512c64be557 80 useEcom = false;
Yajirushi 0:8512c64be557 81 useEdisp = false;
Yajirushi 0:8512c64be557 82
Yajirushi 0:8512c64be557 83 //COMフラグ初期化
Yajirushi 0:8512c64be557 84 comFlag = false;
Yajirushi 0:8512c64be557 85
Yajirushi 0:8512c64be557 86 //命令送信フラグ初期化
Yajirushi 0:8512c64be557 87 busySPI = false;
Yajirushi 0:8512c64be557 88 }
Yajirushi 0:8512c64be557 89
Yajirushi 0:8512c64be557 90 //コンストラクタ(オーバーロード +3) =================================
Yajirushi 0:8512c64be557 91 SHMLCD_J::SHMLCD_J(DigitalOut *vSCK, DigitalOut *vSI, DigitalOut *vCS){
Yajirushi 0:8512c64be557 92 //画面サイズゼロクリア
Yajirushi 0:8512c64be557 93 _width = 0;
Yajirushi 0:8512c64be557 94 _height = 0;
Yajirushi 0:8512c64be557 95 _bytes = 0;
Yajirushi 0:8512c64be557 96
Yajirushi 0:8512c64be557 97 //使用ピン保存
Yajirushi 0:8512c64be557 98 pinSCK = vSCK;
Yajirushi 0:8512c64be557 99 pinSI = vSI;
Yajirushi 0:8512c64be557 100 pinSCS = vCS;
Yajirushi 0:8512c64be557 101 pinCOM = new DigitalOut(NC);
Yajirushi 0:8512c64be557 102 pinDISP = new DigitalOut(NC);
Yajirushi 0:8512c64be557 103
Yajirushi 0:8512c64be557 104 //外部COM、外部DISPを使用するかどうか
Yajirushi 0:8512c64be557 105 useEcom = false;
Yajirushi 0:8512c64be557 106 useEdisp = false;
Yajirushi 0:8512c64be557 107
Yajirushi 0:8512c64be557 108 //COMフラグ初期化
Yajirushi 0:8512c64be557 109 comFlag = false;
Yajirushi 0:8512c64be557 110
Yajirushi 0:8512c64be557 111 //命令送信フラグ初期化
Yajirushi 0:8512c64be557 112 busySPI = false;
Yajirushi 0:8512c64be557 113 }
Yajirushi 0:8512c64be557 114
Yajirushi 0:8512c64be557 115 //デストラクタ ======================================================
Yajirushi 0:8512c64be557 116 SHMLCD_J::~SHMLCD_J(){
Yajirushi 0:8512c64be557 117 //念のためタイマー停止
Yajirushi 0:8512c64be557 118 deregCOMTimer();
Yajirushi 0:8512c64be557 119 //画素状態記憶用配列を削除
Yajirushi 0:8512c64be557 120 delete[] R;
Yajirushi 0:8512c64be557 121 //使用したピン用変数削除
Yajirushi 0:8512c64be557 122 delete pinSCK;
Yajirushi 0:8512c64be557 123 delete pinSI;
Yajirushi 0:8512c64be557 124 delete pinSCS;
Yajirushi 0:8512c64be557 125 delete pinCOM;
Yajirushi 0:8512c64be557 126 delete pinDISP;
Yajirushi 0:8512c64be557 127 }
Yajirushi 0:8512c64be557 128
Yajirushi 0:8512c64be557 129 //SPIモドキのコマンド送出 ===========================================
Yajirushi 0:8512c64be557 130 //@モード決定
Yajirushi 0:8512c64be557 131 void SHMLCD_J::send_mode(unsigned char val){
Yajirushi 0:8512c64be557 132 //モード決定はMSBファーストでsend_dataと同一
Yajirushi 0:8512c64be557 133 send_data(val);
Yajirushi 0:8512c64be557 134 }
Yajirushi 0:8512c64be557 135 //@ゲートアドレス選択
Yajirushi 0:8512c64be557 136 void SHMLCD_J::send_addr(unsigned char val){
Yajirushi 0:8512c64be557 137 //アドレスはLSBファースト(ビットの最下位から送る)
Yajirushi 0:8512c64be557 138 for(char i=0; i<8; i++){
Yajirushi 0:8512c64be557 139 pinSI->write((val>>i) & 0x01);
Yajirushi 0:8512c64be557 140 SCK_HIGH;
Yajirushi 0:8512c64be557 141 WAIT_SPI;
Yajirushi 0:8512c64be557 142 SCK_LOW;
Yajirushi 0:8512c64be557 143 }
Yajirushi 0:8512c64be557 144 }
Yajirushi 0:8512c64be557 145 //@データ送出
Yajirushi 0:8512c64be557 146 void SHMLCD_J::send_data(unsigned char val){
Yajirushi 0:8512c64be557 147 //データはMSBファースト(ビットの最上位から送る)
Yajirushi 0:8512c64be557 148 for(char i=0; i<8; i++){
Yajirushi 0:8512c64be557 149 pinSI->write(((val<<i) & 0x80)>>7);
Yajirushi 0:8512c64be557 150 SCK_HIGH;
Yajirushi 0:8512c64be557 151 WAIT_SPI;
Yajirushi 0:8512c64be557 152 SCK_LOW;
Yajirushi 0:8512c64be557 153 }
Yajirushi 0:8512c64be557 154 }
Yajirushi 0:8512c64be557 155
Yajirushi 0:8512c64be557 156 //初期化 ============================================================
Yajirushi 0:8512c64be557 157 bool SHMLCD_J::init(unsigned short dispWidth, unsigned short dispHeight){
Yajirushi 0:8512c64be557 158 //既に初期化されているならtrueを返して終わる
Yajirushi 0:8512c64be557 159 if((_width + _height) > 96) return true;
Yajirushi 0:8512c64be557 160
Yajirushi 0:8512c64be557 161 //画面サイズが48pixel以下:そんなメモリ液晶は売ってない
Yajirushi 0:8512c64be557 162 if(dispWidth < 48 || dispHeight < 48) return false;
Yajirushi 0:8512c64be557 163
Yajirushi 0:8512c64be557 164 //画面の横幅は8で割り切れる数
Yajirushi 0:8512c64be557 165 if((dispWidth % 8) != 0) return false;
Yajirushi 0:8512c64be557 166
Yajirushi 0:8512c64be557 167 //縦横、1行あたりのバイト数を保存
Yajirushi 0:8512c64be557 168 _width = dispWidth;
Yajirushi 0:8512c64be557 169 _height = dispHeight;
Yajirushi 0:8512c64be557 170 _bytes = _width >> 3; //_width / 8;
Yajirushi 0:8512c64be557 171
Yajirushi 0:8512c64be557 172 //画素状態記憶用配列を生成((幅 / 8bit) * 高さ)
Yajirushi 0:8512c64be557 173 //最大12KByte(400 / 8 * 240 = 12,000)
Yajirushi 0:8512c64be557 174 //配列はゼロクリアする
Yajirushi 0:8512c64be557 175 short siz = _bytes * _height;
Yajirushi 0:8512c64be557 176 R = new char[siz];
Yajirushi 0:8512c64be557 177 memset(R, -1, siz);
Yajirushi 0:8512c64be557 178
Yajirushi 0:8512c64be557 179 //DISP以外のすべての信号をLOWに
Yajirushi 0:8512c64be557 180 pinSCK->write(0);
Yajirushi 0:8512c64be557 181 pinSI->write(0);
Yajirushi 0:8512c64be557 182 pinSCS->write(0);
Yajirushi 0:8512c64be557 183 if(useEcom) pinCOM->write(0);
Yajirushi 0:8512c64be557 184
Yajirushi 0:8512c64be557 185 //表示オン
Yajirushi 0:8512c64be557 186 dispON();
Yajirushi 0:8512c64be557 187
Yajirushi 0:8512c64be557 188 wait_ms(2); //メモリ液晶初期化待ち時間
Yajirushi 0:8512c64be557 189
Yajirushi 0:8512c64be557 190 //表示クリア
Yajirushi 0:8512c64be557 191 clear();
Yajirushi 0:8512c64be557 192
Yajirushi 0:8512c64be557 193 //COM反転信号タイマー起動
Yajirushi 0:8512c64be557 194 regCOMTimer();
Yajirushi 0:8512c64be557 195
Yajirushi 0:8512c64be557 196 return true;
Yajirushi 0:8512c64be557 197 }
Yajirushi 0:8512c64be557 198
Yajirushi 0:8512c64be557 199 //表示幅、表示高さを返す ============================================
Yajirushi 0:8512c64be557 200 //@表示幅を返す
Yajirushi 0:8512c64be557 201 unsigned short SHMLCD_J::getWidth(){return _width;}
Yajirushi 0:8512c64be557 202 //@表示高さを返す
Yajirushi 0:8512c64be557 203 unsigned short SHMLCD_J::getHeight(){return _height;}
Yajirushi 0:8512c64be557 204
Yajirushi 0:8512c64be557 205 //表示クリア ========================================================
Yajirushi 0:8512c64be557 206 void SHMLCD_J::clear(){
Yajirushi 0:8512c64be557 207 //コマンド送出フラグ
Yajirushi 0:8512c64be557 208 busySPI = true;
Yajirushi 0:8512c64be557 209
Yajirushi 0:8512c64be557 210 CS_HIGH;
Yajirushi 0:8512c64be557 211 wait_ms(25);
Yajirushi 0:8512c64be557 212 send_mode(SHMLCD_J_CLEAR | ((comFlag)? SHMLCD_J_COM : SHMLCD_J_DUMMY));
Yajirushi 0:8512c64be557 213 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 214 wait_ms(25);
Yajirushi 0:8512c64be557 215 CS_LOW;
Yajirushi 0:8512c64be557 216 WAIT_1US;
Yajirushi 0:8512c64be557 217
Yajirushi 0:8512c64be557 218 //コマンド送出フラグ
Yajirushi 0:8512c64be557 219 busySPI = false;
Yajirushi 0:8512c64be557 220 }
Yajirushi 0:8512c64be557 221
Yajirushi 0:8512c64be557 222 void SHMLCD_J::cls(){ //void clear()と同一
Yajirushi 0:8512c64be557 223 clear();
Yajirushi 0:8512c64be557 224 }
Yajirushi 0:8512c64be557 225
Yajirushi 0:8512c64be557 226 //内部配列クリア(0xFFで初期化) ======================================
Yajirushi 0:8512c64be557 227 void SHMLCD_J::clearArray(){
Yajirushi 0:8512c64be557 228 short siz = _bytes * _height;
Yajirushi 0:8512c64be557 229 memset(R, -1, siz);
Yajirushi 0:8512c64be557 230 }
Yajirushi 0:8512c64be557 231
Yajirushi 0:8512c64be557 232 void SHMLCD_J::cla(){ //void clearArray()と同一
Yajirushi 0:8512c64be557 233 clearArray();
Yajirushi 0:8512c64be557 234 }
Yajirushi 0:8512c64be557 235
Yajirushi 0:8512c64be557 236 //表示オン、オフ ====================================================
Yajirushi 0:8512c64be557 237 //@表示オン
Yajirushi 0:8512c64be557 238 void SHMLCD_J::dispON(){
Yajirushi 0:8512c64be557 239 if(useEdisp) pinDISP->write(1);
Yajirushi 0:8512c64be557 240 }
Yajirushi 0:8512c64be557 241 //@表示オフ
Yajirushi 0:8512c64be557 242 void SHMLCD_J::dispOFF(){
Yajirushi 0:8512c64be557 243 if(useEdisp) pinDISP->write(0);
Yajirushi 0:8512c64be557 244 }
Yajirushi 0:8512c64be557 245
Yajirushi 0:8512c64be557 246 //COM反転 ===========================================================
Yajirushi 0:8512c64be557 247 void SHMLCD_J::invertCOM(){
Yajirushi 0:8512c64be557 248 //コマンド送出中であればフラグを反転させるだけ
Yajirushi 0:8512c64be557 249 //コマンド送出がない場合はCSを切り替えて強制的にCOM反転する
Yajirushi 0:8512c64be557 250 if(busySPI){
Yajirushi 0:8512c64be557 251 if(useEcom){
Yajirushi 0:8512c64be557 252 pinCOM->write(1);
Yajirushi 0:8512c64be557 253 WAIT_1US;
Yajirushi 0:8512c64be557 254 pinCOM->write(0);
Yajirushi 0:8512c64be557 255 }
Yajirushi 0:8512c64be557 256 }else{
Yajirushi 0:8512c64be557 257 CS_HIGH;
Yajirushi 0:8512c64be557 258 WAIT_1US;
Yajirushi 0:8512c64be557 259 if(useEcom){
Yajirushi 0:8512c64be557 260 pinCOM->write(1);
Yajirushi 0:8512c64be557 261 WAIT_1US;
Yajirushi 0:8512c64be557 262 pinCOM->write(0);
Yajirushi 0:8512c64be557 263 }else{
Yajirushi 0:8512c64be557 264 send_mode((comFlag)? SHMLCD_J_DUMMY : SHMLCD_J_COM);
Yajirushi 0:8512c64be557 265 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 266 }
Yajirushi 0:8512c64be557 267 WAIT_3US;
Yajirushi 0:8512c64be557 268 CS_LOW;
Yajirushi 0:8512c64be557 269 WAIT_1US;
Yajirushi 0:8512c64be557 270 }
Yajirushi 0:8512c64be557 271 comFlag = !comFlag;
Yajirushi 0:8512c64be557 272 }
Yajirushi 0:8512c64be557 273
Yajirushi 0:8512c64be557 274 //COM反転用タイマー登録、解除 =======================================
Yajirushi 0:8512c64be557 275 //@タイマー登録、開始
Yajirushi 0:8512c64be557 276 void SHMLCD_J::regCOMTimer(float tickTime){
Yajirushi 0:8512c64be557 277 comT.attach(this, &SHMLCD_J::invertCOM, tickTime);
Yajirushi 0:8512c64be557 278 }
Yajirushi 0:8512c64be557 279 //@タイマー停止、解除
Yajirushi 0:8512c64be557 280 void SHMLCD_J::deregCOMTimer(){
Yajirushi 0:8512c64be557 281 comT.detach();
Yajirushi 0:8512c64be557 282 }
Yajirushi 0:8512c64be557 283
Yajirushi 0:8512c64be557 284 //配列データ更新 ====================================================
Yajirushi 0:8512c64be557 285 //@1行更新
Yajirushi 0:8512c64be557 286 void SHMLCD_J::updateArray1(unsigned char ln, const char *data){
Yajirushi 0:8512c64be557 287 //ln = 行番号 0から_height-1まで
Yajirushi 0:8512c64be557 288 //画素状態記憶用配列に*dataの内容を上書き
Yajirushi 0:8512c64be557 289 ln = (ln >= _height)? _height-1 : ln;
Yajirushi 0:8512c64be557 290
Yajirushi 0:8512c64be557 291 //データのサイズが_bytesに満たない場合は何もしない
Yajirushi 0:8512c64be557 292 if((sizeof(data) / sizeof(data[0])) < _bytes) return;
Yajirushi 0:8512c64be557 293
Yajirushi 0:8512c64be557 294 memcpy(R + (ln * _bytes), data, _bytes);
Yajirushi 0:8512c64be557 295 }
Yajirushi 0:8512c64be557 296 //@複数行更新
Yajirushi 0:8512c64be557 297 void SHMLCD_J::updateArrayN(unsigned char sn, unsigned char en, const char *data){
Yajirushi 0:8512c64be557 298 //sn = 開始行, en = 終了行
Yajirushi 0:8512c64be557 299 //画素状態記憶用配列に*dataの内容を上書き
Yajirushi 0:8512c64be557 300 sn = (sn >= _height)? _height-1 : sn;
Yajirushi 0:8512c64be557 301 en = (en >= _height)? _height-1 : en;
Yajirushi 0:8512c64be557 302
Yajirushi 0:8512c64be557 303 //snとenが一緒:1行だけ更新
Yajirushi 0:8512c64be557 304 if(sn == en){
Yajirushi 0:8512c64be557 305 memcpy(R + (sn * _bytes), data, _bytes);
Yajirushi 0:8512c64be557 306 return;
Yajirushi 0:8512c64be557 307 }
Yajirushi 0:8512c64be557 308
Yajirushi 0:8512c64be557 309 //snとenが逆:ひっくり返す
Yajirushi 0:8512c64be557 310 if(sn > en){
Yajirushi 0:8512c64be557 311 sn ^= en;
Yajirushi 0:8512c64be557 312 en ^= sn;
Yajirushi 0:8512c64be557 313 sn ^= en;
Yajirushi 0:8512c64be557 314 }
Yajirushi 0:8512c64be557 315
Yajirushi 0:8512c64be557 316 //snが1でenが_height:全部更新
Yajirushi 0:8512c64be557 317 if((en - sn) == (_height-1)){
Yajirushi 0:8512c64be557 318 memcpy(R, data, _height * _bytes);
Yajirushi 0:8512c64be557 319 return;
Yajirushi 0:8512c64be557 320 }
Yajirushi 0:8512c64be557 321
Yajirushi 0:8512c64be557 322 //dataのサイズ確認
Yajirushi 0:8512c64be557 323 unsigned short stidx = sn * _bytes;
Yajirushi 0:8512c64be557 324 unsigned short len = (en - sn) * _bytes;
Yajirushi 0:8512c64be557 325 if((sizeof(data) / sizeof(data[0])) < len) return;
Yajirushi 0:8512c64be557 326
Yajirushi 0:8512c64be557 327 //画素状態記憶用配列に*dataの内容を上書き
Yajirushi 0:8512c64be557 328 memcpy(R + stidx, data, len);
Yajirushi 0:8512c64be557 329 }
Yajirushi 0:8512c64be557 330 //@全部更新
Yajirushi 0:8512c64be557 331 void SHMLCD_J::updateArrayA(const char *data){
Yajirushi 0:8512c64be557 332 //画素状態記憶用配列に*dataの内容を上書き
Yajirushi 0:8512c64be557 333 memcpy(R, data, _height * _bytes);
Yajirushi 0:8512c64be557 334 }
Yajirushi 0:8512c64be557 335
Yajirushi 0:8512c64be557 336 //表示データ書き込み(内部配列を使用する) ============================
Yajirushi 0:8512c64be557 337 //@1行書き込み(内部配列を使用する)
Yajirushi 0:8512c64be557 338 void SHMLCD_J::writeArray1(unsigned char ln){
Yajirushi 0:8512c64be557 339 //ln = 行番号 0から_height-1まで
Yajirushi 0:8512c64be557 340 ln = (ln >= _height)? _height-1 : ln;
Yajirushi 0:8512c64be557 341
Yajirushi 0:8512c64be557 342 //内部配列開始位置
Yajirushi 0:8512c64be557 343 short idx = ln * _bytes;
Yajirushi 0:8512c64be557 344
Yajirushi 0:8512c64be557 345 //コマンド送出フラグ
Yajirushi 0:8512c64be557 346 busySPI = true;
Yajirushi 0:8512c64be557 347
Yajirushi 0:8512c64be557 348 CS_HIGH;
Yajirushi 0:8512c64be557 349 WAIT_1US;
Yajirushi 0:8512c64be557 350
Yajirushi 0:8512c64be557 351 send_mode(SHMLCD_J_WRITE | ((comFlag)? SHMLCD_J_COM : SHMLCD_J_DUMMY)); //モード決定
Yajirushi 0:8512c64be557 352 send_addr(ln+1); //ゲートライン(行番号 1から_heightまで)選択
Yajirushi 0:8512c64be557 353
Yajirushi 0:8512c64be557 354 //1行分のデータ連続書き込み
Yajirushi 0:8512c64be557 355 for(short i=0; i<_bytes; i++){
Yajirushi 0:8512c64be557 356 send_data(R[idx+i]);
Yajirushi 0:8512c64be557 357 }
Yajirushi 0:8512c64be557 358
Yajirushi 0:8512c64be557 359 //転送待ち(16clockダミーを送る)
Yajirushi 0:8512c64be557 360 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 361 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 362
Yajirushi 0:8512c64be557 363 WAIT_3US;
Yajirushi 0:8512c64be557 364 CS_LOW;
Yajirushi 0:8512c64be557 365 WAIT_1US;
Yajirushi 0:8512c64be557 366
Yajirushi 0:8512c64be557 367 //コマンド送出フラグ
Yajirushi 0:8512c64be557 368 busySPI = false;
Yajirushi 0:8512c64be557 369 }
Yajirushi 0:8512c64be557 370 //@複数行書き込み(内部配列を使用する)
Yajirushi 0:8512c64be557 371 void SHMLCD_J::writeArrayN(unsigned char sn, unsigned char en){
Yajirushi 0:8512c64be557 372 //sn = 開始行, en = 終了行
Yajirushi 0:8512c64be557 373 sn = (sn >= _height)? _height-1 : sn;
Yajirushi 0:8512c64be557 374 en = (en >= _height)? _height-1 : en;
Yajirushi 0:8512c64be557 375
Yajirushi 0:8512c64be557 376 //snとenが一緒:1行だけ書き込み
Yajirushi 0:8512c64be557 377 if(sn == en){
Yajirushi 0:8512c64be557 378 writeArray1(sn);
Yajirushi 0:8512c64be557 379 return;
Yajirushi 0:8512c64be557 380 }
Yajirushi 0:8512c64be557 381
Yajirushi 0:8512c64be557 382 //snとenが逆:ひっくり返す
Yajirushi 0:8512c64be557 383 if(sn > en){
Yajirushi 0:8512c64be557 384 sn ^= en;
Yajirushi 0:8512c64be557 385 en ^= sn;
Yajirushi 0:8512c64be557 386 sn ^= en;
Yajirushi 0:8512c64be557 387 }
Yajirushi 0:8512c64be557 388
Yajirushi 0:8512c64be557 389 //内部配列開始位置
Yajirushi 0:8512c64be557 390 short idx = sn * _bytes;
Yajirushi 0:8512c64be557 391 int rows = en - sn + 1;
Yajirushi 0:8512c64be557 392
Yajirushi 0:8512c64be557 393 //コマンド送出フラグ
Yajirushi 0:8512c64be557 394 busySPI = true;
Yajirushi 0:8512c64be557 395
Yajirushi 0:8512c64be557 396 CS_HIGH;
Yajirushi 0:8512c64be557 397 WAIT_1US;
Yajirushi 0:8512c64be557 398
Yajirushi 0:8512c64be557 399 send_mode(SHMLCD_J_WRITE | ((comFlag)? SHMLCD_J_COM : SHMLCD_J_DUMMY)); //モード決定
Yajirushi 0:8512c64be557 400
Yajirushi 0:8512c64be557 401 //データ連続書き込み
Yajirushi 0:8512c64be557 402 sn++; //0スタートを1スタートに
Yajirushi 0:8512c64be557 403 en++; //0スタートを1スタートに
Yajirushi 0:8512c64be557 404 for(short i=0, j, k; i<rows; i++){
Yajirushi 0:8512c64be557 405 send_addr(sn + i); //ゲートライン(行番号 1から_heightまで)選択
Yajirushi 0:8512c64be557 406 //1行分のデータ連続書き込み
Yajirushi 0:8512c64be557 407 for(j=0, k = i * _bytes + idx; j<_bytes; j++){
Yajirushi 0:8512c64be557 408 send_data(R[j+k]);
Yajirushi 0:8512c64be557 409 }
Yajirushi 0:8512c64be557 410 //転送待ち(8clockダミーを送る)
Yajirushi 0:8512c64be557 411 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 412 }
Yajirushi 0:8512c64be557 413 //転送待ち(8clockダミーを送る)
Yajirushi 0:8512c64be557 414 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 415
Yajirushi 0:8512c64be557 416 WAIT_3US;
Yajirushi 0:8512c64be557 417 CS_LOW;
Yajirushi 0:8512c64be557 418 WAIT_1US;
Yajirushi 0:8512c64be557 419
Yajirushi 0:8512c64be557 420 //コマンド送出フラグ
Yajirushi 0:8512c64be557 421 busySPI = false;
Yajirushi 0:8512c64be557 422 }
Yajirushi 0:8512c64be557 423 //@全部書き込み(内部配列を使用する)
Yajirushi 0:8512c64be557 424 void SHMLCD_J::writeArrayA(){
Yajirushi 0:8512c64be557 425 writeArrayN(0, _height-1);
Yajirushi 0:8512c64be557 426 }
Yajirushi 0:8512c64be557 427
Yajirushi 0:8512c64be557 428 //表示データ書き込み(内部配列を使用しない) ==========================
Yajirushi 0:8512c64be557 429 //@1行書き込み(内部配列を使用しない)
Yajirushi 0:8512c64be557 430 void SHMLCD_J::write1(unsigned char ln, const char *data){
Yajirushi 0:8512c64be557 431 //データのサイズが_bytesに満たない場合は何もしない
Yajirushi 0:8512c64be557 432 if((sizeof(data) / sizeof(data[0])) < _bytes) return;
Yajirushi 0:8512c64be557 433
Yajirushi 0:8512c64be557 434 //ln = 行番号 0から_height-1まで
Yajirushi 0:8512c64be557 435 ln = (ln >= _height)? _height-1 : ln;
Yajirushi 0:8512c64be557 436
Yajirushi 0:8512c64be557 437 //コマンド送出フラグ
Yajirushi 0:8512c64be557 438 busySPI = true;
Yajirushi 0:8512c64be557 439
Yajirushi 0:8512c64be557 440 CS_HIGH;
Yajirushi 0:8512c64be557 441 WAIT_1US;
Yajirushi 0:8512c64be557 442
Yajirushi 0:8512c64be557 443 send_mode(SHMLCD_J_WRITE | ((comFlag)? SHMLCD_J_COM : SHMLCD_J_DUMMY)); //モード決定
Yajirushi 0:8512c64be557 444 send_addr(ln+1); //ゲートライン(行番号 1から_heightまで)選択
Yajirushi 0:8512c64be557 445
Yajirushi 0:8512c64be557 446 //1行分のデータ連続書き込み
Yajirushi 0:8512c64be557 447 for(short i=0; i<_bytes; i++){
Yajirushi 0:8512c64be557 448 send_data(data[i]);
Yajirushi 0:8512c64be557 449 }
Yajirushi 0:8512c64be557 450
Yajirushi 0:8512c64be557 451 //転送待ち(16clockダミーを送る)
Yajirushi 0:8512c64be557 452 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 453 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 454
Yajirushi 0:8512c64be557 455 WAIT_3US;
Yajirushi 0:8512c64be557 456 CS_LOW;
Yajirushi 0:8512c64be557 457 WAIT_1US;
Yajirushi 0:8512c64be557 458
Yajirushi 0:8512c64be557 459 //コマンド送出フラグ
Yajirushi 0:8512c64be557 460 busySPI = false;
Yajirushi 0:8512c64be557 461
Yajirushi 0:8512c64be557 462 }
Yajirushi 0:8512c64be557 463 //@複数行書き込み(内部配列を使用しない)
Yajirushi 0:8512c64be557 464 void SHMLCD_J::writeN(unsigned char sn, unsigned char en, const char *data){
Yajirushi 0:8512c64be557 465 //sn = 開始行, en = 終了行
Yajirushi 0:8512c64be557 466 sn = (sn >= _height)? _height-1 : sn;
Yajirushi 0:8512c64be557 467 en = (en >= _height)? _height-1 : en;
Yajirushi 0:8512c64be557 468
Yajirushi 0:8512c64be557 469 //snとenが一緒:1行だけ書き込み
Yajirushi 0:8512c64be557 470 if(sn == en){
Yajirushi 0:8512c64be557 471 write1(sn, data);
Yajirushi 0:8512c64be557 472 return;
Yajirushi 0:8512c64be557 473 }
Yajirushi 0:8512c64be557 474
Yajirushi 0:8512c64be557 475 //snとenが逆:ひっくり返す
Yajirushi 0:8512c64be557 476 if(sn > en){
Yajirushi 0:8512c64be557 477 sn ^= en;
Yajirushi 0:8512c64be557 478 en ^= sn;
Yajirushi 0:8512c64be557 479 sn ^= en;
Yajirushi 0:8512c64be557 480 }
Yajirushi 0:8512c64be557 481
Yajirushi 0:8512c64be557 482 //dataのサイズ確認
Yajirushi 0:8512c64be557 483 unsigned short rows = en - sn + 1;
Yajirushi 0:8512c64be557 484 unsigned short len = rows * _bytes;
Yajirushi 0:8512c64be557 485 if((sizeof(data) / sizeof(data[0])) < len) return;
Yajirushi 0:8512c64be557 486
Yajirushi 0:8512c64be557 487 //コマンド送出フラグ
Yajirushi 0:8512c64be557 488 busySPI = true;
Yajirushi 0:8512c64be557 489
Yajirushi 0:8512c64be557 490 CS_HIGH;
Yajirushi 0:8512c64be557 491 WAIT_1US;
Yajirushi 0:8512c64be557 492
Yajirushi 0:8512c64be557 493 send_mode(SHMLCD_J_WRITE | ((comFlag)? SHMLCD_J_COM : SHMLCD_J_DUMMY)); //モード決定
Yajirushi 0:8512c64be557 494
Yajirushi 0:8512c64be557 495 //データ連続書き込み
Yajirushi 0:8512c64be557 496 sn++; //0スタートを1スタートに
Yajirushi 0:8512c64be557 497 en++; //0スタートを1スタートに
Yajirushi 0:8512c64be557 498 for(short i=0, j, k; i<rows; i++){
Yajirushi 0:8512c64be557 499 send_addr(sn + i); //ゲートライン(行番号 1から_heightまで)選択
Yajirushi 0:8512c64be557 500 //1行分のデータ連続書き込み
Yajirushi 0:8512c64be557 501 for(j=0, k=i*_bytes; j<_bytes; j++){
Yajirushi 0:8512c64be557 502 send_data(data[j+k]);
Yajirushi 0:8512c64be557 503 }
Yajirushi 0:8512c64be557 504 //転送待ち(8clockダミーを送る)
Yajirushi 0:8512c64be557 505 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 506 }
Yajirushi 0:8512c64be557 507 //転送待ち(8clockダミーを送る)
Yajirushi 0:8512c64be557 508 send_data(SHMLCD_J_DUMMY);
Yajirushi 0:8512c64be557 509
Yajirushi 0:8512c64be557 510 WAIT_3US;
Yajirushi 0:8512c64be557 511 CS_LOW;
Yajirushi 0:8512c64be557 512 WAIT_1US;
Yajirushi 0:8512c64be557 513
Yajirushi 0:8512c64be557 514 //コマンド送出フラグ
Yajirushi 0:8512c64be557 515 busySPI = false;
Yajirushi 0:8512c64be557 516 }
Yajirushi 0:8512c64be557 517 //@全部書き込み(内部配列を使用しない)
Yajirushi 0:8512c64be557 518 void SHMLCD_J::writeA(const char *data){
Yajirushi 0:8512c64be557 519 writeN(0, _height-1, data);
Yajirushi 0:8512c64be557 520 }
Yajirushi 0:8512c64be557 521
Yajirushi 0:8512c64be557 522 //図形描画 ==========================================================
Yajirushi 0:8512c64be557 523 //@打点(1ピクセルのドットを打つ)
Yajirushi 0:8512c64be557 524 void SHMLCD_J::pixel(unsigned short x, unsigned short y, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 525 if(x >= _width || y >= _height) return;
Yajirushi 0:8512c64be557 526
Yajirushi 0:8512c64be557 527 short idx = (_bytes * y) + (x >> 3); //内部配列の場所を特定
Yajirushi 0:8512c64be557 528 char bitidx = 7 - x % 8; //ビットの位置を特定
Yajirushi 0:8512c64be557 529
Yajirushi 0:8512c64be557 530 //内部配列更新
Yajirushi 0:8512c64be557 531 switch(mode){
Yajirushi 0:8512c64be557 532 case SHMLCD_J_BLACK: //打点(0)
Yajirushi 0:8512c64be557 533 R[idx] &= ~(1<<bitidx);
Yajirushi 0:8512c64be557 534 break;
Yajirushi 0:8512c64be557 535 case SHMLCD_J_ERASE: //消去(1)
Yajirushi 0:8512c64be557 536 R[idx] |= 1<<bitidx;
Yajirushi 0:8512c64be557 537 break;
Yajirushi 0:8512c64be557 538 case SHMLCD_J_INVERT: //反転(-1)
Yajirushi 0:8512c64be557 539 R[idx] ^= 1<<bitidx;
Yajirushi 0:8512c64be557 540 break;
Yajirushi 0:8512c64be557 541 }
Yajirushi 0:8512c64be557 542
Yajirushi 0:8512c64be557 543 //即時表示の場合は書き込み
Yajirushi 0:8512c64be557 544 if(immidiate) writeArray1(y);
Yajirushi 0:8512c64be557 545 }
Yajirushi 0:8512c64be557 546 //@線を描画
Yajirushi 0:8512c64be557 547 void SHMLCD_J::drawLine(unsigned short fromX, unsigned short fromY, unsigned short toX, unsigned short toY, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 548 if(fromX>=_width || toX>=_width || fromY>=_height || toY>=_height) return;
Yajirushi 0:8512c64be557 549
Yajirushi 0:8512c64be557 550 short dx = toX - fromX;
Yajirushi 0:8512c64be557 551 short dy = toY - fromY;
Yajirushi 0:8512c64be557 552 dx = (dx < 0)? dx * -1 : dx;
Yajirushi 0:8512c64be557 553 dy = (dy < 0)? dy * -1 : dy;
Yajirushi 0:8512c64be557 554
Yajirushi 0:8512c64be557 555 //垂直線
Yajirushi 0:8512c64be557 556 if(dx == 0){
Yajirushi 0:8512c64be557 557 if(fromY > toY){fromY ^= toY; toY ^= fromY; fromY ^= toY;}//swap
Yajirushi 0:8512c64be557 558
Yajirushi 0:8512c64be557 559 short idx = (_bytes * fromY) + (fromX >> 3); //内部配列の場所を特定
Yajirushi 0:8512c64be557 560 char bitidx = 7 - fromX % 8; //ビットの位置を特定
Yajirushi 0:8512c64be557 561
Yajirushi 0:8512c64be557 562 //内部配列更新
Yajirushi 0:8512c64be557 563 char bits = 0;
Yajirushi 0:8512c64be557 564 switch(mode){
Yajirushi 0:8512c64be557 565 case SHMLCD_J_BLACK: //打点(0)
Yajirushi 0:8512c64be557 566 bits = ~(1<<bitidx);
Yajirushi 0:8512c64be557 567 for(; fromY<=toY; fromY++, idx+=_bytes) R[idx] &= bits;
Yajirushi 0:8512c64be557 568 break;
Yajirushi 0:8512c64be557 569 case SHMLCD_J_ERASE: //消去(1)
Yajirushi 0:8512c64be557 570 bits = 1<<bitidx;
Yajirushi 0:8512c64be557 571 for(; fromY<=toY; fromY++, idx+=_bytes) R[idx] |= bits;
Yajirushi 0:8512c64be557 572 break;
Yajirushi 0:8512c64be557 573 case SHMLCD_J_INVERT: //反転(-1)
Yajirushi 0:8512c64be557 574 bits = 1<<bitidx;
Yajirushi 0:8512c64be557 575 for(; fromY<=toY; fromY++, idx+=_bytes) R[idx] ^= bits;
Yajirushi 0:8512c64be557 576 break;
Yajirushi 0:8512c64be557 577 }
Yajirushi 0:8512c64be557 578
Yajirushi 0:8512c64be557 579 //即時更新の場合はすぐに表示
Yajirushi 0:8512c64be557 580 if(immidiate) writeArrayN(toY - dy, toY); //fromY + 1, toY + 1
Yajirushi 0:8512c64be557 581
Yajirushi 0:8512c64be557 582 return;
Yajirushi 0:8512c64be557 583 }
Yajirushi 0:8512c64be557 584
Yajirushi 0:8512c64be557 585 //水平線
Yajirushi 0:8512c64be557 586 if(dy == 0){
Yajirushi 0:8512c64be557 587 if(fromX > toX){fromX ^= toX; toX ^= fromX; fromX ^= toX;}//swap
Yajirushi 0:8512c64be557 588
Yajirushi 0:8512c64be557 589 short idx = (_bytes * fromY) + (fromX >> 3); //内部配列の場所を特定
Yajirushi 0:8512c64be557 590
Yajirushi 0:8512c64be557 591 //ビットマスク作成のためのシフト量とビット位置を算出
Yajirushi 0:8512c64be557 592 char stbitRef = fromX % 8;
Yajirushi 0:8512c64be557 593 char stbitIdx = 7 - stbitRef;
Yajirushi 0:8512c64be557 594 char enbitIdx = toX % 8;
Yajirushi 0:8512c64be557 595 char enbitRef = 7 - enbitIdx;
Yajirushi 0:8512c64be557 596
Yajirushi 0:8512c64be557 597 //ビットマスク作成
Yajirushi 0:8512c64be557 598 unsigned char stbits = ((0xFF << stbitRef) & 0xFF) >> stbitRef; //演算はintで実施される
Yajirushi 0:8512c64be557 599 unsigned char enbits = (0xFF >> enbitRef) << enbitRef;
Yajirushi 0:8512c64be557 600
Yajirushi 0:8512c64be557 601 //塗りつぶす領域が同じ領域内の場合
Yajirushi 0:8512c64be557 602 if((fromX >> 3) == (toX >> 3)){
Yajirushi 0:8512c64be557 603 //内部配列更新
Yajirushi 0:8512c64be557 604 switch(mode){
Yajirushi 0:8512c64be557 605 case SHMLCD_J_BLACK: //打点(0)
Yajirushi 0:8512c64be557 606 R[idx] &= ~(stbits & enbits);
Yajirushi 0:8512c64be557 607 break;
Yajirushi 0:8512c64be557 608 case SHMLCD_J_ERASE: //消去(1)
Yajirushi 0:8512c64be557 609 R[idx] |= (stbits & enbits);
Yajirushi 0:8512c64be557 610 break;
Yajirushi 0:8512c64be557 611 case SHMLCD_J_INVERT: //反転(-1)
Yajirushi 0:8512c64be557 612 R[idx] ^= (stbits & enbits);
Yajirushi 0:8512c64be557 613 break;
Yajirushi 0:8512c64be557 614 }
Yajirushi 0:8512c64be557 615 }else{
Yajirushi 0:8512c64be557 616 //8bit全埋めマスの個数
Yajirushi 0:8512c64be557 617 char count8 = (dx - (stbitIdx + enbitIdx)) >> 3;
Yajirushi 0:8512c64be557 618
Yajirushi 0:8512c64be557 619 //内部配列更新
Yajirushi 0:8512c64be557 620 switch(mode){
Yajirushi 0:8512c64be557 621 case SHMLCD_J_BLACK: //打点(0)
Yajirushi 0:8512c64be557 622 R[idx] &= ~stbits;
Yajirushi 0:8512c64be557 623 for(idx++; count8>0; count8--, idx++) R[idx] &= 0x00;
Yajirushi 0:8512c64be557 624 R[idx] &= ~enbits;
Yajirushi 0:8512c64be557 625 break;
Yajirushi 0:8512c64be557 626 case SHMLCD_J_ERASE: //消去(1)
Yajirushi 0:8512c64be557 627 R[idx] |= stbits;
Yajirushi 0:8512c64be557 628 for(idx++; count8>0; count8--, idx++) R[idx] |= 0xFF;
Yajirushi 0:8512c64be557 629 R[idx] |= enbits;
Yajirushi 0:8512c64be557 630 break;
Yajirushi 0:8512c64be557 631 case SHMLCD_J_INVERT: //反転(-1)
Yajirushi 0:8512c64be557 632 R[idx] ^= stbits;
Yajirushi 0:8512c64be557 633 for(idx++; count8>0; count8--, idx++) R[idx] ^= 0xFF;
Yajirushi 0:8512c64be557 634 R[idx] ^= enbits;
Yajirushi 0:8512c64be557 635 break;
Yajirushi 0:8512c64be557 636 }
Yajirushi 0:8512c64be557 637 }
Yajirushi 0:8512c64be557 638
Yajirushi 0:8512c64be557 639 //即時更新の場合はすぐに表示
Yajirushi 0:8512c64be557 640 if(immidiate) writeArray1(fromY);
Yajirushi 0:8512c64be557 641
Yajirushi 0:8512c64be557 642 return;
Yajirushi 0:8512c64be557 643 }
Yajirushi 0:8512c64be557 644
Yajirushi 0:8512c64be557 645 //傾きのある直線描画:ブレゼンハムのアルゴリズム(Bresenham's line algorithm)
Yajirushi 0:8512c64be557 646 short sx = (fromX < toX)? 1:-1, sy = (fromY < toY)? 1:-1;
Yajirushi 0:8512c64be557 647 short err = dx - dy;
Yajirushi 0:8512c64be557 648 short e2;
Yajirushi 0:8512c64be557 649
Yajirushi 0:8512c64be557 650 for(;;){
Yajirushi 0:8512c64be557 651 pixel(fromX, fromY, mode, immidiate);
Yajirushi 0:8512c64be557 652 if((fromX == toX) && (fromY == toY)) break;
Yajirushi 0:8512c64be557 653 e2 = err * 2;
Yajirushi 0:8512c64be557 654 if(e2 > -dy){
Yajirushi 0:8512c64be557 655 err -= dy;
Yajirushi 0:8512c64be557 656 fromX += sx;
Yajirushi 0:8512c64be557 657 }
Yajirushi 0:8512c64be557 658 if(e2 < dx){
Yajirushi 0:8512c64be557 659 err += dx;
Yajirushi 0:8512c64be557 660 fromY += sy;
Yajirushi 0:8512c64be557 661 }
Yajirushi 0:8512c64be557 662 }
Yajirushi 0:8512c64be557 663
Yajirushi 0:8512c64be557 664 }
Yajirushi 0:8512c64be557 665 //@四角形を描画
Yajirushi 0:8512c64be557 666 void SHMLCD_J::drawRect(unsigned short left, unsigned short top, unsigned short width, unsigned short height, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 667 if(left>_width || top>_height || width<2 || height<2) return;
Yajirushi 0:8512c64be557 668
Yajirushi 0:8512c64be557 669 int toX = left + width;
Yajirushi 0:8512c64be557 670 int toY = top + height;
Yajirushi 0:8512c64be557 671
Yajirushi 0:8512c64be557 672 if(toX>=_width) toX = _width-1;
Yajirushi 0:8512c64be557 673 if(toY>=_height) toY = _height-1;
Yajirushi 0:8512c64be557 674
Yajirushi 0:8512c64be557 675 drawLine(left, top, left, toY, mode, immidiate);
Yajirushi 0:8512c64be557 676 drawLine(left, top, toX, top, mode, immidiate);
Yajirushi 0:8512c64be557 677 drawLine(left, toY, toX, toY, mode, immidiate);
Yajirushi 0:8512c64be557 678 drawLine(toX, top, toX, toY, mode, immidiate);
Yajirushi 0:8512c64be557 679 }
Yajirushi 0:8512c64be557 680 //@対角点指定(左上、右下)での四角形の描画
Yajirushi 0:8512c64be557 681 void SHMLCD_J::drawRect2(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 682 if(x1>=_width || y1>=_height || x2>=_width || y2>=_height) return;
Yajirushi 0:8512c64be557 683
Yajirushi 0:8512c64be557 684 if(x1>x2){x1^=x2;x2^=x1;x1^=x2;} //swap
Yajirushi 0:8512c64be557 685 if(y1>y2){y1^=y2;y2^=y1;y1^=y2;} //swap
Yajirushi 0:8512c64be557 686
Yajirushi 0:8512c64be557 687 if((x2-x1) < 1 || (y2-y1) < 1) return;
Yajirushi 0:8512c64be557 688
Yajirushi 0:8512c64be557 689 drawLine(x1, y1, x1, y2, mode, immidiate);
Yajirushi 0:8512c64be557 690 drawLine(x1, y1, x2, y1, mode, immidiate);
Yajirushi 0:8512c64be557 691 drawLine(x1, y2, x2, y2, mode, immidiate);
Yajirushi 0:8512c64be557 692 drawLine(x2, y1, x2, y2, mode, immidiate);
Yajirushi 0:8512c64be557 693 }
Yajirushi 0:8512c64be557 694 //@塗りつぶされた四角形を描画
Yajirushi 0:8512c64be557 695 void SHMLCD_J::fillRect(unsigned short left, unsigned short top, unsigned short width, unsigned short height, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 696 if(left>_width || top>_height || width<2 || height<2) return;
Yajirushi 0:8512c64be557 697
Yajirushi 0:8512c64be557 698 int toX = left + width;
Yajirushi 0:8512c64be557 699 int toY = top + height;
Yajirushi 0:8512c64be557 700
Yajirushi 0:8512c64be557 701 if(toX>=_width) toX = _width-1;
Yajirushi 0:8512c64be557 702 if(toY>=_height) toY = _height-1;
Yajirushi 0:8512c64be557 703
Yajirushi 0:8512c64be557 704 //水平線を高さ分書き込む
Yajirushi 0:8512c64be557 705 for(; top<=toY; top++) drawLine(left, top, toX, top, mode, immidiate);
Yajirushi 0:8512c64be557 706 }
Yajirushi 0:8512c64be557 707 //@対角点指定(左上、右下)での塗りつぶされた四角形を描画
Yajirushi 0:8512c64be557 708 void SHMLCD_J::fill2Point(unsigned short x1, unsigned short y1, unsigned short x2, unsigned short y2, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 709 if(x1>=_width || y1>=_height || x2>=_width || y2>=_height) return;
Yajirushi 0:8512c64be557 710
Yajirushi 0:8512c64be557 711 if(x1>x2){x1^=x2;x2^=x1;x1^=x2;} //swap
Yajirushi 0:8512c64be557 712 if(y1>y2){y1^=y2;y2^=y1;y1^=y2;} //swap
Yajirushi 0:8512c64be557 713
Yajirushi 0:8512c64be557 714 if((x2-x1) < 1 || (y2-y1) < 1) return;
Yajirushi 0:8512c64be557 715
Yajirushi 0:8512c64be557 716 //水平線を高さ分書き込む
Yajirushi 0:8512c64be557 717 for(; y1<=y2; y1++) drawLine(x1, y1, x2, y1, mode, immidiate);
Yajirushi 0:8512c64be557 718 }
Yajirushi 0:8512c64be557 719 //@円の描画
Yajirushi 0:8512c64be557 720 void SHMLCD_J::drawCircle(unsigned short centerX, unsigned short centerY, unsigned short r, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 721 if(centerX>=_width || centerY>=_height || r<1) return;
Yajirushi 0:8512c64be557 722
Yajirushi 0:8512c64be557 723 //中間点円弧描画アルゴリズム(Bresenham's Midpoint circle algorithm)
Yajirushi 0:8512c64be557 724 int cx=r, cy=0, err=1-cx;
Yajirushi 0:8512c64be557 725 while(cx>=cy){
Yajirushi 0:8512c64be557 726 pixel(centerX+cy, centerY-cx, mode, immidiate); //0:12時から45° 時計回り
Yajirushi 0:8512c64be557 727 pixel(centerX+cx, centerY-cy, mode, immidiate); //1:3時から45° 反時計回り
Yajirushi 0:8512c64be557 728 pixel(centerX+cx, centerY+cy, mode, immidiate); //2:3時から45° 時計回り
Yajirushi 0:8512c64be557 729 pixel(centerX+cy, centerY+cx, mode, immidiate); //3:6時から45° 反時計回り
Yajirushi 0:8512c64be557 730 pixel(centerX-cy, centerY+cx, mode, immidiate); //4:6時から45° 時計回り
Yajirushi 0:8512c64be557 731 pixel(centerX-cx, centerY+cy, mode, immidiate); //5:9時から45° 反時計回り
Yajirushi 0:8512c64be557 732 pixel(centerX-cx, centerY-cy, mode, immidiate); //6:9時から45° 時計回り
Yajirushi 0:8512c64be557 733 pixel(centerX-cy, centerY-cx, mode, immidiate); //7:12時から45° 反時計回り
Yajirushi 0:8512c64be557 734 cy++;
Yajirushi 0:8512c64be557 735 if(err<0) err += cy*2 + 1;
Yajirushi 0:8512c64be557 736 else err += 2*(cy - --cx + 1);
Yajirushi 0:8512c64be557 737 }
Yajirushi 0:8512c64be557 738 }
Yajirushi 0:8512c64be557 739 //@塗りつぶされた円の描画
Yajirushi 0:8512c64be557 740 void SHMLCD_J::fillCircle(unsigned short centerX, unsigned short centerY, unsigned short r, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 741 if(centerX>=_width || centerY>=_height || r<1) return;
Yajirushi 0:8512c64be557 742
Yajirushi 0:8512c64be557 743 //中間点円弧描画アルゴリズム(Bresenham's Midpoint circle algorithm)
Yajirushi 0:8512c64be557 744 int cx=r, cy=0, err=1-cx;
Yajirushi 0:8512c64be557 745 while(cx>=cy){
Yajirushi 0:8512c64be557 746 fill2Point(centerX-cy, centerY-cx, centerX+cy, centerY+cx, mode, immidiate);
Yajirushi 0:8512c64be557 747 fill2Point(centerX-cx, centerY-cy, centerX+cx, centerY+cy, mode, immidiate);
Yajirushi 0:8512c64be557 748 cy++;
Yajirushi 0:8512c64be557 749 if(err<0) err += cy*2 + 1;
Yajirushi 0:8512c64be557 750 else err += 2*(cy - --cx + 1);
Yajirushi 0:8512c64be557 751 }
Yajirushi 0:8512c64be557 752 }
Yajirushi 0:8512c64be557 753
Yajirushi 0:8512c64be557 754 //文字の描画 ========================================================
Yajirushi 0:8512c64be557 755 //@一文字を描画
Yajirushi 0:8512c64be557 756 signed char SHMLCD_J::drawChar(const char *s, unsigned short x, unsigned short y, unsigned char zoom, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 757 if(x>=_width || y>=_height) return -1;
Yajirushi 0:8512c64be557 758
Yajirushi 0:8512c64be557 759 //戻り値と検出インデックス
Yajirushi 0:8512c64be557 760 char ret = 0;
Yajirushi 0:8512c64be557 761 unsigned short cidx = 0;
Yajirushi 0:8512c64be557 762
Yajirushi 0:8512c64be557 763 //UTF-8 謎の符号反転への対策
Yajirushi 0:8512c64be557 764 char one = *s & 0xFF;
Yajirushi 0:8512c64be557 765
Yajirushi 0:8512c64be557 766 #ifndef MP12_USE_ZENKAKU //全角文字を使用しない場合
Yajirushi 0:8512c64be557 767 //フォントのコードの数だけ繰り返す
Yajirushi 0:8512c64be557 768 for(; cidx<MPF12_TOTAL_CHARS; cidx++){
Yajirushi 0:8512c64be557 769 //文字コードが合致するものを探す
Yajirushi 0:8512c64be557 770 if(one == fMPF12[cidx].idx){
Yajirushi 0:8512c64be557 771 ret = 1;
Yajirushi 0:8512c64be557 772 break;
Yajirushi 0:8512c64be557 773 }
Yajirushi 0:8512c64be557 774 }
Yajirushi 0:8512c64be557 775 #else //全角文字を使用する場合
Yajirushi 0:8512c64be557 776 if(one<0x20 || one>0x7F){
Yajirushi 0:8512c64be557 777 //環境依存文字を含まない0x20-0x7Fの領域の外側 = マルチバイト文字の可能性
Yajirushi 0:8512c64be557 778 for(; cidx<MPJ12R_TOTAL_CHARS; cidx++){
Yajirushi 0:8512c64be557 779 #if defined MP12_USE_TABLE_UTF8
Yajirushi 0:8512c64be557 780 if(memcmp(s, &fMPJ12R[cidx].idx[2], 3) == 0){
Yajirushi 0:8512c64be557 781 ret = 3;
Yajirushi 0:8512c64be557 782 break;
Yajirushi 0:8512c64be557 783 }
Yajirushi 0:8512c64be557 784 #elif defined MP12_USE_TABLE_SJIS
Yajirushi 0:8512c64be557 785 if(memcmp(s, &fMPJ12R[cidx].idx[0], 2) == 0){
Yajirushi 0:8512c64be557 786 ret = 2;
Yajirushi 0:8512c64be557 787 break;
Yajirushi 0:8512c64be557 788 }
Yajirushi 0:8512c64be557 789 #endif
Yajirushi 0:8512c64be557 790 }
Yajirushi 0:8512c64be557 791 }
Yajirushi 0:8512c64be557 792
Yajirushi 0:8512c64be557 793 //全角文字を探しても見つからなかった場合、半角文字から検索
Yajirushi 0:8512c64be557 794 if(ret == 0){
Yajirushi 0:8512c64be557 795 for(cidx = 0; cidx<MPF12_TOTAL_CHARS; cidx++){
Yajirushi 0:8512c64be557 796 //文字コードが合致するものを探す
Yajirushi 0:8512c64be557 797 if(one == fMPF12[cidx].idx){
Yajirushi 0:8512c64be557 798 ret = 1;
Yajirushi 0:8512c64be557 799 break;
Yajirushi 0:8512c64be557 800 }
Yajirushi 0:8512c64be557 801 }
Yajirushi 0:8512c64be557 802 }
Yajirushi 0:8512c64be557 803 #endif
Yajirushi 0:8512c64be557 804
Yajirushi 0:8512c64be557 805 //文字が見つからなかった ret = 0
Yajirushi 0:8512c64be557 806 if(ret == 0) return ret;
Yajirushi 0:8512c64be557 807
Yajirushi 0:8512c64be557 808 //描画処理
Yajirushi 0:8512c64be557 809 if(zoom>1){
Yajirushi 0:8512c64be557 810 //倍角処理
Yajirushi 0:8512c64be557 811 short z1 = zoom - 1;
Yajirushi 0:8512c64be557 812 switch(ret){
Yajirushi 0:8512c64be557 813 case 1: //半角文字の描画
Yajirushi 0:8512c64be557 814 for(unsigned char hi=0; hi<MP12_SIZE_H; hi++){
Yajirushi 0:8512c64be557 815 char g_cpy = fMPF12[cidx].g[hi];
Yajirushi 0:8512c64be557 816 if(g_cpy == 0) continue;
Yajirushi 0:8512c64be557 817 for(char wi=0; wi<MP12_SIZE_W_HALF; wi++){
Yajirushi 0:8512c64be557 818 if(g_cpy<<wi & 0x80){
Yajirushi 0:8512c64be557 819 short gx = x+wi*zoom, gy = y+hi*zoom;
Yajirushi 0:8512c64be557 820 fill2Point(gx, gy, gx+z1, gy+z1, mode, immidiate);
Yajirushi 0:8512c64be557 821 }
Yajirushi 0:8512c64be557 822 }
Yajirushi 0:8512c64be557 823 }
Yajirushi 0:8512c64be557 824 break;
Yajirushi 0:8512c64be557 825 case 2: //全角文字の描画
Yajirushi 0:8512c64be557 826 case 3:
Yajirushi 0:8512c64be557 827 unsigned short g_cpy = 0;
Yajirushi 0:8512c64be557 828 for(unsigned char hi=0; hi<MP12_SIZE_H; hi++){
Yajirushi 0:8512c64be557 829 g_cpy = fMPJ12R[cidx].g[hi<<1] << 8 | fMPJ12R[cidx].g[(hi<<1)+1];
Yajirushi 0:8512c64be557 830 if(g_cpy == 0) continue;
Yajirushi 0:8512c64be557 831 for(char wi=0; wi<MP12_SIZE_W; wi++){
Yajirushi 0:8512c64be557 832 if(g_cpy<<wi & 0x8000){
Yajirushi 0:8512c64be557 833 short gx = x+wi*zoom, gy = y+hi*zoom;
Yajirushi 0:8512c64be557 834 fill2Point(gx, gy, gx+z1, gy+z1, mode, immidiate);
Yajirushi 0:8512c64be557 835 }
Yajirushi 0:8512c64be557 836 }
Yajirushi 0:8512c64be557 837 }
Yajirushi 0:8512c64be557 838 break;
Yajirushi 0:8512c64be557 839 }
Yajirushi 0:8512c64be557 840 }else{
Yajirushi 0:8512c64be557 841 switch(ret){
Yajirushi 0:8512c64be557 842 case 1: //半角文字の描画
Yajirushi 0:8512c64be557 843 for(unsigned char hi=0; hi<MP12_SIZE_H; hi++){
Yajirushi 0:8512c64be557 844 char g_cpy = fMPF12[cidx].g[hi];
Yajirushi 0:8512c64be557 845 if(g_cpy == 0) continue;
Yajirushi 0:8512c64be557 846 for(char wi=0; wi<MP12_SIZE_W_HALF; wi++){
Yajirushi 0:8512c64be557 847 if(g_cpy<<wi & 0x80){
Yajirushi 0:8512c64be557 848 pixel(x+wi, y+hi, mode, immidiate);
Yajirushi 0:8512c64be557 849 }
Yajirushi 0:8512c64be557 850 }
Yajirushi 0:8512c64be557 851 }
Yajirushi 0:8512c64be557 852 break;
Yajirushi 0:8512c64be557 853 case 2: //全角文字の描画
Yajirushi 0:8512c64be557 854 case 3:
Yajirushi 0:8512c64be557 855 unsigned short g_cpy = 0;
Yajirushi 0:8512c64be557 856 for(unsigned char hi=0; hi<MP12_SIZE_H; hi++){
Yajirushi 0:8512c64be557 857 g_cpy = fMPJ12R[cidx].g[hi<<1] << 8 | fMPJ12R[cidx].g[(hi<<1)+1];
Yajirushi 0:8512c64be557 858 if(g_cpy == 0) continue;
Yajirushi 0:8512c64be557 859 for(char wi=0; wi<MP12_SIZE_W; wi++){
Yajirushi 0:8512c64be557 860 if(g_cpy<<wi & 0x8000){
Yajirushi 0:8512c64be557 861 pixel(x+wi, y+hi, mode, immidiate);
Yajirushi 0:8512c64be557 862 }
Yajirushi 0:8512c64be557 863 }
Yajirushi 0:8512c64be557 864 }
Yajirushi 0:8512c64be557 865 break;
Yajirushi 0:8512c64be557 866 }
Yajirushi 0:8512c64be557 867 }
Yajirushi 0:8512c64be557 868
Yajirushi 0:8512c64be557 869 return ret;
Yajirushi 0:8512c64be557 870 }
Yajirushi 0:8512c64be557 871 //@倍角指定ありで文字列を描画
Yajirushi 0:8512c64be557 872 signed char SHMLCD_J::writeString(const char *str, unsigned short x, unsigned short y, unsigned char zoom, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 873 if(x>=_width || y>=_height || zoom<1) return -1;
Yajirushi 0:8512c64be557 874
Yajirushi 0:8512c64be557 875 unsigned short org_x = x;
Yajirushi 0:8512c64be557 876
Yajirushi 0:8512c64be557 877 while(*str){
Yajirushi 0:8512c64be557 878 //改行処理(\n)
Yajirushi 0:8512c64be557 879 if(*str == 0x0A){
Yajirushi 0:8512c64be557 880 x = org_x;
Yajirushi 0:8512c64be557 881 y += MP12_SIZE_H * zoom;
Yajirushi 0:8512c64be557 882 str++;
Yajirushi 0:8512c64be557 883 continue;
Yajirushi 0:8512c64be557 884 }
Yajirushi 0:8512c64be557 885 //文字を描画、バイト数を返す
Yajirushi 0:8512c64be557 886 char charWide = drawChar(str, x, y, zoom, mode, immidiate);
Yajirushi 0:8512c64be557 887 //バイト数の分だけポインタを進める(半角=1, UTF-8=3, それ以外=2)
Yajirushi 0:8512c64be557 888 str += (charWide<2)? 1 : charWide;
Yajirushi 0:8512c64be557 889 x += ((charWide<2)? MP12_SIZE_W_HALF : MP12_SIZE_W) * zoom;
Yajirushi 0:8512c64be557 890 }
Yajirushi 0:8512c64be557 891
Yajirushi 0:8512c64be557 892 return 1;
Yajirushi 0:8512c64be557 893 }
Yajirushi 0:8512c64be557 894 //@倍角指定なしで文字列を描画
Yajirushi 0:8512c64be557 895 signed char SHMLCD_J::writeString(const char *str, unsigned short x, unsigned short y, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 896 return writeString(str, x, y, 1, mode, immidiate);
Yajirushi 0:8512c64be557 897 }
Yajirushi 0:8512c64be557 898 //@文字列を描画(上記4つの短縮別名)
Yajirushi 0:8512c64be557 899 signed char SHMLCD_J::ws(const char *str, unsigned short x, unsigned short y, unsigned char zoom, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 900 return writeString(str, x, y, zoom, mode, immidiate);
Yajirushi 0:8512c64be557 901 }
Yajirushi 0:8512c64be557 902 signed char SHMLCD_J::ws(const char *str, unsigned short x, unsigned short y, signed char mode, bool immidiate){
Yajirushi 0:8512c64be557 903 return writeString(str, x, y, mode, immidiate);
Yajirushi 0:8512c64be557 904 }