ディスプレイは、家電製品であれ産業機械であれ、あらゆる機械に必要な部分です。ディスプレイには、マシンを操作するための制御オプションが表示されるだけでなく、そのマシンによって実行されたタスクのステータスと出力も表示されます。7セグメントディスプレイ、16x2 LCDディスプレイ、TFTタッチスクリーンディスプレイ、OLEDディスプレイなど、電子機器で使用されるディスプレイには多くの種類があります。
16x2 LCDディスプレイは最も基本的なディスプレイモジュールであり、電卓、デジタルメーターなどの一部の小型電子機器でも使用されています。他のマイクロコントローラーとの基本的なインターフェイスを含め、16x2LCDを使用して多くのプロジェクトを行ってきました。
- 8051マイクロコントローラーとのLCDインターフェース
- LCDとATmega32マイクロコントローラーのインターフェース
- PICマイクロコントローラーとのLCDインターフェース
- 16x2LCDとArduinoのインターフェース
- Pythonを使用したRaspberryPiとの16x2LCDインターフェース
このチュートリアルでは、16x2LCDをAtmega16AVRマイクロコントローラーとインターフェースし、簡単なウェルカムメッセージを表示する方法を説明します。
必要なコンポーネント
- Atmega16
- 16x2LCDモジュール
- ジャンパー
- ブレッドボード
回路図
16x2LCDディスプレイ用のAtmega16のプログラミング
プログラミングには外部ライブラリは必要ありません。ここで、 Atmega16はUSBASPとAtmelStudio7.0を使用してプログラムされています。 プロジェクトの最後に完全なプログラムと作業ビデオが提供されます。プログラムをAtmega16にアップロードし、10kPOTを回転させてLCDの明るさを調整します。最初にCPU周波数を定義し、 IOピンへのアクセスなどのAtmelStudioパッケージに付属する必要なライブラリを含めます。
プログラムでLCDのRSピンとENピンを定義します。RSピンはデータとコマンドレジスタを選択するために使用されます。イネーブルピンはデータをラッチします。
#define en PA3 #define rs PA2
また、Atmega16のどのポートをLCDのインターフェースに使用するかを定義します。ここでは、PORTAが使用されます。
#define lcdDirection DDRA #define lcdPort PORTA
次のステップは、パラメーターを渡すことによってコマンドを受け入れる関数を作成することです。多くのLCDHEXコマンドがあります。16進コマンドは、LCDの機能を定義するために使用されます。我々が使用しているのでLCDの4ビットのモード、バイト(8ビット)は、2つのパケットで送信されるであろう。1つのパケットは上位ニブル(4ビット)になり、他のパケットは下位ニブル(4ビット)になります。
void lcdCommand(unsigned charコマンド) { lcdPort =(lcdPort&0x0F)-(コマンド&0xF0); lcdPort&=〜(1 <
次のステップは、文字を受け入れ、LCDのポートにラッチすることです。受信した文字は、ニブルによってLCDニブルに送信されます。関数は、 pass byパラメーター を使用して文字を 取得し 、次に上下のニブルを取得します。データレジスタの「rs」ピンがハイに設定された後、立ち上がりパルスが送信されてデータがラッチされます。同様に、イネーブルの値を変更し、イネーブルの立ち上がりパルスを送信することにより、下側のニブルが送信されます。
void lcdChar(unsigned char string) { lcdPort =(lcdPort&0x0F)-(string&0xF0); lcdPort-=(1 <
この関数は、文字を文字列に変換するだけで、後で文字列を書き込む必要があるプログラムで使用できます。
void lcdString(char * str) { int j; for(j = 0; str!= 0; j ++) { lcdChar(str); } }
これで、画面をクリアするためだけに関数が記述されました。コマンド 01 をHEXで送信してから、カーソルを初期位置に設定するだけです。
void lcdClear() { lcdCommand(0x01); _delay_ms(2); lcdCommand(0x80); }
これでmain関数で、LCDが初期化されます。LCDがインターフェースするPORT方向を最初に設定します。ここでは、PORTをOUTPUTに設定しているので、FFに設定します。
lcdDirection = 0xFF; _delay_ms(20)
次に、02を16進数で送信して、LCDを4ビットモードに設定します。また、28を16進数で送信して、4ビットモードで2行の15x7マトリックスピクセルに設定します。
lcdCommand(0x02); lcdCommand(0x28);
コマンド0℃と06は、カーソル位置を制御するために使用されます。そして最後に、01を16進数で送信して画面をクリアします。これでLCDの初期化は終了です。
lcdCommand(0x0c); lcdCommand(0x06); lcdCommand(0x01);
初期化が完了したら、文字列を送信してLCDをテストします。ここでは、「文字列送信している LCDのインタフェース 1つので」番目の行を。
lcdString( "インターフェイスLCD");
次に、コマンドc0を16進数で送信して、カーソルを次の行に移動します。そして最後に、この位置に「WithAtmega16 」という文字列を記述します。
lcdCommand(0xC0); lcdString( "With Atmega16");
これで、16x2LCDとAtmega16のインターフェースに関する完全なチュートリアルは終了です。画像やピクセルが得られない場合は、コードと回路図に従って配線を確認するか、LCDのV0ピンに接続されているPOTの値を変更してください。疑問や提案がある場合は、フォーラムに書き込むか、以下にコメントしてください。