40文字×4行LCDモジュールを使ってみる(3) 使い方編

今回は、改造したドライバの使い方を説明します。

なお、この記事は、1年ほど前にCQ出版社のブログに掲載したものを再編集したものです。

●概要

使い方といっても、エリアを指定する以外はLiquidCrystalとほとんど同じです。エリアは一度設定すると、次に指定し直すまでは前回の状態が残っているため、同じエリアに続けて表示する場合は、その都度設定する必要はありません。

●LiquidCrystalから変更箇所

変更したところをまとめておきます。

<関数(コンストラクタ)変更>
・LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable,
uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3,
uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);

上記以外のコンストラクタは削除。”rw”はenable1(E1)、”enable”はenable2(E2)として扱っています。

<関数追加>
・void selectArea(byte area); エリア選択

<関数追加(オーバロード)>
・void setCursor(byte row, byte line, byte area); カーソル位置、エリア設定

上記以外の関数はオリジナルのLiquidCrystalと同じです(変更なし)。

●カーソル設定

キャラクタLCDの使い方は、たとえば測定値を決まった位置へ周期的に表示させるなど、局所的に書き換えることが多いと思います。そこでよく使われるのが、カーソル位置を設定するsetCursor()関数です。今回作成したドライバはそれを拡張して、表示エリアを同時に設定することができます。

二つのエリアはそれぞれ40文字×2行の領域になっています。それぞれのエリアの一行目の先頭が(0, 0)、二行目の最後尾が(39, 1)です。その座標を(x, y)とすると、そこにエリア番号aを加えて全体の座標を(x, y, a)と考えます。

lcd404-4

エリア番号aはあらかじめ設定しておくか、座標指定時に同時に指定するかの二通りの方法があります。次のコードはその二通りの設定例ですが、まったく同じ効果があります。

// エリアを最初に指定する方法
lcd.selectArea(0);     // エリア0指定
lcd.setCursor(10, 1);  // カレント・エリアの(10, 1)
lcd.print("test1");
// カーソルと一緒にエリアも指定する方法
lcd.setCursor(10, 1, 0); // エリア0の(10, 1)
lcd.print("test1");

関数”selectArea()”、”setCursor()”の引数で設定するエリア番号は、エリア0が”0″、エリア1が”1″となってます。また、両エリアを同時に指定する場合はエリア番号は”2″にします。

●両エリアの同時操作

両エリアを同時に操作するのは、全面クリアのとき以外あまりないと思いますが、両エリアを選択状態にしてclear()を実行させると、両エリアを同時にクリアできます。エリア番号を”2″とすると両エリアに設定されます。

そのまま文字を表示すると、両エリアに同じ内容が表示されますので、通常はどちらか一方のエリアに再設定してから次の文字を表示するようにしてください。

●サンプルプログラム(HelloWorld.ino)

簡単なサンプル・スケッチのコードを掲載します。ポートの定義は適当に変更してください。連続している必要はありませんが、D0、D1はシリアル通信で使うので、外しておいたほうがよいでしょう。このプログラムは前回配布したZIPファイルの”examples”フォルダに入っています。

配線は下図のようなものを想定しています。

lcd404-5

#include <Lcd404.h>     // ライブラリのリンク

// 接続ポートの定義
#define LCD_D0 2        // D2
#define LCD_D1 3        // D3
#define LCD_D2 4        // D4
#define LCD_D3 5        // D5
#define LCD_D4 6        // D6
#define LCD_D5 7        // D7
#define LCD_D6 8        // D8
#define LCD_D7 9        // D9
#define LCD_E1 10       // D10
#define LCD_E2 11       // D11
#define LCD_RS 12       // D12

// インスタンス作成
LiquidCrystal lcd(LCD_RS, LCD_E1, LCD_E2,
  LCD_D0, LCD_D1, LCD_D2, LCD_D3,LCD_D4, LCD_D5, LCD_D6, LCD_D7);

void setup() {
  lcd.begin(40, 2);     // 省略可能

  lcd.selectArea(2);    // エリア0,1選択
  lcd.clear();          // 画面クリア

  delay(1000);          // 1秒待つ

  lcd.selectArea(0);                    // エリア0選択
  lcd.print("hello, world!(AREA0)");    // エリア0に表示

  lcd.selectArea(1);                    // エリア1選択
  lcd.print("hello, world!(AREA1)");    // エリア1に表示

  lcd.selectArea(2);                    // エリア0,1選択
  lcd.print("  AREA0 & 1");             // エリア0,1に同じ内容を表示

  delay(2000);                          // 2秒待つ

  lcd.selectArea(2);                    // エリア0,1選択
  lcd.clear();                          // 両エリア同時クリア

  lcd.setCursor(0, 0, 0);               // エリア0の(0, 0)
  lcd.print("test1");

  lcd.setCursor(10, 0, 1);              // エリア1の(10, 0)
  lcd.print("test2");

  lcd.setCursor(10, 1, 0);              // エリア0の(10, 1)
  lcd.print("test3");
}

void loop() {
}

●最後に

C-51849NFJ-SLW-ADNは、表示量が多くて使い道がいろいろありそうですが、難点は8ビット・モードしか使えないため、ディジタル・ポートをたくさん消費するということです。特にArduinoはポート数が少ないので、直接駆動する場合は用途が限られてしまいます。

そこで、I2Cで制御できるコントローラをArduinoで作りました。このArduinoはLCD制御専用で、ホストには別のマイコンが必要ですが、2本の信号線で制御可能です。

そのI2C化したLCDについては「汎用キャラクタLCDのI2C化」で説明します。LiquidCrystalと互換性のあるドライバも準備しています。


参考文献
書籍案内 → Arduino実験キットで楽ちんマイコン開発

コメントは受け付けていません。