液晶ディスプレイ(LCD)を使う

7行5列の点の集合によって文字や記号を表示することができる。
例) ! の表示例

 
 

点の集合体で文字や記号(キャラクタともいう)を表示手法を、ドット・マトリックス(ドット=点、マトリックス=集合)と呼ぶ。
現在、画像表示できるディスプレイのほとんどは、この、ドットマトリックス表示により、画像や文字の表示を行っている。
 



マイコンとLCDの接続

H8マイコンとLCD(SC1602xxx及び、その互換品)は、以下のように6本の信号線で接続されている。

               
図からわかるように、LCDはH8のポートBに接続されているので、ポートBの信号を操作すれば、LCDにデータを送ることができる。
PB4(RS)とPB7(E)は制御用の信号線で、データはPB0(DB4)~PB3(DB7)の4ビット単位で送信する。
8ビットのデータを送りたい場合は、上位4ビットを先に送り、その後、下位4ビットを送信する。

LCDにデータを転送するには、
① EをHi(1)に設定する。
② DB4~DB7に送りたいデータを設定する。
③ EをLo(0)に設定する。EがLoに切り替わった瞬間のDB4~DB7の値が、LCDに読み込まれる。
④ 以下、①~③を必要なだけ、繰り返す。

                      
たとえば、0x23をLCDに転送したい場合は、以下のようにする。

......

PB_DDR = 0xFF;  // ポートBを出力に設定

......

// まず、上位4ビットの0x02を送信
// 0x02(PB0~PB3)とイネーブル信号(PB7)を1にして送信
PB_DR = 0x02 | 0x80;

// 0x02(PB0~PB3)とイネーブル信号(PB7)を0にして送信
// このタイミングでLCDはPB0~PB3の信号を読み込む
PB_DR = 0x02;

// つぎに、下位4ビットの0x03を送信
// 0x03(PB0~PB3)とイネーブル信号(PB7)を1にして送信
PB_DR = 0x03 | 0x80;

// 0x03(PB0~PB3)とイネーブル信号(PB7)を0にして送信
// このタイミングでLCDはPB0~PB3の信号を読み込む
PB_DR = 0x03;

 



LCDのコマンド

LCDに対して、コマンドを送ることで何らかの操作を行う事が出来る。コマンドには、以下のようなものがある。
なお、コマンド操作では、RSを0とすること。

  • クリア・ディスプレイ
     表示を全てクリアして、カーソル位置も先頭位置に戻す。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0        0        0        0        0
出力(2回目)   0        0        0        0        1

                                   ※出力(1回目)は上位4ビット、出力(2回目)は下位4ビットを転送している。

  • カーソル・アットホーム
     カーソルを先頭位置に戻す。表示はクリアしない。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0        0        0        0        0
出力(2回目)   0        0        0        1        -

                         ※ - は不定値(1でも0でも良い)

  • エントリーモード・セット
     1文字分の文字データが入力された時の挙動を指定する。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0        0        0        0        0
出力(2回目)   0        0        1        I/D        S

I/D :"1"の時は新たな文字表示が右側に追加され、"0"の時は左側に追加される
S :"1"の時は新たな文字追加に伴って画面表示全体もシフト

  • ディスプレイ・オン・オフ・コントロール
    文字表示のON/OFF、カーソル表示のON/OFF、カーソル位置の文字のブリンク(点滅)ON/OFFを指定する。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0        0        0        0        0
出力(2回目)   0        1        D        C        B

D:"1"の時は文字表示ON、"0"の時は文字表示OFF
C :"1"の時はカーソル表示ON、"0"の時はカーソル表示OFF
B :"1"の時はカーソル位置の文字がブリンク表示ON、"0"の時はOFF

  • カーソル/ディスプレィ・シフト
    カーソル位置や、表示全体をシフトさせる。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0        0        0        0        1
出力(2回目)   0        S/C        R/L        -        -

S/C :"1"の時は表示全体をシフト、"0"の時はカーソル位置だけをシフト
R/L :"1"の時は右側にシフト、"0"の時は左側シフト

  • ファンクション・セット
    データ幅、表示行数、表示フォントをイニシャル指定する。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0        0        0        1        DL
出力(2回目)   0        N        F        -        -

DL :"1"の時は8BIT幅モード、"0"の時は4BIT幅モードによる通信
N :"1"の時は2行表示、"0"の時は1行表示
F :"1"の時は5x10dotフォント、"0"の時は5x7dotフォント

  • DDRAMアドレス・セット
    文字の表示位置、カーソル位置のアドレスを設定する。
     信号線  RS   DB7(DB3)   DB6(DB2)   DB5(DB1)   DB4(DB0)
出力(1回目)   0       1        b6        b5        b4
出力(2回目)   0        b3        b2        b1        b0

         b6~b0でDDRAM(Display Data RAM:表示データメモリ)のアドレスを指定する。

 このLCDコントローラは上段1行目と下段2行目のそれぞれに40文字ずつ、合計80文字の表示が可能。この表示位置を決めるDDRAMアドレスは以下のようになっている。



初期化処理

 始めに初期化を行ってから、使うこと。手順は、以下の通り。


文字の表示

文字データも今まで同じように上位4ビット、下位4ビットの順に送信する。ただし、RS(PB4)を1にする必要がある。
※コマンドならRSは0、文字データならRSは1。
以下に、LCDに#(文字コードは0x23)を表示する例を示す。

// まず、上位4ビットの0x02を送信
// 0x02(PB0~PB3)とイネーブル信号(PB7)を1に、RS信号(PB4)を1にして送信
PB_DR = 0x02 | 0x80 | 0x10;

// 0x02(PB0~PB3)とイネーブル信号(PB7)を0に、RS信号(PB4)を1にして送信
// このタイミングでLCDはPB0~PB3の信号を読み込む
PB_DR = 0x02 | 0x10;

// つぎに、下位4ビットの0x03を送信
// 0x03(PB0~PB3)とイネーブル信号(PB7)を1に、RS信号(PB4)を1にして送信
PB_DR = 0x03 | 0x80 | 0x10 | 0x10;

// 0x03(PB0~PB3)とイネーブル信号(PB7)を0に、RS信号(PB4)を1にして送信
// このタイミングでLCDはPB0~PB3の信号を読み込む
PB_DR = 0x03 | 0x10;


文字コードは、以下の通り。


サンプルプログラム

LCDの初期化を行い、OKと表示する例を以下に示す。

#include "monitor.h"

#define PB_DDR (*(volatile unsigned char *)0xFFFFD4)
#define PB_DR (*(volatile unsigned char *)0xFFFFD6)

#define PA_DDR (*(volatile unsigned char *)0xFFFFD1)
#define PA_DR (*(volatile unsigned char *)0xFFFFD3)

#define RS 0x10 //レジスタ選択 コマンド(設定)の時:0 文字を送る時:1
#define ENA 0x80 //イネーブル 1で出力して0にしてまた出力

// mesc間なにもしない時間稼ぎ関数
void msecwait(int msec)
{
    int i,j;
    for (i=0;i<msec;i++)      // < は全角文字であることに注意
    {
       for (j=0;j<1588;j++);   // < は全角文字であることに注意
    }
}

int main()
{
    PA_DDR = 0x00; // 全てのビットを入力ポートに指定
    PB_DDR = 0xFF; // 全てのビットを出力ポートに指定

    // LCD初期設定開始
    // H8起動してからLCD初期化処理までに15msec以上待つ
    msecwait(50);
    // 0x03を送信する
    // ENABLEビットの立下りで信号を認識するため
    // ENABLEビット1とENABLEビット0を送信しなければならない
    PB_DR = 0x03 | ENA; // ENABLEを1にして0x03送信
    PB_DR = 0x03; // ENABLEを0にして0x03送信
    // 4.1msec以上待機
    msecwait(5);
    // 0x03送信
    PB_DR = 0x03 | ENA; // ENABLEを1にして0x03送信
    PB_DR = 0x03; // ENABLEを0にして0x03送信
    // 0.1msec以上待機
    msecwait(1);
    // 0x03送信
    PB_DR = 0x03 | ENA; // ENABLEを1にして0x03送信
    PB_DR = 0x03; // ENABLEを0にして0x03送信
    // 0.1msec以上待機
    msecwait(1);
    // 0x02送信
    // これでLCDは4bitモードになる
    PB_DR = 0x02 | ENA; // ENABLEを1にして0x02送信
    PB_DR = 0x02; // ENABLEを0にして0x02送信
    msecwait(1);

    // ファンクションセット
    // 0x28を送信
    PB_DR = 0x02 | ENA; // 上位4ビット出力
    PB_DR = 0x02;
    PB_DR = 0x08 | ENA; // 下位4ビット出力
    PB_DR = 0x08;
    msecwait(1);

    // 表示オン/オフコントロール
    // 0x0Eを送信
    PB_DR = 0x00 | ENA; // 上位4ビット出力
    PB_DR = 0x00;
    PB_DR = 0x0E | ENA; // 下位4ビット出力
    PB_DR = 0x0E;
    msecwait(1);

    // エントリーモードセット
    // 0x06を送信
    PB_DR = 0x00 | ENA; // 上位4ビット出力
    PB_DR = 0x00;
    PB_DR = 0x06 | ENA; // 下位4ビット出力
    PB_DR = 0x06;
    msecwait(1);

    // 表示クリア
    // 0x01を送信
    PB_DR = 0x00 | ENA; // 上位4ビット出力
    PB_DR = 0x00;
    PB_DR = 0x01 | ENA; // 下位4ビット出力
    PB_DR = 0x01;
    msecwait(1);
    //表示クリアとカーソルホームは4msec待つ
    msecwait(4);
    // LCD初期化処理はここまで

    // LCDに文字を表示させる
    //'O'を表示
    // 'O'は文字コード表から0x4F
    PB_DR = 0x04 | RS | ENA; // 上位4ビット出力
    PB_DR = 0x04 | RS;
    PB_DR = 0x0F | RS | ENA; // 下位4ビット出力
    PB_DR = 0x0F | RS;
    msecwait(1); // データシートでは40uS程度の待ち時間。これを挿入しないと文字化けすることがある。

    // Kを表示
    // Kは文字コード表から0x4B
    PB_DR = 0x04 | RS | ENA; // 上位4ビット出力
    PB_DR = 0x04 | RS;
    PB_DR = 0x0B | RS | ENA; // 下位4ビット出力
    PB_DR = 0x0B | RS;
    msecwait(1); // データシートでは40uS程度の待ち時間。これを挿入しないと文字化けすることがある。

    while(1)
    {
    }
}


 

最終更新:2015年01月22日 11:49