I2Cを使ってLCDに文字を表示させる!②(C言語)

RaspberryPi
スポンサーリンク

こんにちは。駆け出しエンジニアのまっきーです。

前回の続きを行っていきたいと思います。

サンプルプログラムがうまく動かず、約1日ググりまくりました(泣)

中華製だったせいか、あまり有力なデータシート等は見つけられなかったので、先人の方々にお世話になりました。

色々調べていたところ、このようなサイトを見つけました。

キャラクタLCDをアクセス - PukiWiki

そしてこの部分が気になりました。4ビットバスモード?

さらに調べてみると、

LCDモジュールへのコマンド及びデータは8ビット、そのため、信号線が基本は8本。しかし、ピン数の少ないラズパイなどでは、上位4ビットの4本の信号線で接続して、8ビットデータを2回に分け4ビットずつ受け渡しするモードを利用することが多いが、その分ソフトウェアの負担は大きくなるそうです。

つまりデータシートより

この赤枠の部分が4ビットバスを表しているということなのでしょうか。

上の表とも対応していますね。(D7,D6,D5,D4,light,E,RW,RS)

これを踏まえて、前回のプログラムを一つずつ確認していきたいと思います。

プログラム

全体のプログラムは以下の通りです。修正を入れたとこには日本語でコメントを加えてあります。

プログラムがしっかりと動作しました!16*2がわかりやすいように文字列だけ変えています。

とりあえず、目的は達成しました!

次はプログラム詳細です。

プログラム詳細

・I2Cに関する関数を使用する際は<wiringPiI2C.h>をインクルードします。

・最初の関数void write_word()はブルーライト点灯用の関数です。

・or,and演算を使用して、4ビット目(ブルーライトON、OFF)を操作しています。

・この関数はコマンド送信用の関数です。4ビット通信を行っています。

・前提として、I2C通信は、立下りでコマンドデータを送信します。つまり、ENビットが0になったときにデータを転送します。

・ENビットを1にし、ライト点灯をします。

・8行目で上位4ビットの送信を行っています。

・11行目からは下位4ビットを送信します。下位ビット送信のため、左に4ビットシフト演算しています。

・あとは上位ビットの時と同様です。

ここからはデータ送信の関数です。送信方法は4ビットなので先ほどの関数と同様の送信方法です。

・5行目で1ビット目のRS(ragister select)を立てています。これにより、文字のデータを送る設定になります。(RSの設定は自信がありません。違ってたら教えてください。)

・8行目で、ENビットを下げ、データの送信を行っています。

・あとの説明は省略します。

次はLCDの初期化関数です。初期化には決められたコマンドを使います。

****この部分の説明は訳しただけなのでまだ完璧には理解できていません****

・3行目 0x33(00110011) 8ビット送信の設定。必ずこの設定はいるみたいですね。

・5行目 0x32(00110010) 4ビットモードに切り替えています

・7行目 0x28(00101000) 7ビットのアドレス空間を利用

・9行目 0x0c(00001100) カーソルクリア

・10行目 0x01(00000001) スクリーンの初期化

このサイトがとってもわかりやすいです。

スクリーン初期化用の関数です。

LCDに書き込む文字を作成する関数です。

・write(何番目か(0~15),何列目か(0か1),表示したい文字)

・4~7行目 上記の引数でのエラー対策の式です。

・9行目   表示をする位置を計算しています。少し詳しく説明します。

下の表のようなアドレスになっています。ここで注意点として表示アドレスデータのビット構成としてMSB(最上位ビット)は1と決まっているそうです。なので、0x80があらかじめ書かれています。

例を見てみましょう。write(0,1,”A”)の場合、0x80+0x40*1+0=0x80+0x40となり、2行目の一番最初にAと出力されます。

12~14行目は、文字列の転送になります。一文字ずつ送信して文字列を作っています。

最後に、メイン関数ですが、説明は省略します。

まとめ

・LCDの転送方式には4ビット、8ビットの転送方法がある

・4ビット転送をする際は、上位ビット→下位ビットで送る(ビットシフトを忘れずに)

・I2Cを用いた設定はかなりめんどくさいが、I2C通信の学習には最適である

今回はここまでになります。

中華製のLCD,I2Cだからか、全然詳細な情報が見つかりませんでした…

無難に秋月電子などのショップで買った方がいいのかもしれないと少しだけ思いました。

ありがとうございました。

タイトルとURLをコピーしました