記事インデックス

LcdCmdTranceiverクラス

このクラスにはコマンドを送信するtransmit,コマンドを受信するreceive関数があり,これらを使ってLCDを制御します.ここでは,LcdCmdTranceiverクラスにあるメンバ関数を実装していきましょう.

  1. シングルトン関連

    LcdCmdTranceiverクラスはシングルトンになっています.従いまして,コンストラクタ,コピーコンストラクタおよび代入演算子はすべてprivateです.また,staticなgetInstance関数によりシングルトンを取得することができるようにしてあります.以前紹介したこちらを参考に,下記の関数を実装してください
    コンストラクタ,コピーコンストラクタ,代入演算子,デストラクタ,getInstance(後ほど実装する_initialize関数を呼び出すようにしてください)
  2. setInterfaceDataWidth関数

    この関数は送受信を行うデータバスの幅を設定するときに用いられます.仮引数widthを_dataWidthに代入してください.加えて,データバスの幅が変わるので,_initialize関数を呼び出してください.
  3. _changeDataBus関数

    LCDのD0~D7端子と接続されているマイコンの端子は,コマンド送信時には出力端子,受信時には入力端子に設定しなければなりません.この入出力端子に設定する関数が_changeDataBusです.この関数には入出力方向を表すrwと,バス幅を表すwidthの2個の引数があり,rwがWRITEのときには端子を出力,READのときには端子を入力に設定します.また,widthがWIDTH8のときにはD0~D7,WIDTH4のときにはD4~D7と繋がっているマイコンの端子に対して入出力の設定をします.
    下の図に,LCDのD0~D7がマイコンのどの端子に接続されているか示します.この表にもとづき入出力の設定をしてください.
    LCDの端子 マイコンの端子
    D0 ポート4ビット
    D1 ポート4ビット
    D2 ポート4ビット
    D3 ポート4ビット2
    D4 ポート7ビット3
    D5 ポート0ビット7
    D6 ポート0ビット5
    D7 ポート6ビット0

    設定の流れを示したアクティビティ図を下に示しますので参考にしてください.処理の大部分は入出力端子を設定することなので,DDR(データディレクションレジスタ)の修正となります.
     changeDataBus
  4. _initialize関数

    この関数では,LCDが繋がっているマイコンの端子を初期設定します.具体的には,R/W,E,RSを汎用出力端子として,D0~D7端子を_changeDataBus関数により汎用入出力端子として設定します.ただし,出力端子に設定した時点から不定な出力が開始されてしまうため,事前に出力する値を0にした上で出力端子として設定します.
    下にR/W,E,RS端子とそれらがつながっているマイコンの端子の対応表を示します.
     LCDの端子 マイコンの端子 
    R/W  ポート9ビット2 
    ポート9ビット1
    RS  ポート9ビット0

    下の図は_initialize関数をアクティビティ図で表したものです.DR(データレジスタ)により出力を0にしています.
     initialize
  5. _transmitCmd8関数

    LCDへマイコンがデータを送るとき,データバス幅が8である場合に用いるのがこの関数です.下に処理の流れを示します.まず,データバスD0~7を出力端子に設定します.これには,_changeDataBus関数が役立つでしょう.次に,wait関数により1[us]待った後,RSおよびW/R端子を設定します.RS端子からは仮引数rs,W/R端子からは定数WRITEを代入します.再び1[us]待ち,その後E端子からHighを出力します.さらに1[us]待った後,データバスからデータを出力し,その後EからLowを出力します.なぜこのようにEをHighにしてからLowにするかというと,E端子が立ち下がったときにデータバスの状態をキャラクタLCDは取り込む仕様になっているためです.最後に送ったインストラクションが終わるまで待ちます.待ち時間は_transmitCmd8関数の仮引数execute_timeですのでこれをwait関数に渡します.
    以上の処理をプログラミングしてください.
     transmitCmd8

  6. _transmitCmd4関数

    この関数は,_transmitCmd8関数と同様にLCDへマイコンがデータを送るときに用います.ただし,データバス幅が4であるため,1つのインストラクションを上位4ビットと下位4ビットに分けて送信します.また,データバスはD4~7までしか使用しないため,D0~3に繋がっているマイコンの端子には何もしません.下に流れ図を示します.これに従いプログラミングしてください
     transmitCmd4

  7. _receiveCmd8関数

    この関数はデータバス幅8でデータを受信するときに用います.送信するとき用いられる関数_transmitCmd8との違いは,データバスの端子を入力にしW/R端子からREADを出力します.加えて,受信したデータをローカル変数cmdに入れることも異なることとして挙げられます.下の図は関数_receiveCmd8の流れを示したものです.この図にもとづきプログラミングしてください
     receiveCmd8
  8. _receiveCmd4関数

    _receiveCmd4関数はデータバス幅4のときに用いられる関数です.受信にはD4~D7の端子を用い,最初に上位4ビット,その後に下位4ビットを受信します.下図は_receiveCmd4関数のアクティビティ図です.これを参考にプログラムを組んでください
     receiveCmd4

  9. transmit関数

    この関数はpublicな関数になっており,外部から呼び出せるようになっています._transmitCmd8と_transmitCmd4は共にprivateな関数ですので,データ幅により切り分けてそれらの関数をtransmit関数で呼び出します.引数はLcdTransmitCmdクラスとなっておりますので,そのクラスに含まれるシリアルデータ,レジストセレクトおよび実行時間を取得し,_transmitCmd8もしくは_transmitCmd4関数を呼び出します.下図はtransmit関数の流れを表しています.参考にしてプログラミングしてください
    transmit
  10. receive関数

この関数もtransmit関数と同様にpublicな関数であり,外部クラスから呼び出せるようになっています.下にアクティビティ図を示しますので,これもプログラミングしてください
receive

JSN Teki is designed by JoomlaShine.com