PIC解説

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

投稿日:2020-04-01 更新日:

前回の記事で I2C通信を制御するライブラリを作成したので、今回はそれを使って LCD に文字を表示させてみたいと思います。

前回の記事はこちら↓

【PIC】I2C通信のやり方

LCD

まず初めに LCD について簡単に説明したいと思います。

LCD とは、Liquid Crystal Display すなわち液晶ディスプレイのことです。おそらく大半の人が液晶と聞くとテレビ等を思い浮かべると思いますが、画素を細かくして RGB の3色を使っているだけであって基本的な表示の原理は同じなんですね。

電子工作で使う LCD には、キャラクタLCD とグラフィックLCD の2種類があります。

キャラクタLCD は LCD を制御する IC に文字の情報を送るだけでその文字を表示してくれるので、簡単に扱うことができます。

グラフィックLCD は文字単位ではなく、すべてのドットの白黒を制御することができます。そのため、処理は複雑になりますが、漢字や絵なども自由に表示することができます。

 

今回使うのはこちらの秋月電子で販売されている8×2の小型LCDモジュールです。表示できる文字数が少ないですが、そんなに必要ないときにはコンパクトで安くてとても良いです。

接続方法

このモジュールの回路図がこちらです。

右側の CN2 は内部の IC に繋がっていますが、そこは気にする必要はありません。モジュールから出ている左側の CN1 とマイコンを接続します。

VDD と GND は電源ライン(ちなみに定格電圧は 3.3 V ですが、 5 V でも大丈夫です。)に、SCL と SDA はそれぞれマイコンの SCL と SDA に繋ぎます。

I2C通信の信号はオープンドレインですので、使うこの2本の線はプルアップ抵抗が必要になります。このモジュールには基板にあらかじめ抵抗がついているので、ジャンパパッドにはんだを盛ることでプルアップ抵抗を接続できますが、今回は外部に自分で接続したいと思います。

RESETは Low にするとリセットするピンですが、特にソフトウェアでリセットする用が無ければ、モジュール上でプルアップされているので、無接続で構いません。

マイコンは前回に引き続き PIC16F18326 で MSSP2モジュールを使います。

というわけでこんな感じ↓

 

制御方法

続いては LCD の制御方法を確認するために、データシートを読み解いていきましょう。

データ送信関数

■データとコマンドのWRITE方法■ということで↓の図が載っています。これを参考にデータとコマンドを書き込む関数を作りましょう。

上にある一列に並んだのが I2C通信でやりとりされるデータです。これによると、最初にスレーブアドレスを送信し、その後はコントロールバイトとデータバイトを交互に送信することになります。

複数のデータを送信するときには、コントロールバイトで最終データかどうかを指定しますが、今回はデータを1つだけ送信する関数を作ります。複数のデータを送りたければその関数を何度も呼び出します。

スレーブアドレスは R/W を含めて 0x7C の定数です。

コントロールバイトはデータ1つの場合必ず最終データなので Co = 0で、コマンドの場合は RS = 0 、データの場合は RS = 1 となります。

というわけで次のような関数を作りました。

遅延については後ほど説明します。

コマンド

データ送信関数ができたので、次は送信するコマンドについて見ていきます。データシートには■初期化設定例■として↓の図が載っています。

先程の遅延はこのコマンドの送信後に必要だったというわけです。この通りにコマンドを送信すれば特に問題なく初期化できるはずですが、きちんと理解するために1つずつコマンドを確認していきましょう。コマンドは↓の表にまとまっています。

これだけだと説明が不十分なので、Instruction Description を参考に詳しく見ていきましょう。

Clear Display

このコマンドはディスプレイをまっさらな状態にするコマンドです。
DDRAM( Display Data RAM : ディスプレイの文字を記憶しているメモリ)にすべて’ ‘(スペース)を書き込みまっさらにして、カーソルを左上に戻してくれます。
初期化例の一番最後に呼び出されていますね。

Return Home

カーソルの位置とディスプレイの位置(後述)を初期状態に戻してくれます。カーソルを任意の位置に移動させるコマンドは後に出てくるのでそちらの方をよく使います。

Entry Mode Set

文字を入力したときのカーソルとディスプレイの動く方向を設定できます。

I/D : Increment / Decrement of DDRAM Address
1 : カーソルを右に移動
0 : カーソルを左に移動

S : Shift of Entire Display
1 : ディスプレイを移動させる
0 : ディスプレイを移動させない

ディスプレイを移動させると下図のように流れる電光掲示板のような感じで表現できます。

Display ON/OFF

ディスプレイ、カーソル、点滅の設定ができます。

D : Display ON/OFF control bit
1 : ディスプレイON
0 : ディスプレイOFF

C : Cursor ON/OFF control bit
1 : カーソルON
0 : カーソルOFF

B : Blink ON/OFF control bit
1 : 点滅ON
0 : 点滅OFF

ディスプレイは全体を表示させるかどうか、カーソルは現在のカーソルの位置に’_’を表示させるかどうか、点滅は現在のカーソルの位置の文字を点滅させるかどうかを設定可能です。

Cursor or Display Shift


カーソルやディスプレイを移動させるコマンドです。ISは拡張コマンドの設定ビットで、詳しくは後述します。

S/C : Screen/Cursor select bit
1 : ディスプレイを移動
0 : カーソルを移動

R/L : Right/Left
1 : 右に移動
0 : 左に移動

移動量は1文字だけです。ディスプレイを移動させたときにはカーソルも同じ方向に一緒に動きます。

Function Set

色々な設定をするコマンドです。

DL : interface Data Length control bit
1 : 8-bit モード
0 : 4-bit モード

N : display line Numbercontrol bit
1 : 2-line モード
0 : 1-line モード

DH : Double Height font type control bit
1 : フォントサイズ 5×16
0 : フォントサイズ 5×8

IS : normal/extension Instruction Select
1 : 拡張コマンド使用
0 : 通常コマンド使用

 

DLは I2C制御ではない通常の LCD を使うときに設定するもので、I2C制御の場合は1にしておきます。

DHを1にすると下図のように2行で大きく1文字を表示できます。但しもともと少ない文字数をさらに減らすことになるので使い道は限られると思います。

ここまでのコマンドを見て最初に1が登場するビットの位置でコマンドが決められているのが分かるかと思いますが、8種類だと少し足りないので、拡張コマンドが用意されています。拡張コマンドを使うときにはこの IS を設定します。

Set CGRAM Adress

キャラクタLCD はあらかじめ文字のパターンが用意されているので自由なパターンを表示することは出来ないと初めに紹介しましたが、少しだけ自由に設定できる領域があります。

この表の CGRAM (Character Generator RAM) と書かれている6文字に任意のパターンを設定することができます。

今回はそのやり方は省略しますが、小さい絵を表示させたい場合などは挑戦してみてください。

Set DDRAM Adress

DDRAMアドレス、すなわちカーソルの位置を指定するコマンドです。アドレスと表示位置の関係は以下のようになっています。

実際に表示できるのは8文字だけですが、より大きな LCD でも同じ操作で制御できるように余分にアドレスが割り当てられています。

Power/ICON control/Contrast set (high byte)

Ion : set ICON display on/off
1 : アイコンディスプレイON
0 : アイコンディスプレイOFF

Bon : switch Booster circuit
1 : ブースター回路ON
0 : ブースター回路OFF

C5,C4 : Contrast set (high byte)

このモジュールにはアイコンの機能はついていないので Ion = 0 とします。ブースター回路は 3.3 V の低電圧で LCD を駆動するために必要となります。

コントラストについては次のコマンドと合わせて設定します。

Contrast set (low byte)

先程のコマンドと合わせて、コントラストを 6 bits = 64段階で設定できます。コントラストが小さいと真っ白になり、高いと真っ黒になるのでちょうどいいところに設定します。

このほかにもいくつかコマンドがありますが、正直そこまで理解しなくてもいいと思いますし初期化例の通りに設定しておけばいいので省略します。

というわけで、LCD を初期化する関数とカーソルを任意の位置に設定する関数を作成しました。

コントラストは初期化例のままだと少し濃かったので、小さくしてあります。色々調整してみて丁度いい値を探してみてください。

文字列、変数の表示

先程作ったデータ送信関数で

lcd_DATA(‘A’);

とすれば LCD に「A」が表示できますが、実際に使うときには1文字ずつではなく文字列をまとめて表示したいですよね。また、時間を表示したり変数の中身を表示させたいことも多いと思います。

そこで、一手間加えるだけでこれらの問題をまとめて解決することができます。

それはこれを追加するだけ!

なんとこれだけでお馴染みの printf関数が使えちゃいます!

文字列や変数の表示も

printf(“count=%d”,count);

みたいな感じで簡単にできます。

これもライブラリの中に入れても良いですが、PC とシリアル通信をするときなど、LCD 以外に文字を出力する状況も考えられるので main.c の中に入れたいと思います。

動作確認

実際に LCD に文字を表示させてみました。定番の Hello World と右上にはカウンタを表示させています。

ソースコード↓

I2Cライブラリ

LCDライブラリ

今回 I2C で LCD にデータを送信することができたので、次回はセンサーの値の読み取りを行いたいと思います。

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

-PIC解説

執筆者:


  1. 通りすがり より:

    このページを参考にしてSSD1306が表示できました。サンクス

comment

メールアドレスが公開されることはありません。

関連記事

【PIC】SPI通信のやり方

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

【PIC】LCD 1602の使い方

今回はパラレル接続のキャラクタLCD の使い方を紹介します。 タイトルに 1602 とついていますが、キャラクタLCD の制御IC は大抵同じものなので、文字数の違うものだったり、メーカーの違うもので …

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

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

PIC超入門!ゼロからLチカまでの道【その1:部品購入~IDE導入】

電子工作を始めてみたいけど、何から手を付けていいか分からない…。そんな方のためのゼロからLEDを点滅させる(通称Lチカ)ところまでの超入門講座です。 目次1 PICとは2 必要なもの3 MPLAB X …

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

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