ディスプレイは、家電製品であれ産業機械であれ、機械に必要な部分です。ディスプレイには、マシンを操作するための制御オプションが表示されるだけでなく、そのマシンによって実行されたタスクのステータスと出力も表示されます。7セグメントディスプレイ、LCDディスプレイ、TFTタッチスクリーンディスプレイ、LEDディスプレイなど、電子機器で使用されるディスプレイには多くの種類があります。16x2LCDディスプレイは最も基本的なものであり、一部の小型電子機器でも使用されるディスプレイです。他のマイクロコンピューターとの基本的なインターフェースを含む16x2LCDを使用するプロジェクト:
- 8051マイクロコントローラーとのLCDインターフェース
- LCDとATmega32マイクロコントローラーのインターフェース
- PICマイクロコントローラーとのLCDインターフェース
- 16x2LCDとArduinoのインターフェース
- Pythonを使用したRaspberryPiとの16x2LCDインターフェース
このチュートリアルでは、16x2 LCDをARM7-LPC2148マイクロコントローラーとインターフェースし、簡単なウェルカムメッセージを表示する方法を説明します。ARM7を初めて使用する場合は、ARM7 LPC2148の基本から始めて、KeiluVisionを使用してプログラミングする方法を学びます。
必要な材料
ハードウェア
- ARM7-LPC2148マイクロコントローラーボード
- LCD(16X2)
- ポテンショメータ
- 5V電圧レギュレータIC
- ブレッドボード
- 接続線
- 9V電池
- マイクロUSBケーブル
ソフトウェア
- Keil uVision 5
- マジックフラッシュツール
プロジェクトに入る前に、LCDの動作モードとLCDの16進コードについていくつか知っておく必要があります。
16X2LCDディスプレイモジュール
16X2 LCDには、16列と2行があると表示されます。このLCDには16ピンがあります。下の画像と表は、LCDディスプレイのピン名とその機能を示しています。
名前 |
関数 |
VSS |
アースピン |
VDD |
+ 5V入力ピン |
VEE |
コントラスト調整ピン |
RS |
レジスタ選択 |
R / W |
読み取り/書き込みピン |
E |
ピンを有効にする |
D0-D7 |
データピン(8ピン) |
LED A |
アノードピン(+ 5V) |
LED K |
カソードピン(GND) |
LCDは、4ビットモードと8ビットモードの2つの異なるモードで動作します。4ビットモードで は、データニブルをニブルごとに送信します。最初に上位ニブル、次に下位ニブルです。ニブルが何であるかを知らない人のために:ニブルは4ビットのグループであるため、バイトの下位4ビット(D0-D3)が下位ニブルを形成し、上位4ビット(D4-D7)が形成されます。バイトの上位ニブルを形成します。これにより、8ビットデータを送信できます。
一方、8ビットモードで は、8つのデータラインすべてを使用するため、1つのストロークで8ビットのデータを直接送信できます。
このプロジェクトでは、最も一般的に使用されるモードである4ビットモードを使用します。4ビットモードでは、マイクロコントローラーの4ピンを節約し、配線のオーバーヘッドを減らすことができます。
16x2もHEXコードを使用して任意のコマンドを実行します。カーソルの移動、モードの選択、コントロールを2行目にシフトするなど、LCDには多くの16進コマンドがあります。16X2LCDディスプレイモジュールと16進コマンドの詳細については、リンクをたどってください。 。
回路図と接続
以下の表は、LCDとARM7-LPC2148間の回路接続を示しています。
ARM7-LPC2148 |
LCD(16x2) |
P0.4 |
RS(登録選択) |
P0.6 |
E(有効) |
P0.12 |
D4(データピン4) |
P0.13 |
D5(データピン5) |
P0.14 |
D6(データピン6) |
P0.15 |
D7(データピン7) |
LCDおよびARM7スティックとの電圧レギュレータの接続
以下の表は、ARM7とLCDと電圧レギュレータの接続を示しています。
電圧レギュレータIC |
ピン機能 |
LCD&ARM-7 LPC2148 |
1.左ピン |
+バッテリーからのVe9V入力 |
NC |
2.センターピン |
-バッテリーからのVe |
LCDのVSS、R / W、K ARM7のGND |
3.右ピン |
調整された+ 5V出力 |
LCDのVDD、A + 5VのARM7 |
LCD付きポテンショメータ
ポテンショメータは、LCDディスプレイのコントラストを変化させるために使用されます。ポットには3つのピンがあり、左側のピン(1)は+ 5Vに接続され、中央(2)はLCDモジュールのVEEまたはV0に接続され、右側のピン(3)はGNDに接続されます。つまみを回してコントラストを調整できます。
ジャンパー設定
ARM7-Stickにはジャンパーピンがあり、USBを使用するか、電源専用の5V DC入力を使用して、コードに電力を供給してアップロードできます。以下の画像をご覧ください。
下の画像は、ジャンパーがDC位置にあることを示しています。つまり、外部5V電源からボードに電力を供給する必要があります。
この画像は、ジャンパーがUSBモードで接続されていることを示しています。ここでは、電源とコードはマイクロUSBポートを介して提供されます。
注:このチュートリアルでは、ジャンパーをUSBに設定してUSBを使用してコードをアップロードし、ジャンパーをDCモードに変更して、レギュレーターの5v入力からLPC2148に電力を供給します。これは、最後にあるビデオで確認できます。
16x2LCDをARM7マイクロコントローラーとインターフェースするための最終的な回路は次のようになります。
ARM7のプログラミング-LPC2148
ARM7-LPC2148をプログラムするには、keil uVision&FlashMagicツールが必要です。USBケーブルを使用してマイクロUSBポート経由でARM7スティックをプログラムしています。Keilを使用してコードを記述し、16進ファイルを作成してから、FlashMagicを使用してHEXファイルをARM7スティックにフラッシュします。keiluVisionとFlashMagicのインストールとその使用方法の詳細については、「ARM7 LPC2148マイクロコントローラー入門」リンクをたどり、KeiluVisionを使用してプログラムしてください。
LCDをARM7とインターフェースするための完全なコードは、このチュートリアルの最後にあります。ここでは、そのいくつかの部分について説明します。
まず、必要なヘッダーファイルをインクルードする必要があります
#include
LCDモジュールの初期化は非常に重要なステップです。ここでは、実際にはコマンドである特定のHEXコードを使用して、LCDに動作モード(4ビット)、LCDのタイプ(16x2)、スタートラインなどを通知します。
void LCD_INITILIZE(void)// LCDを準備する関数 { IO0DIR = 0x0000FFF0; //ピンP0.4、P0.6、P0.12、P0.13、P0.14、P0.15をOUTPUT delay_ms(20);として設定します。 LCD_SEND(0x02); // 4ビット動作モードでlcdを初期化します LCD_SEND(0x28); // 2行(16X2) LCD_SEND(0x0C); //カーソルをオフに表示 LCD_SEND(0x06); //カーソルを自動インクリメント LCD_SEND(0x01); //クリア LCD_SEND(0x80);を 表示します //最初の行の最初の位置}
4ビットモードの場合、ピンにはさまざまなタイプの書き込み機能があります。つまり、上部ニブルと下部ニブルを使用します。それがどのように行われるか見てみましょう
void LCD_SEND(char command)// 16進コマンドをニブル ごとに送信する関数{ IO0PIN =((IO0PIN&0xFFFF00FF)-((command&0xF0)<< 8)); //コマンドの上位ニブルを送信 IO0SET = 0x00000040; //有効にする HIGHIO0CLR = 0x00000030; // RS&RWをLOWにする delay_ms(5); IO0CLR = 0x00000040; //有効にする LOWdelay_ms(5); IO0PIN =((IO0PIN&0xFFFF00FF)-((command&0x0F)<< 12)); //コマンドの下位ニブルを送信 IO0SET = 0x00000040; // ENABLE HIGH IO0CLR = 0x00000030; // RS&RW LOW delay_ms(5); IO0CLR = 0x00000040; // ENABLE LOW delay_ms(5); }
ニブル送信ロジック
IO0PIN =((IO0PIN&0xFFFF00FF)-((command&0x0F)<< 12)); //コマンドの下位ニブルを送信 IO0PIN =((IO0PIN&0xFFFF00FF)-((command&0xF0)<< 8)); //コマンドの上位ニブルを送信します
上記の2つのステートメントは、このプログラムで重要な役割を果たします。最初のコマンドは下のニブルを送信し、2番目のコマンドは上のニブルを送信します。それは私たちが行う他のピンに影響を与えることはありません。最初にこのロジックについて知る前に、それがどのように起こっているかを見てみましょう
ORing-(A-0 = A)、(A-1 = 1) ANDing-(A&0 = 0)、(A&1 = A)
そのため、他のピンに影響を与えることなく、マスキングの概念と論理シフト操作を使用します。ピン(P0.12-P0.15)のみが使用され、P0.4、P0.6などの他のピンは影響を受けないことを意味します。これは、データを4ビットにシフトし、下部ニブルの代わりに上部ニブルを作成し、上部ニブルをマスキングすることによって行われます。次に、下位ビットをゼロ(0XF0)にし、ニブルデータとOR演算して、出力で上位ニブルデータを取得します。
同様のプロセスが低ニブルデータにも使用されますが、ここではデータをシフトする必要はありません。
データを出力に書き込むとき、つまり、コマンドモードではRSをLOWにして、イネーブルを実行する必要があります。データモードでは、 RSをHIGHにして、イネーブルを実行するにはHIGHにする必要があります。
ここで、出力で出力される文字列データを送信するために、同じ原理がニブルごとに使用されます。ここでの重要なステップは、データモードではレジスタ選択(RS)をHIGHにする必要があることです。
void LCD_DISPLAY(char * msg)//送信された文字を1つずつ出力する関数 { uint8_t i = 0; while(msg!= 0) { IO0PIN =((IO0PIN&0xFFFF00FF)-((msg&0xF0)<< 8)); //上位ニブルを 送信IO0SET = 0x00000050; // RS HIGH& ENABLEHIGHで データを出力IO0CLR = 0x00000020; // RW LOW書き込みモード遅延ms(2); IO0CLR = 0x00000040; // EN = 0、RSおよびRWは変更されていません(つまり、RS = 1、RW = 0) 遅延ms(5); IO0PIN =((IO0PIN&0xFFFF00FF)-((msg&0x0F)<< 12)); //下位ニブルを 送信IO0SET = 0x00000050; // RS&EN HIGH IO0CLR = 0x00000020; 遅延ms(2); IO0CLR = 0x00000040; 遅延ms(5); i ++; }
完全なコーディングとデモンストレーションのビデオを以下に示します。