液晶表示器の使い方


【液晶表示器】

PIC18シリーズに液晶表示器を接続して制御する方法について説明します。

PIC18シリーズ用のC言語コンパイラである、MPLAB-C18には、標準で液晶表示
器の制御用関数があらかじめ用意されています。
但し、この関数は液晶表示器とPICとの接続方法によって、ヘッダーファイルを
書き換えてライブラリ関数を再構成する必要があります。
以下にこの関数を使って液晶表示器を制御する方法を説明します。

【液晶表示器の接続方法】

まず液晶表示器を接続する方法ですが、MPLAB-C18内蔵の液晶表示器制御
用関数は、液晶表示器として、日立製のHD44780という制御用ICを使った表示
器を前提にしています。
このコントローラは現在ではデファクトになっていて、ほとんど大部分の数行の
液晶表示器はこれに準じた内容となっていますので、まずこの内蔵関数を使え
ば大丈夫だと思います。
このコントローラを使った液晶表示器の規格、仕様は下記から入手できます。

  ★ キャラクタ液晶表示器用コントローラの仕様(沖電気)

このコントローラを使った液晶表示器とPICの接続の仕方には下記のような
3種類のいずれかであることが前提となっています。
このいずれの場合もMPLAB-C18のライブラリは対応できるようになっています。

(1) 8ビットパラレル接続
  下図のようにPICと液晶表示器のデータバス部を8ビットで接続する方法です。
  この場合には、制御用の3本の信号(RS、R/W、E)を別のポートから出す
  必要があり、どちらかというと無駄の多い接続方法となります。




(2) PICの上位4ビットパラレル接続
  下図のようにPICのポートの8ビットの内、上位4ビットと液晶表示器の上位
   4ビットをパラレルで接続する方法です。
  この場合には、同じポートの残りの4ビットの内の3ビットを制御用の信号とする
  ことができるので、効率の良い接続とすることが出来ます。
  この接続の場合には、液晶表示器側の下位4ビットはグランドに接続する
  必要があります。





(3) PICの下位4ビットパラレル接続
  下図のようにPICのポートの8ビットの内の下位4ビットと、液晶表示器の
  上位4ビットをパラレル接続する方法です。
  MPLAB-C18コンパイラの標準では、デフォルトはこの接続方法になってい
  ます。
  この場合にも、PICの余った上位4ビットの内の3ビットを制御用信号として
  使うことも出来ます。また、下図のように他のポートの信号を制御用に使う
  ことも出来ます。
  この場合にも液晶表示器の下位4ビットはグランドに接続する必要があり
  ます。







【LCD関数の使い方】

液晶表示器の接続方法が決まったら、LCD制御関数のヘッダーファイルを修正
してモジュール関数ライブラリを再構築します。
再構築の方法は下記の「液晶表示制御関数の再構築の方法」を参照して下さい。

ライブラリで用意されている関数の種類と使い方は次の様にします。
これで全部の関数では無いのですが他の関数は余り使うことは無いでしょう。

(1) OpenXLCD
  LCDを使うことを宣言します。その時に表示器の表示方法も指定します。
  表示方法の指定は下記となっています。

   void OpenXLCD (unsigned char lcdtype);

  lcdtypeは下記で指定
    FOUR_BIT   :4ビットデータインターフェースを指定
               5x10ドットの2行表示がデフォルト
    EIGHT_BIT   :8ビットデータインターフェースを指定
               5x10ドット2行表示がデフォルト
    LINE_5x7   :5x7ドットの1行表示
    LINE_5x10   :5x10ドットの1行表示
    LINES_5x7   :5x7ドットの2行表示

  例  OpenXLCD ( FOUR_BIT );

(2) BusyXLCD
  LCDの内部処理中のビジーチェック関数で、ビジーの時「1」を返す。
  
   unsigned char BusyXLCD (void);

   例  while ( BusyXLCD( ) );

(3) putcXLCD  WriteDataXLCD
  いずれの関数も1文字表示させる関数

   void putcXLCD ( char data );
   void WriteData ( char data );

  dataは8ビットのデータでASCII文字データとします。

  例  WriteData ( 'a' );

(4) WriteCmdXLCD
  LCDに対する制御用コマンドを出力する関数です。
 、ビジーチェックを含まないので外部で別に確認する必要がある。

   void WriteCmdXLCD ( unsigned char cmd);

  
cmdは下記のいずれかを選択、1度にはひとつだけ指定、重ね合わせは不可
  この指定パラメータ以外に直接1バイトのデータ指定で制御も可能
   ・Fucnction Set
     FOUR_BIT  EIGHT_BIT  LINE_5x7  LINE_5x10  LINES_5x7
   ・Display Contorol
     DON  DOFF   (表示のOn/Off) 
     CURSOR_ON  CURSOR_OFF  (カーソルのOn/Off)
     BLINK_ON  BLINK_OFF  (ブリンキングのOn/Off)
   ・Cursor/Display Shift Control
     SHIFT_CUR_LEFT   SHIFT_CUR_RIGHT
     SHIFT_DISP_LEFT   SHIFT_DISP_RIGHT

   例   while ( BusyXLCD( ) );
       WriteCmdXLCD ( FOUR_BIT );
       WriteCmdXLCD ( DON );
       WriteCmdXLCD ( 0x01 );    //Clear Display 直接指定の例

(5) putsXLCD
  文字列を表示させる関数。文字列はあらかじめ配列変数として用意しておく
  内部でビジーチェックをしているので外部でのビジーチェックは不要。
  データ終了を0x00で判定するので、文字列データの最後に0x00が必要

   void putsXLCD ( char *buffer );
   void putsXLCD ( const rom char *buffer );

   *buffer は配列名かデータへのポインター

  例   char mybuff [20];
       putsXLCD ( mybuff );


【実際のLCD関数の使い方】

上記の各関数を組み合わせて液晶表示器を制御しますが、もうひとつ用意しなけ
ればならないことがあります。
それは、ディレイ関数です。LCD制御の各関数の内部でディレイ関数を使っています
が、内部ではディレイ関数は組み込まれておらず、外部関数となっています。
そこでこのディレイ関数は、ユーザがシステムにあわせて用意することになって
います。 必要なディレイ関数は下記3種類です。

  DelayFor18TCY( )   :Enableのパルス幅確保用で最低0.5μsecのディレイ
  DelayPORXLCD( )   :初期化時の15msecのディレイ
  DelayXLCD( )      :初期化時の5msecのディレイ

実際の例では下記のようにします。

void DelayFor18TCY(void)
{
  Nop();    //Nopの数はクロックにより異なる
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  return;
}

void DelayPORXLCD(void)
{
  Delay1KTCYx(30);     //Delay 15msec
  return;
}

void DelayXLCD(void)
{
  Delay1KTCYx(10);     //Delay 5msec
  return;
}

上記関数を用意した上で実際のコーディング例は下記のようになります。
この例は 「1AHello!」 を常に同じ位置に表示することを繰り返す例です。

#include <xlcd.h>        //LCD関数のインクルード

char Buffer[8]="Hello!";   //文字列データの用意
TRISB = 0;            //ポートの初期化
TRISC = 0xF0;
OpenXLCD(FOUR_BIT);    //LCDの初期化とモード指定

while(1) {
  WriteCmdXLCD(0x01);    //表示クリア、カーソルホーム
  while(BusyXLCD());      //ビジーチェック
  WriteDataXLCD('1');      //1文字(1)表示
  while(BusyXLCD());      //ビジーチェック
  WriteDataXLCD('A');      //1文字(A)表示
  putsXLCD(Buffer);       //文字列(Hello!)表示
}

上記の例の全体ファイルは下記となっています。ダウンロードしてお使いください。

  ★ 液晶表示器 テストプログラム(18test4.c)




液晶表示制御関数の再構築の方法


【Cのライブラリ関数の再構成方法】

液晶表示器の接続方法が決まったら、LCD制御関数のヘッダーファイルを修正
して再コンパイルします。以下はその手順です。

ヘッダーファイルの一部に誤りもありますのでその修正も含めて一緒に行います。
また、この再構成用のバッチファイルも用意します。
このバッチファイルは、全モジュールの再構成をしてライブラリを再構築しますので
他のモジュールの変更の際にも使うことが出来ます。
今回は、活用例にある「PIC18評価ボード」を使いましたので、接続方法は上位
4ビットによる方法で説明します。

(1) ヘッダーファイルの修正
  液晶表示器のヘッダーファイル「xlcd.h」は、MPLAB-C18をインストールすると
  自動的にヘッダーディレクトリ(d:\mcc18\h\)に格納されます。
  ここでd:\mcc18はMPLAB-C18コンパイラをインストールしたディレクトリです。
  ここにあるxlcd.hファイルを下記のように修正します。修正個所は下記の2箇所
  です。

 (a) 上位4ビットである指定をするため #define UPPER の行のコメントをはずす

 (b) 制御用の3ビットの各ピンとTRISビットを指定する。
   この時、TRISビットの指定方法がオリジナルは間違っているので一緒に訂正
   します。

下記が訂正前後のxlcd.hの一部です。

《オリジナルのxlcd.h》
/* When in 4-bit interface define if the data is in the upper
* or lower nibble. For lower nibble, uncomment the #define UPPER
*/
/* #define UPPER */

/* DATA_PORT defines the port to which the LCD data lines are connected */
#if __18CXX
#define DATA_PORT PORTB
#define TRIS_DATA_PORT TRISB
#else /* 17CXX */
#define DATA_PORT PORTC
#define TRIS_DATA_PORT DDRC
#endif

/* CTRL_PORT defines the port where the control lines are connected.
* These are just samples, change to match your application.
*/
#if __18CXX
#define RW_PIN PORTBbits.RB6 /* PORT for RW */
#define TRIS_RW DDRBbits.RB6 /* TRIS for RW */
#define RS_PIN PORTBbits.RB5 /* PORT for RS */
#define TRIS_RS DDRBbits.RB5 /* TRIS for RS */
#define E_PIN PORTBbits.RB4 /* PORT for E */
#define TRIS_E DDRBbits.RB4 /* TRIS for E */

《訂正後のxlcd.h》
/* When in 4-bit interface define if the data is in the upper
* or lower nibble. For lower nibble, uncomment the #define UPPER
*/
#define UPPER

/* DATA_PORT defines the port to which the LCD data lines are connected */
#if __18CXX
#define DATA_PORT PORTB
#define TRIS_DATA_PORT TRISB
#else /* 17CXX */
#define DATA_PORT PORTC
#define TRIS_DATA_PORT DDRC
#endif

/* CTRL_PORT defines the port where the control lines are connected.
* These are just samples, change to match your application.
*/
#if __18CXX
#define RW_PIN PORTBbits.RB1 /* PORT for RW */
#define TRIS_RW TRISBbits.TRISB1 /* TRIS for RW */
#define RS_PIN PORTBbits.RB0 /* PORT for RS */
#define TRIS_RS TRISBbits.TRISB0 /* TRIS for RS */
#define E_PIN PORTBbits.RB2 /* PORT for E */
#define TRIS_E TRISBbits.TRISB2 /* TRIS for E */


(2) バッチファイルを使ってライブラリを再構築する。
  ヘッダーファイルを修正したら、既にライブラリとして存在する関数群を再構築
  する必要があります。
  この再構築のためのバッチファイルがコンパイラ側であらじめ用意されています。
  バッチファイルの所在は、d:\mcc18\src\ の下で下記3種類が用意されています。

    makeclib.bat   : 標準C関数の構築用

    makeonep.bat  : 1種類のデバイス用の全モジュール関数構築用
                  パラメータでデバイス名 18c452 などと指定する
    makeplib.bat   : 18シリーズ全種類(7機種)のモジュール関数構築用

  この中で今回使うのは makeonep.bat です。
  しかし、このようにあらかじめバッチファイルが用意されてはいるのですが、、MPLAB
  ーC18コンパイラの製品用のバッチファイルとなっているので、ディレクトリ指定やコン
  パイラのファイル名称などが異なっているので巧く動作しません。
  これをMPLAB-C18コンパイラのデモ版でも動作するように書き換えたファイルが下記
  ですのでこれを使って下さい。

   ★ モジュールライブラリ再構築用バッチファイル(makeonep.bat)

  なお、MPLABやMPLAB-C18コンパイラをインストールしたディレクトリが異なる場合
  には、上記バッチファイルにも修正が必要です。 修正個所は下記の部分です。

  (a) pathの追加(1行目)
    MPASM、MPLIB、MPLINK、MPLAB-C18コンパイラのあるディレクトリをパスとして
    変更します。
    
    path d:\mplab\;d:\mcc18\;d:\mcc18\bin\;d:\mcc18\h\;

    ここで注意が必要なことは、統合開発環境のMPLABをインストールする時に、
    DOS版のMPASMを含めて全てインストールしておくことです。
    これはMPLABのインストール時にはデフォルトで選択状態になっていますので
    MPLABで全てYESと答えてインストールしていれば自動的にインストールされ
    ます。
  (b) ヘッダーファイルのディレクトリ指定
    コンパイラにヘッダーファイルの位置を教えるために、-i パラメータを追加して
    いますが、このディレクトリをMPLAB-C18をインストールしたディレクトリに合わ
    せます。(全ての行を修正する必要があります)

    for %%i in (*.c) do c18demo -id:\mcc18\h\ -ms -p=%1 %%i
  
  この修正したバッチファイルをWindowsの スタート → ファイル名を指定して実行
  により下記のコマンドとして実行します。バッチファイルのパラメータとしてPICの種類
  を指定します。

       D:\mcc18\src\makeonep.bat 18c452

  これで自動的に全てのモジュール用の関数をコンパイルし直してライブラリ関数として
  再構築します。実行にはしばらく時間がかかります。
  結果のライブラリ関数は、 d:\mcc18\lib のディレクトリ下にある p18c452.lib として
  作成されます。
  
  このライブラリ関数が用意できれば、あとはMPLABのprojectでLIBのディレクトリを指定
  しておくだけで、必要な関数が自動的にリンクされて使えるようになります。

     


  トップページへ