akira.kei が 2026年06月07日15時10分46秒 に編集
コメント無し
本文の変更
[<前の記事](https://elchika.com/article/fccdb3df-83a3-4238-b65e-d9372451dfe4/) : []() ## 標準ライブイラリのLiquiCrystal 普通のパラレル接続のキャラクタ液晶ディスプレイ(LCD)には標準ライブラリであるLiquidCrystalが用意されており、[ソースも公開](https://github.com/arduino-libraries/LiquidCrystal/tree/master/src)されている。それほど長くないのでその内容を見てみよう。 ## ヘッダファイルLiquidCrystal.h 冒頭には多重呼び出し時にエラーにならないための#ifndefが定義されている他に、```#include "Print.h"```が呼ばれている。以降で作法に基づいて記述できていれば```lcd.print("ABC")```のような使い方もできる。ヘッダファイルの最初の方はパラレル接続でもI2C接続でも共通のHD44780(日立)関連```#define```で定数やら定義やらが列挙されている。
コンストラクタ部分は以下のようになっている。
コンストラクタ部分は以下のようになっている。ここで```Print```を継承?しているので```print```文が使えるようになっているわけだ。 ```Arduino: 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```が妥当なので、第三パラメータは不要かもしれない。 ```Arduino: void begin(uint8_t cols, uint8_t rows, uint8_t charsize = LCD_5x8DOTS); ``` この下は制御用の共通関数の宣言が並んでおりI2C接続でも有効だ。 さらにその下のローレベル関数についてはI2C接続用に書き換える必要があるだろう。```using Print::write;```があるおかげで```lcd.print("ABC");```のような書き方ができる。 ```Arduino: virtual size_t write(uint8_t); void command(uint8_t); using Print::write; ``` スケッチから呼ばれないようなHWに極めて近い```private```の関数や変数が下の方に並んでいる。これらはパラレル接続特有の関数群なのでI2C接続では削除していい。```send```は変数```_adrs```のスコープが合わないらしいので```write```と```command```にI2C通信を書いた。 ```Arduino: private: void send(uint8_t, uint8_t); void write4bits(uint8_t); void write8bits(uint8_t); void pulseEnable(); ``` 以下の変数もパラレル接続特有のものなのでI2C接続では削除していい。 ```Arduino: 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```のように使われていないものもある。 ```Arduino: uint8_t _displayfunction; uint8_t _displaycontrol; uint8_t _displaymode; uint8_t _initialized; uint8_t _numlines; uint8_t _row_offsets[4]; ``` ## オリジナルのライブラリ名は 手持ちの[AQM1602XA-RN-GBW](https://akizukidenshi.com/catalog/g/g108896/)だけ動けばいいので```AQM1602```というライブラリ名でいいかと思ったら、部品箱の中に[AQM0802](https://akizukidenshi.com/catalog/g/g109109/)を見つけてしまった。また秋月にはAQMの名がついた[グラフィックディスプレイ](https://akizukidenshi.com/catalog/g/g110048/)もある。   オリジナルライブラリの名前は```AQMCHAR```にしておこう。次の記事では具体的なライブラリ化を行う。
---
[<前の記事](https://elchika.com/article/fccdb3df-83a3-4238-b65e-d9372451dfe4/) : []()