<前の記事 :
標準ライブイラリのLiquiCrystal
普通のパラレル接続のキャラクタ液晶ディスプレイ(LCD)には標準ライブラリであるLiquidCrystalが用意されており、ソースも公開されている。それほど長くないのでその内容を見てみよう。
ヘッダファイルLiquidCrystal.h
冒頭には多重呼び出し時にエラーにならないための#ifndefが定義されている他に、#include "Print.h"が呼ばれている。以降で作法に基づいて記述できていればlcd.print("ABC")のような使い方もできる。ヘッダファイルの最初の方はパラレル接続でもI2C接続でも共通のHD44780(日立)関連#defineで定数やら定義やらが列挙されている。
コンストラクタ部分は以下のようになっている。ここでPrintを継承?しているのでprint文が使えるようになっているわけだ。
class LiquidCrystal : public Print {
public:
LiquidCrystal(uint8_t rs, 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);
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);
LiquidCrystal(uint8_t rs, uint8_t rw, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
LiquidCrystal(uint8_t rs, uint8_t enable, uint8_t d0, uint8_t d1, uint8_t d2, uint8_t d3);
void init(uint8_t fourbitmode, 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);
4パターンのコンストラクタがあるが、要はRS, RW, ENAの三本の制御線と8ビットのデータバスをどう繋ぐのか決めていて、コンストラクタが呼ばれたあとは共通の初期化ルーチンが呼ばれている。但し、I2C接続の場合はコンストラクタが呼ばれるタイミングでI2C通信Wireの初期化がされてないので、コンストラクタで初期化するのではなく、beginで初期化すべきだ。
beginを見てみると桁数と行数の指定がある他にcharsize指定がある。2行表示ではLCD_5x8DOTS一択だし、1行表示ではLCD_5x10DOTSが妥当なので、第三パラメータは不要かもしれない。
void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS);
この下は制御用の共通関数の宣言が並んでおりI2C接続でも有効だ。
さらにその下のローレベル関数についてはI2C接続用に書き換える必要があるだろう。using Print::write;があるおかげでlcd.print("ABC");のような書き方ができる。
virtual size_t write(uint8_t);
void command(uint8_t);
using Print::write;
スケッチから呼ばれないようなHWに極めて近いprivateの関数や変数が下の方に並んでいる。これらはパラレル接続特有の関数群なのでI2C接続では削除していい。sendは変数_adrsのスコープが合わないらしいのでwriteとcommandにI2C通信を書いた。
private:
void send(uint8_t, uint8_t);
void write4bits(uint8_t);
void write8bits(uint8_t);
void pulseEnable();
以下の変数もパラレル接続特有のものなのでI2C接続では削除していい。
uint8_t _rs_pin; // LOW: command. HIGH: character.
uint8_t _rw_pin; // LOW: write to LCD. HIGH: read from LCD.
uint8_t _enable_pin; // activated by a HIGH pulse.
uint8_t _data_pins[8];
残りの変数はパラレルでもI2Cでも共通だが、initializedのように使われていないものもある。
uint8_t _displayfunction;
uint8_t _displaycontrol;
uint8_t _displaymode;
uint8_t _initialized;
uint8_t _numlines;
uint8_t _row_offsets[4];
オリジナルのライブラリ名は
手持ちのAQM1602XA-RN-GBWだけ動けばいいのでAQM1602というライブラリ名でいいかと思ったら、部品箱の中にAQM0802を見つけてしまった。また秋月にはAQMの名がついたグラフィックディスプレイもある。
オリジナルライブラリの名前はAQMCHARにしておこう。次の記事では具体的なライブラリ化を行う。
<前の記事 :
投稿者の人気記事

-
akira.kei
さんが
前の日曜日の14:13
に
編集
をしました。
(メッセージ: 初版)
-
akira.kei
さんが
前の日曜日の15:10
に
編集
をしました。
ログインしてコメントを投稿する