これは、PICチュートリアルシリーズの6番目のチュートリアル です。このチュートリアルでは、16x2LCDとPICマイクロコントローラーのインターフェイスについて学習します。以前のチュートリアルでは、いくつかのLED点滅プログラムを使用してPICの基本を学び、PICマイクロコントローラーでタイマーを使用する方法も学びました。MPLABXおよびXC8コンパイラを使用したPICマイクロコントローラの学習に関するすべてのチュートリアルをここで確認できます。
このチュートリアルは、16×2 LCDをPIC16F877Aとインターフェースする方法を学習するため、興味深いものになります。このチュートリアルの最後にある詳細なビデオを確認してください。ユーザーの表示にLEDを使用していた昔は終わりました。LCDディスプレイを使用して、プロジェクトをよりクールで便利に見せるための方法を見てみましょう。LCDと8051、Arduino、Raspberry Pi、AVRとのインターフェースに関する以前の記事も確認してください。
LCDとPICマイクロコントローラーのインターフェース機能:
物事を簡単にするために、PIC16F877AでこのLCDを使用しているときに物事を簡単にすることができる小さなライブラリを作成しました。ヘッダーファイル「MyLCD.h」はダウンロード用にここにあります。これには、PICMCUを使用してLCDを駆動するために必要なすべての機能が含まれています。ライブラリコードはコメント行で十分に説明されていますが、それでも疑問がある場合は、コメントセクションからご連絡ください。基本的なLCDの動作とそのピン配列についても、この記事を確認してください。
注:デバッグやMCUの変更に役立つため、ヘッダーファイル内で実際に何が起こっているかを知ることを常にお勧めします。
現在、このコードをプログラムに追加する方法は2つあります。MyLCD.hの上記のコード行をすべてコピーして、void main()の前に貼り付けることができます。または、リンクを使用してヘッダーファイルをダウンロードし、プロジェクトのヘッダーファイルに追加することもできます( #include "MyLCD.h "; )。これは、ヘッダーファイルを右クリックし、[既存のアイテムの追加]を選択して、このヘッダーファイルを参照することで実行できます。
ここでは、ヘッダーファイルコードをコピーしてメインのCファイルに貼り付けました。したがって、コードを使用している場合は、ヘッダーファイルをダウンロードしてプログラムに追加する必要はありません。このチュートリアルの最後にある完全なコードを使用するだけです。また、このライブラリはPIC16FシリーズPICマイクロコントローラのみをサポートすることに注意してください。
ここでは、以下のヘッダーファイル内の各関数について説明しています。
void Lcd_Start(): この関数は、LCDでの作業を開始するために呼び出す必要がある最初の関数である必要があります。プログラムの遅延を避けるために、この関数を1回だけ呼び出す必要があります。
void Lcd_Start(){Lcd_SetBit(0x00); for(int i = 1065244; i <= 0; i-)NOP(); Lcd_Cmd(0x03); __delay_ms(5); Lcd_Cmd(0x03); __delay_ms(11); Lcd_Cmd(0x03); Lcd_Cmd(0x02); // 02Hはリターンホームに使用されます-> RAMをクリアし、LCDを初期化しますLcd_Cmd(0x02); // 02Hはリターンホームに使用されます-> RAMをクリアし、LCDを初期化しますLcd_Cmd(0x08); //行1を選択Lcd_Cmd(0x00); //行1の表示をクリアLcd_Cmd(0x0C); //行2を選択Lcd_Cmd(0x00); //行2の表示をクリアLcd_Cmd(0x06); }
Lcd_Clear():この関数はLCD画面をクリアし、ループ内で使用して前のデータの外観をクリアできます。
Lcd_Clear(){Lcd_Cmd(0); // LCDをクリアしますLcd_Cmd(1); //カーソルを最初の位置に移動します}
void Lcd_Set_Cursor(x pos、y pos): 開始すると、LCDはコマンドを受け取る準備ができています。この関数を使用して、カーソルを希望の場所に設定するようにLCDに指示できます。の場合、1行目の5文字目にカーソルが必要だとします。その場合、関数はvoid Lcd_Set_Cursor(1、5)になります。
void Lcd_Set_Cursor(char a、char b){char temp、z、y; if(a == 1){temp = 0x80 + b-1; // 80Hはカーソルの移動に使用されますz = temp >> 4; //下位8ビットy = temp&0x0F; //上位8ビットLcd_Cmd(z); //行を設定Lcd_Cmd(y); //列を設定} else if(a == 2){temp = 0xC0 + b --1; z =温度>> 4; //下位8ビットy = temp&0x0F; //上位8ビットLcd_Cmd(z); //行を設定Lcd_Cmd(y); //列を設定}}
void Lcd_Print_Char(char data):カーソルが設定されると、この関数を呼び出すだけでその位置に文字を書き込むことができます。
void Lcd_Print_Char(char data)// 4ビットモードで8ビットを送信{charLower_Nibble、Upper_Nibble; Lower_Nibble = data&0x0F; Upper_Nibble = data&0xF0; RS = 1; // => RS = 1 Lcd_SetBit(Upper_Nibble >> 4); // 4 EN = 1シフトして上半分を送信します。for(int i = 2130483; i <= 0; i-)NOP(); EN = 0; Lcd_SetBit(Lower_Nibble); //下半分を送信EN = 1; for(int i = 2130483; i <= 0; i-)NOP(); EN = 0; }
void Lcd_Print_String(char * a):文字のグループを表示する場合は、文字列関数を使用できます。
void Lcd_Print_String(char * a){int i; for(i = 0; a!= '\ 0'; i ++)Lcd_Print_Char(a); //ポインタを使用して文字列を分割し、Char関数を呼び出します}
各時間Lcd_Print_Char(文字データ) と呼ばれるが、そのそれぞれの文字の値は、LCDのデータラインに送られます。これらの文字はビット形式でHD44780Uに到達します。このICは、次の表に示すように、ROMメモリを使用してビットを表示する文字に関連付けます。HD44780ULCDコントローラーのデータシートにすべての文字のビットがあります。
ヘッダーファイルに満足したので、回路を構築してプログラムをテストしましょう。上記のリンクにある完全なヘッダーファイルも確認してください。
回路図とテスト:
以下は、16x2LCDとPICマイクロコントローラーのインターフェースの回路図です。
前のチュートリアルで使用したものと同じボードを使用しているため、上記の回路では電源またはICSP接続を示していません。ここを確認してください。
プログラムで注意すべき重要なことの1つは、LCDのピン定義です。
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
これらのピン定義は、プログラマーのハードウェア設定に応じて変更できます。ここで変更する場合は、main関数で尊重されるポート構成を変更することを忘れないでください。
このプロジェクトのハードウェアは非常にシンプルです。前回使用したものと同じPICモジュールを再利用し、ジャンパー線を使用してLCDモジュールをPICに接続します。
この接続は、次の表で理解できます。
LCDピン番号 |
LCDピン名 |
MCUピン名 |
MCUピン番号 |
1 |
接地 |
接地 |
12 |
2 |
VCC |
+ 5V |
11 |
3 |
VEE |
接地 |
12 |
4 |
レジスタ選択 |
RD2 |
21 |
5 |
読み書き |
接地 |
12 |
6 |
有効にする |
RD3 |
22 |
7 |
データビット0 |
NC |
- |
8 |
データビット1 |
NC |
- |
9 |
データビット2 |
NC |
- |
10 |
データビット3 |
NC |
- |
11 |
データビット4 |
RD4 |
27 |
12 |
データビット5 |
RD5 |
28 |
13 |
データビット6 |
RD6 |
29 |
14 |
データビット7 |
RD7 |
30 |
15 |
LEDポジティブ |
+ 5V |
11 |
16 |
LEDネガティブ |
接地 |
12 |
次に、接続を確立し、コードをMCUにダンプして、出力を確認します。
ご不明な点やご不明な点がございましたら、コメント欄をご利用ください。以下のデモビデオも確認してください。