ディスプレイユニットは、組み込みプロジェクトや電子製品で最も重要な出力デバイスです。16x2 LCDは、最も使用されているディスプレイユニットの1つです。16x2 LCDは、1行に16文字を表示できる2行があり、各文字がLCD上で5X7マトリックススペースを使用することを意味します。このチュートリアルでは、16X2 LCDモジュールを8051マイクロコントローラー(AT89S52)に接続します。LCDと8051マイクロコントローラーのインターフェースは 初心者にはかなり複雑に見えるかもしれませんが、概念を理解した後は非常にシンプルで簡単に見えます。LCDの16ピンを理解してマイクロコントローラに接続する必要があるため、時間がかかる場合があります。それではまず、LCDモジュールの16ピンについて理解しましょう。
電源ピン、コントラストピン、制御ピン、データピン、バックライトピンの5つのカテゴリに分類できます。
カテゴリー |
ピン番号 |
ピン名 |
関数 |
電源ピン |
1 |
VSS |
アースに接続されたアースピン |
2 |
VDDまたはVcc |
電圧ピン+ 5V |
|
コントラストピン |
3 |
V0またはVEE |
可変抵抗器を介してVccに接続されたコントラスト設定。 |
コントロールピン |
4 |
RS |
レジスタ選択ピン、RS = 0コマンドモード、 RS = 1データモード |
5 |
RW |
読み取り/書き込みピン、RW = 0書き込みモード、 RW = 1読み取りモード |
|
6 |
E |
有効にする、LCDを有効にするために高パルスから低パルスが必要 |
|
データピン |
7-14 |
D0-D7 |
データピン、LCDまたはコマンド命令に表示されるデータを格納します |
バックライトピン |
15 |
LED +またはA |
バックライト+ 5Vに電力を供給する |
16 |
LEDまたはK |
バックライトグラウンド |
制御ピンを除くすべてのピンは、名前と機能によって明確に理解できるため、以下で説明します。
RS: RSはレジスタ選択ピンです。LCDに表示するデータを送信する場合は、1に設定する必要があります。また、画面をクリアする(16進コード01)などのコマンド命令を送信する場合は、0に設定します。
RW:これは読み取り/書き込みピンです。LCDにデータを書き込む場合は、0に設定します。LCDモジュールから読み取る場合は、1に設定します。LCDからデータを読み取る必要がないため、通常、これは0に設定されます。「LCDステータスを取得する」という1つの命令だけを、何度か読む必要があります。
E:このピンは、モジュールに高パルスから低パルスが与えられたときにモジュールを有効にするために使用されます。450nsのパルスを与える必要があります。HIGHからLOWへの遷移により、モジュールはENABLEになります。
LCDにはいくつかのプリセットコマンド命令があります。以下のプログラムでそれらを使用してLCDを準備しました(lcd_init()関数内)。いくつかの重要なコマンド命令を以下に示します。
16進コード |
LCD命令レジスタへのコマンド |
0F |
LCDオン、カーソルオン |
01 |
表示画面をクリア |
02 |
帰宅 |
04 |
カーソルをデクリメントします(カーソルを左にシフトします) |
06 |
カーソルをインクリメントします(カーソルを右にシフトします) |
05 |
ディスプレイを右にシフト |
07 |
ディスプレイを左にシフト |
0E |
表示ON、カーソル点滅 |
80 |
カーソルを最初の行の先頭に強制します |
C0 |
カーソルを2行目の先頭に強制します |
38 |
2行と5×7マトリックス |
83 |
カーソル行1の位置3 |
3C |
2行目をアクティブにする |
08 |
表示OFF、カーソルOFF |
C1 |
2行目、位置1にジャンプします |
OC |
表示ON、カーソルOFF |
C1 |
2行目、位置1にジャンプします |
C2 |
2行目の位置2にジャンプします |
回路図と説明
上図に8051マイクロコントローラとのLCDインターフェースの回路図を示します。8051の基本を理解している場合は、8051マイクロコントローラのEA(PIN 31)、XTAL1およびXTAL2、RSTピン(PIN 9)、Vcc、およびグランドピンについて知っている必要があります。上記の回路でこれらのピンを使用しました。それについて何もわからない場合は、LCDインターフェースを実行する前に、この記事「8051マイクロコントローラーとのLEDインターフェース」を読むことをお勧めします。
したがって、これらの上記のピンに加えて、LCDのデータピン(D0-D7)をポート2(P2_0 – P2_7)マイクロコントローラーに接続しました。また、RS、RW、Eピンをそれぞれマイクロコントローラの12、13、14ピン(ポート3の2、3、4ピン)に制御します。
LCDのPIN2(VDD)とPIN 15(バックライト電源)は電圧(5v)に接続され、PIN 1(VSS)とPIN 16(バックライトグランド)はグランドに接続されています。
ピン3(V0)は、LCDのコントラストを調整するために、10kの可変抵抗を介して電圧(Vcc)に接続されています。可変抵抗器の中央のレッグはPIN3に接続され、他の2つのレッグは電圧源とグランドに接続されています。
コードの説明
私はコメントを通して(コード自体で)コードを説明しようとしました。
コマンドモードとデータモードについて前に説明したように、コマンド(関数lcd_cmd)の送信中に、RS = 0、RW = 0に設定し、EにHIGHからLOWへのパルスを1、次に0にすることで与えられることがわかります。また、データ(関数lcd_data)をLCDに送信する場合、RS = 1、RW = 0に設定し、Eに1から0にすることでHIGHからLOWのパルスを与えます。関数msdelay()は、ミリ秒単位の遅延を作成するために作成されました。プログラム内で頻繁に呼び出され、LCDモジュールが内部操作とコマンドを実行するのに十分な時間を確保できるように呼び出されます。
文字列を出力するためにwhileループが作成されました。これは、最後の文字(nullターミネータ-'\ 0')まで文字を出力するために毎回lcd_data関数を呼び出しています。
lcd_init()関数を使用して、事前設定されたコマンド命令(上記で説明)を使用してLCDを準備しました。