PIC解説

【PIC】LCD 1602の使い方

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

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

タイトルに1602とついていますが、キャラクタLCDの制御ICは大抵同じものなので、文字数の違うものだったり、メーカーの違うものであっても同じように操作出来ると思います。I2C接続のLCDについてはこちらをご覧ください。https://rikeden.net/?p=81

 

使用パーツ

  • 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にフォント(5x8)のデータを書き込むことで、任意の文字や記号を表示することができます。

文字コードと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

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

ちなみにこちらの記事ではちゃんと温度を測定しています。https://rikeden.net/?p=614

-PIC解説

執筆者:


  1. 萩原孝英 より:

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

    • きっちー より:

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

  2. ザク より:

    当該サイトでLCDに表示が出ることを確認できました。
    PicKit3を接続してプログラム書き込みでLCDに表示がでるのですが、電源のみに接続すると
    何も表示されませんでした。
    プログラムは、書き込まれているのに、何故電源のみでは表示(プログラム開始)されないのでしょうか。

    • きっちー より:

      余っているピンでLチカをさせてみるなど、PICが動いていることは確認していますか?
      PICが動いている場合、電源に接続した状態でPICをリセットしてもLCDは起動しないでしょうか?
      リセットで起動するなら、電源投入時の電圧が不安定などの原因が考えられます。
      その場合LCD初期化前にPICをしばらくスリープさせると解決するかもしれません。

      • ザク より:

        返信遅くなりすいません。
        PIC側のGND配線に間違いがありました。
        失礼しました。

  3. I2C初心者 より:

    こんにちは。
    また教えて欲しいことがあります。

    【PIC】I2CでLCDに文字を表示する
    上記の記事を見ると、書き込みの際、スレーブアドレスをLCDに送信していますが、

    当記事の1602の場合は、スケッチには、スレーブアドレスが見られないのですが、いかがでしょうか?
    書き込みの際、スレーブアドレスをスケッチに入れないのでしょうか?

    • きっちー より:

      当記事のLCDと「【PIC】I2CでLCDに文字を表示する」で使用したLCDは通信方式が異なります。

      I2C通信は一組の線で複数のデバイスを接続できるので、通信相手を指定するためにスレーブアドレスが必要になります。

      当記事の場合はI2Cのような決まった規格ではなく、デバイス独自の通信方式です。(キャラクタLCDであれば基本的に製造元に依らず共通ではあると思います)

      どの通信方式を使うのかは、そのデバイスがどの通信方式に対応しているか次第です。

  4. I2C初心者 より:

    こんにちは。

    初期設定のビット代入値ですが、*のところは、0とするのでしょうか?
    宜しくお願いします。

    • I2C初心者 より:

      続けて失礼します。
      *は無効と突起されていたので、その旨を条件として、AIに聞いてみました。
      *は、1でも0でも構わないとのことでした。

comment

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

CAPTCHA


関連記事

【PIC】ぷちFatFsでmicroSDカードと通信する

今回はPICでmicroSDカードを使用する方法を紹介します。なお、microSDじゃなくて普通のSDカードでも同様にできるはずです。 以下microSDカードも含めてSDカードと呼ぶことにします。S …

PIC超入門!ゼロからLチカまでの道【その3:コンフィギュレーション~プログラミング】

前回プロジェクトを作成して設定まで終わったのでいよいよプログラミングに入ります。PICの第一の関門であるコンフィギュレーションも順を追ってやっていけば簡単にできます。 前回の記事はこちらhttps:/ …

PIC超入門!ゼロからLチカまでの道【その2:プロジェクト作成~プロパティ設定】

前回MPLAB X IDEを導入したので、今回はプロジェクトの作成から説明していきます。 前回の記事はこちらhttps://rikeden.net/?p=336 目次1 プロジェクトの作成2 プロパテ …

【PIC】SPI通信のやり方

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

PICでカラーLCDモジュールを動かしてみた話【ST7789】

今回は以前にAmazonで購入したまま積んでいた フルカラーグラフィックLCDをPICで制御してみました。 激ムズというわけではありませんでしたが、いくつかつまずいたポイントがあったので備忘録がてら記 …