PIC解説

【PIC】LCD 1602の使い方

投稿日:2021-02-05 更新日:

今回はパラレル接続のキャラクタLCD の使い方を紹介します。

タイトルに 1602 とついていますが、キャラクタLCD の制御IC は大抵同じものなので、文字数の違うものだったり、メーカーの違うものであっても同じように操作出来ると思います。

I2C 接続の LCD についてはこちらをご覧ください。

【PIC】I2CでLCDに文字を表示する

 

使用パーツ

  • LCD 1602A
  • PIC16F1827

今回使用する LCD はジャンクで購入したものなので正確な型番等は不明ですが、基板裏には QAPASS 1602A と表記されています。ピンアサインは表に書いてあるので問題なく使用出来ました。

LCDfaceLCDback

今回使用したものとは違いますが、参考として秋月電子で販売されている LCD のリンクを貼っておきます。LCDキャラクタディスプレイモジュール L1682D1J000 (16×2行 白色バックライト)

こちらのページにあるデータシートを参考にしています。

 

接続方法

まずは各ピンの説明です。

VDD, VSS 電源ピン:+5V と GND に接続
V0 コントラスト調整:可変抵抗を接続
RS Register Select:コマンドかデータを指定。マイコンに接続
RW Read Write:読取は H 、書込は L 。読取の必要がない場合は GND に接続
E Enable signal:マイコンに接続
D0 ~ D3 データ:8bitモードのときのみ使用
D4 ~ D7 データ:8bitモードと 4bitモードのどちらでも使用
A, K バックライト電源:抵抗を介して電源に接続

LCD とマイコンの接続は 8bitモードと 4bitモードの 2種類がありますが、今回は 4bitモードで行います。

4bitモードでは 1byte のデータを2回に分けて送信する必要がありますが、マイコンのピンを4本節約できるメリットの方が大きいです。

回路図は次のようになります。

Schematic

 

通信方法

データシートにあるタイミングチャートを見てみましょう。

TimingChart

注目すべき時点は、橙色の枠で囲んだ E が立ち下がる時点です。このタイミングで LCD にデータが送信されます。

すなわち、データの送信は

  • RS をコマンドであれば H に、データであれば L に設定
  • RW を L に設定(常に GND に接続していれば大丈夫)
  • D4~D7 に送信するデータを設定(4bitモードの場合)
  • 以上の状態で E を立ち上げてから立ち下げる

というステップで行うことができます。

以下がプログラム例です。(このページの最後にライブラリとしてまとめたものを載せています)

4bitモードでは 1byte のデータを送信するには上位4bit と下位4bit に分けて送信する必要があるので、上記のようにまず 4bit を送信する関数を作ってそれを2回呼び出しています。

RSについては、コマンドとデータでそれぞれ別の関数を用意してその中で設定しています。40us の遅延については後述のコマンド表に書いてある標準で必要な遅延時間です。

 

コマンド

まずコマンドの一覧表と初期化例を載せます。

InstructionTable

Initialization.

コマンドの詳しい内容はデータシートを参照してください。

これらを基に初期化関数とカーソル位置設定関数を用意しました。

データシートの初期化例ではディスプレイの表示を OFF にしたままなので、初期化関数の最後に表示を ON にさせています。

カーソル位置指定関数は4行の LCD にも対応できるようにしておきました。

 

CGRAM の使い方

LCD には英数字と半角カナのフォントが内蔵されていますが、CGRAM (Character Generation RAM) を使用すると独自のフォントを使用することができます。

CGRAM は右図のように8文字分用意されていて、この RAM にフォント(5×8)のデータを書き込むことで、任意の文字や記号を表示することができます。

文字コードと CGRAMアドレス、CGRAMデータの関係は下図のようになっています。

CGRAMアドレスの bit3~bit5 が文字コードの下位3bit を表し、bit0~bit2 がその文字内での位置を表します。(bit6,7 が無いことは前述のコマンド一覧の「CGRAMアドレスセット」を参照してください)

よって、1文字分のフォントを CGRAM に設定するためには、

  • 指定の文字コードに対応する CGRAMアドレス(下位3bit は 000)をセット
  • フォントのデータを送信(上から8回)

すればよいことになります。次の関数を用意しました。

 

1文字表示と printf() による文字列表示

初期化が完了したら、文字データを送信することで現在のDDRAMアドレス(カーソル位置)にそのデータが書き込まれ、LCD に文字を表示することができます。

例えば、「A」と表示させたい場合は先程用意した関数を使用して

lcd_DATA(‘A’);

とすればよいです。

文字列を表示させたい場合、ポインタを引数にしてこの関数を繰り返し実行する関数を用意すればよいのですが、printf()関数が使用出来れば変換指定子なども利用できるのでとても便利です。

PIC で標準出力関数の printf()を使用するには、低レベル出力関数の putch() 関数を自分で設定する必要があります。

今回は出力先を LCD にするので、

と記述します。これだけで printf()関数が使用可能になります。CGRAM の文字を使用するには、変換指定子の %c を使用します。

ちなみにこれは出力先を USART にしたりすることも可能です。

 

サンプルプログラム

LCD の1行目に”HelloWorld リケデン”と表示し、2行目には変換指定子を利用した変数の表示と CGRAM を利用した”℃”を表示させてみました。

1秒毎に1℃増えるという意味不明なプログラムですが気にしない。

OperationTest

上手くいかない場合はまずコントラストをいじってみると良いと思います。コントラストのピンに繋げた可変抵抗を回して下図のように薄すぎ/濃すぎでないか確かめてください。

TooThinTooThick

 

以下プログラムと回路図(再掲)です。

Schematic

今回の記事は以上となります。最後までご覧いただきありがとうございました。

ちなみにこちらの記事ではちゃんと温度を測定しています。

【PIC】ADCの使い方 サーミスタで温度測定

-PIC解説

執筆者:


  1. 萩原孝英 より:

    整理されていてとても綺麗なプログラムありがとうございます。参考にさせて頂きました。
    PIC16F1709にほとんどそのまま移植できたのですが、RA3が入力専用と言う事を忘れていて大分苦労しました。
    貴プログラムの
    printf(“Temp : %3d%c”, t, DEGREE);
    lcd_DATA(DEGREE);
    は「℃」が2度プリントされてしまうのですね。

    • きっちー より:

      コメントありがとうございます。
      コメントを参考に記事(プログラム)を一部編集させていただきました。

きっちー へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

【PIC】ADCの使い方 サーミスタで温度測定

今回は ADC (Analog to Digital Converter) の使い方を解説します。 PIC の IOピンは通常デジタルの入出力しか出来ませんが、ADC を使用することでアナログ入力(電 …

【PIC】SPI通信のやり方

多くの PIC に搭載されている MSSPモジュールを使うと I2C と SPI の2つのシリアル通信を行うことができます。 今回は SPI通信のやり方(マスター)を紹介します。 I2C についてはこ …

PIC超入門!ゼロからLチカまでの道【その4:プログラム書き込み~Lチカ】

前回プログラムが完成したので、あとはプログラムを書き込んで、回路を組み立ててついにLチカです! あともう少しでゴールなので頑張りましょう。 前回の記事はこちら PIC超入門!ゼロからLチカまでの道【そ …

PICでUSARTに四苦八苦

今回はパソコンとのシリアル通信に挑戦しましたがなかなか苦労しました。最初に結論だけ言うと、 マイコンの TX は相手の RX に、RX は TX に! 逆に接続するよ! ってことでした。それでは本文↓ …

【PIC】I2Cでセンサーの値を読み取る

電子工作といえば色々なセンサーを使ってみたいですよね。 温度・湿度センサーや加速度センサー、ジェスチャーセンサーなんてものもあります。多くのセンサーは I2C 通信で扱えるので一つやり方を覚えてしまえ …