クラスの構成

次に,関係するクラスを図によって説明します.まずはインストラクションです.今回使用するLCDには,前節で説明したインストラクションがあり,それぞれをクラスとしモデリングします.下にクラス図を示します.このクラス図は,やや細かくなってしまっていますので,こちらにPDF化したものも置いておきます
LCDCommand上記図について説明します.まず,基底のスーパクラスとなるのがLcdCmdクラスです.このクラスにはインストラクションコードや文字コードを格納するための_cmd,レジスタセレクトがインストラクションもしくはキャラクタのどちらになっているかを示す_registerSelect,インストラクションの実行時間を記憶する_executeTimeなどがフィールドとして存在します.
LcdCmdにはサブクラスとしてLcdTransmitCmdクラスとLcdReceiveCmdクラスがあります.LcdTransmitCmdは,マイコンからLCDへ送信するコマンドのスーパクラスとなっており,LcdReceiveCmdはその反対にマイコンがLCDから受信するクラスのスーパクラスになっています.以下では,それらサブクラスを説明します.

  1. LcdInstruction

    LcdInstructionには8個のサブクラスがあります.これらのサブクラスはRS=0,R/W=0のインストラクションをモデリングしたものです.これらのクラスは,D7からD0に向かって走査していき,はじめて1となったビットの位置で識別できます.このように,はじめて1となるビットのみを取り出した数値を_CODE_IDとして各クラスで定義しています.例えば,表示クリアコマンド(ClearCmd)ではビット0が1でありますので_CODE_IDは0x01,ファンクションセットコマンド(FunctionSetCmd)ではビット5が1となっていますので_CODE_IDは0x20となります.
    各コマンドには最大実行時間が決まっています.例えばエントリモードセットコマンド(EntryModeSetCmd)は,LCDが実行する最大時間は40[us]です.このような時間を_EXECUTE_TIMEとして各クラスでは定義しています.
    以上で説明した,_CODE_IDと_EXECUTE_TIMEを各クラスのコンストラクタで_codeIdと_executeTimeに代入します.
  2. WriteCharacterCmdとReadCharacterCmd

    LcdTransmitCmdのサブクラスには,CGROMにあるパターンを表示するとき,もしくはCGRAMにユーザのオリジナルパターンを設定するときに使うWriteCharacterCmdクラスがあり,LcdReceiveCmdのサブクラスにはCGROMもしくはCGRAMにあるパターンをマイコンが取得するReadCharacterCmdクラスがあります.これらのコマンドはともにRS=1ですので,LCDのインターフェイスを介してデータレジスタとやり取りされます.
  3. ReadBusyFlagCmd

    コマンドには前述のとおり実行時間があります.コマンドを実行したのち,所定の時間以上待てば終了するはずですが,より早く確実に処理の終了をするためにビジーフラグがLCDにあります.このフラグをマイコン側で得るために使うのがReadBusyFlagCmdです.このコマンドでは,アドレスカウンタも同時に得ることができるようになっています.

さて,上記で説明したコマンドクラスを送受信するには,LcdCmdTranceiverクラスにあるtransmitメソッドとreceiveメソッドを用います.transmitメソッドはLcdTransmitCmdのオブジェクトを引数としているため,LcdTransmitCmdをスーパクラスとするクラスのコマンドはすべて引数として渡すことができ,それらのコマンドをLCDに送ることができます.また,receiveメソッドはLcdReceiveCmdのオブジェクトを引数としているため,LcdReceiveCmdをスーパクラスとするクラスのコマンドはすべて引数として渡すことができ,それらのコマンドをLCDから受信することができます.