キャラクタ液晶表示方法
(4ビットパラレル制御)
(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード)
キャラクタ液晶に文字を表示できるようになっているといろいろな場合に役に立ちます。 電子機器の入出力表示だけでなく、開発段階でのデバックなどにも使えます。 仕様、価格、入手性から、キャラクタ液晶としてはアスキー文字やANK文字(半角カタカナなど)16文字x2列で表示できる秋月電子の LCDキャラクタディスプレイモジュール(16x2行バックライト無)SC1602BS-Bがおすすめです。 以下に、このキャラクタ液晶をPIC32MZで使用した例を紹介します。 使用している液晶表示ライブラリは後閑哲也さんがつくられたCCSコンパイラ用液晶表示ライブラリ 1lcd_lib.cをもとに、XC32コンパイラ対応等で変更したものです。 |
<仕様>
・PIC32MZが立ち上がったら以下をキャラクタ液晶に表示する。
尚、キャラクタ液晶は秋月電子のLCDキャラクタディスプレイモジュール(16x2行バックライト無)SC1602BS-Bとする。
1行目: "PIC32MZ HARMONY"
2行目: "Now Running !!"
・その後、キャラクタ液晶は画面1と画面2を2sec毎に切り替えて表示する。
画面1 : 1行目: "Hellow World !!"
2行目: "ASCII Moji N=XXX"
画面2 : 1行目: "ミナサン コンニチワ !!"
2行目: "ANK: Moji N=XXX"
(注) XXXはの繰り返した回数、
・キャラクタ液晶制御は以下とする。
4ビットパラレル制御
データピン: DB4……RA9、DB5……RA10、DB6……RB11、DB7……RA1
制御ピン : rs……RB6、stb……RB7、
<回路図>(→PDFファイル)
<外観>
PIC32MZ評価ボード MZ100-A001の マザーボードにQFPモジュールとキャラクタ液晶を取り付けたものです。
<動作結果> (プログラム動作中の動画がYouTubeで再生します → 動画)
液晶画面1 | 液晶画面2 |
![]() |
![]() |
<解説>
キャラクタ液晶ライブラリの使い方について説明します。
尚、解説では、画面1と画面2を2sec毎に表示する部分については省略してあります。
■ 適用液晶
名称 | 型式 | 適用 電圧 |
バックライト | 文字数 (ASCII、ANK文字) |
備考 | |
① | LCDキャラクタディスプレーモジュール | SC1602BS-B | 5v | 無 | 16文字x2行 | PIC32MZ評価ボードで使用 |
② | LCDキャラクタディスプレーモジュール | SC1602BSLB | 5v | 有 | 16文字x2行 | |
③ | LCDキャラクタディスプレーモジュール | SC1602BBWB-XA-GB-G | 5v | ブルー背景白文字 バックライト付白抜き |
16文字x2行 | |
④ | LCDキャラクタディスプレーモジュール | SC1602BBWB-XA-LB-G | 3.3v | ブルー背景白文字 バックライト付白抜き |
16文字x2行 |
■ 液晶の各ピンへの接続要領
4ビットパラレル制御を行い、また液晶からPICへのチェック信号はすべてOKとして確認制御を省略しますので 実際にPIC側から制御するピンは
RS、E(STB)、DB4、DB5、DB6、DB7の6ピンだけとなります。 液晶のVddが5vでも 液晶の各ピンの入力 H レベルのスレッシュホールドレベルは
2.2v ~ Vdd、 入力 L レベルのスレッシュホールドれべるは-0.3v ~ +0.6vなのでPICのポートと直結できます。
尚、制御に使用するピンは 連続したポート(例えばRB0、RB1、RB2、RB3)である必要はありません。任意の6つの汎用I/OポートでOKです。
ピン番号 | 名称 | 内容 | 接続要領 |
1 | GND | GNDに接続します。 | |
2 | Vdd | Vdd(5.5v or 3.3v)に接続します。 | |
3 | V0 | コントラスト調整用ピン | 可変抵抗により 0 ~ Vdd(5.5v or 3.3v)が印加できるように します。 |
4 | RS | レジスタセットピン、コマンドモードorデータモードの設定 | PICの汎用I/Oポートをデジタルの出力モードで接続します。 |
5 | R/W | 読み込みモード or 書き込みモードの設定 | 本ライブラリでは液晶への書き込みモードのみを 使用するので 常にGND(書き込みモード)に接続します。 |
6 | E(STB) | ストローブピン、データ送信のタイミングを示す | PICの汎用I/Oポートをデジタルの出力モードで接続します。 |
7 | DB0 | 下位4ビットデータ | 本ライブラリでは、4ビットパラレルモードで制御を行うので DB0-DB3は使用しません。したがって、すべてGNDに接続 します。 |
8 | DB1 | ||
9 | DB2 | ||
10 | DB3 | ||
11 | DB4 | 上位4ビットデータ | ・本ライブラリでは、この4ビットでコマンドとデータの送信を 行います。 ・PICの汎用I/Oポートをデジタルの出力モードで接続します。 |
12 | DB5 | ||
13 | DB6 | ||
14 | DB7 |
以下、接続例として Vdd = 5v PIC32MZ2048EFH100の制御電圧3.3v、 制御の各ピンが下記の場合の接続要領を下記回路図(→PDFファイル)に示します。
RS……RB6、 E(STB)……RB7、DB4……RA9、DB5……RA10、DB6……RB11、DB7……RA1
■ プロジェクトへの追加、インクルード
キャラクタ液晶のライブラリは 1lcd_lib_XC32.h、と1lcd_lib_XC32.c に分かれています。
① 1lcd_lib_XC32.h と1lcd_lib_XC32.cを main.cがあるフォルダにコピーします。
② 1lcd_lib_XC32.h と1lcd_lib_XC32.cをプロジェクトに追加します。
③ ダウンロードした1lcd_lib_XC32.hは、PIC32MZ2048EFH100でRS……RB6、 E(STB)……RB7、DB4……RA9、DB5……RA10、
DB6……RB11、DB7……RA1 の場合です。他のポートに変更する場合は MPLABXやエディタで所要(PICのポート名、
ポートの出力モード設定、ポートのデジタルモード設定等)の修正を行います。下記の青線太字部を精読して、同様の要領で
修正してください。 当然のことながらアナログポート仕様がないポートを使用する場合はデジタルポート設定のコマンドは不要です。
この1lcd_lib_XC32.hのファイルの中で全ポートの出力モード設定、ポートのデジタルモード設定等を行うのでMHC
(MPLABX Harmony Configurator)での設定は必要ありません。
また、システムクロックを変更する場合は、#define lcd_Clock 200000000 を変更してください。 たとえば200MHz → 100MHzに
変更する場合は #define lcd_Clock 100000000 に変更してください。
//************************************************************************* //インクルードファイル 1lcd_lib_XC32.h //このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ //1lcd_lib.cをもとに、XC32コンパイラ対応等で変更したものです。 //************************************************************************* #include <p32xxxx.h> #define lcd_Clock 200000000 //システムクロック //単位はHzで指定 // LCDポート設定 #define lcd_port_DB7 LATAbits.LATA1 //LCDのDB7(14番ピン)に接続されるPIC側ポート番号設定 #define lcd_port_DB6 LATBbits.LATB11 //LCDのDB6(13番ピン)に接続されるPIC側ポート番号設定 #define lcd_port_DB5 LATAbits.LATA10 //LCDのDB5(12番ピン)に接続されるPIC側ポート番号設定 #define lcd_port_DB4 LATAbits.LATA9 //LCDのDB4(11番ピン)に接続されつPIC側ポート番号設定 #define lcd_rs LATBbits.LATB6 //LCDのrs(4番ピン)に接続されるPIC側ポート番号設定 #define lcd_stb LATBbits.LATB7 //LCDのstb(6番ピン)に接続されるPIC側ポート番号設定 //LCDポート: 出力モード設定 #define lcd_port_DB7_ConfigOut() TRISAbits.TRISA1 = 0 #define lcd_port_DB6_ConfigOut() TRISBbits.TRISB11 = 0 #define lcd_port_DB5_ConfigOut() TRISAbits.TRISA10 = 0 #define lcd_port_DB4_ConfigOut() TRISAbits.TRISA9 = 0 #define lcd_rs_ConfigOut() TRISBbits.TRISB6 = 0 #define lcd_stb_ConfigOut() TRISBbits.TRISB7 = 0 //LCDポート: デジタルモード設定 #define lcd_port_DB7_ConfigDigital() ANSELAbits.ANSA1 = 0 #define lcd_port_DB6_ConfigDigital() ANSELBbits.ANSB11 = 0 #define lcd_port_DB5_ConfigDigital() ANSELAbits.ANSA10 = 0 #define lcd_port_DB4_ConfigDigital() ANSELAbits.ANSA9 = 0 #define lcd_rs_ConfigDigital() ANSELBbits.ANSB6 = 0 #define lcd_stb_ConfigDigital() ANSELBbits.ANSB7 = 0 void lcd_out(volatile char code, volatile char flag); void lcd_data(volatile char asci); void lcd_cmd(volatile char cmd); void lcd_clear(void); void lcd_init(void); void lcd_str(char *str); |
|
//************************************************************************** //インクルードファイル 1lcd_lib_XC32.c //このファイルは後閑哲也さんが設計されたCCSコンパイラ用液晶表示ライブラリ // 1lcd_lib.cをもとに、XC32コンパイラ対応等で変更したものです。 //************************************************************************** /////////////////////////////////////////////// // 液晶表示器制御ライブラリ for XC32コンパイラー // 内蔵関数は以下 // lcd_init() ----- 初期化 // lcd_cmd(cmd) ----- コマンド出力 // lcd_data(chr) ----- 1文字表示出力 // lcd_clear() ----- 全消去 // lcd_str(str*) ----- 文字列表示 ////////////////////////////////////////////// #include "1lcd_lib_XC32.h" void lcd_delay_us(volatile unsigned int usec) //1μsec遅延関数 { volatile int count; count = (int)(lcd_Clock/20000000)*usec; do //実測: at 200MH (Clock=200000000) { //delay_us(1000)→1000.4μsec、 delay_us(100)→100.6μsec、delay_us(10)→10.5μsec、delay_us(1)→1.5μsec asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP");asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); count--; }while(count != 0); } void lcd_delay_ms(volatile unsigned int msec) //1msec遅延関数 { volatile unsigned int i; for(i=0; i<msec; i++) lcd_delay_us(1000); } //////// データ出力サブ関数 void lcd_out(volatile char code, volatile char flag) { if(code & 0b10000000)lcd_port_DB7 = 1; //LCDのDB7への出力セット else lcd_port_DB7 = 0; if(code & 0b01000000)lcd_port_DB6 = 1; //LCDのDB6への出力セット else lcd_port_DB6 = 0; if(code & 0b00100000)lcd_port_DB5 = 1; //LCDのDB5への出力セット else lcd_port_DB5 = 0; if(code & 0b00010000)lcd_port_DB4 = 1; //LCDのDB4への出力セット else lcd_port_DB4 = 0; if (flag == 0) lcd_rs = 1; // 表示データの場合 else lcd_rs = 0; // コマンドデータの場合 lcd_delay_us(3); //3μsecウェイト // lcd_delay_us(1); //1μsecウェイト lcd_stb = 1; // strobe(E) ON (Enable) lcd_delay_us(3); //3μsecウェイト // lcd_delay_us(1); // 1μsec : strobe信号の幅 lcd_stb = 0; // reset strobe } //////// 1文字表示関数 void lcd_data(volatile char asci) { lcd_out(asci, 0); // 上位4ビット出力 lcd_out(asci<<4, 0); // 下位4ビット出力 lcd_delay_us(50); //50μsecウェイト } /////// コマンド出力関数 void lcd_cmd(volatile char cmd) { lcd_out(cmd, 1); // 上位4ビット出力 lcd_out(cmd<<4, 1); // 下位4ビット出力 if((cmd & 0x03) != 0) // clear Homeの場合 lcd_delay_ms(2); // 2msec待ち else lcd_delay_us(50); //50μsecウェイト } /////// 全消去関数 void lcd_clear(void) { lcd_cmd(0x01); // 初期化コマンド出力 } /////// 文字列出力関数 void lcd_str(char* str) { while(*str) //文字列終端の '\0'を検出するまで { lcd_data(*str); // 1文字表示 str++; //ポインタをインクリメント } } /////// 初期化関数 void lcd_init(void) { //LCDポート: 出力モード設定 lcd_port_DB7_ConfigOut(); lcd_port_DB6_ConfigOut(); lcd_port_DB5_ConfigOut(); lcd_port_DB4_ConfigOut(); lcd_rs_ConfigOut(); lcd_stb_ConfigOut(); //LCDポートデジタルポート設定 lcd_port_DB7_ConfigDigital(); lcd_port_DB6_ConfigDigital(); lcd_port_DB5_ConfigDigital(); lcd_port_DB4_ConfigDigital(); lcd_rs_ConfigDigital(); lcd_stb_ConfigDigital(); lcd_delay_ms(20); //20msecウェイト lcd_out(0x30, 1); // 8bit mode set lcd_delay_ms(5); //5msecウェイト lcd_out(0x30, 1); // 8bit mode set lcd_delay_ms(1); //1msecウェイト lcd_out(0x30, 1); // 8bit mode set lcd_delay_ms(1); //1msecウェイト lcd_out(0x20, 1); // 4bit mode set lcd_delay_ms(1); //1msecウェイト lcd_cmd(0x2E); // DL=0 4bit mode lcd_cmd(0x08); // display off C=D=B=0 lcd_cmd(0x0D); // display on C=D=1 B=0 lcd_cmd(0x06); // entry I/D=1 S=0 lcd_cmd(0x02); // cursor home } |
④ MHC設定
■Options
■ Pin Settings
項目 | ポート設定 |
MHC | ![]() |
備考 | デフォルトからの変更要領 RG15/Function: GPIO_OUT (LED出力ポート設定) |
⑤ app.cに青字のコードを追記します。
1. ファイルをインクルードします。
#include <stdio.h>
#include "1lcd_lib_XC32.h"
(注) sprintf()を使うのでstdio.hをインクルードしないとコンパイルで警告がでます。
2. 表示文字列1行分のバッファを確保します。
char Buf[32];
(注) 17バイトが最少ですが 余裕がないと難解な不具合が発生することがあります。
3. ミナサン コンニチ ワ ! !の文字列Minasan_Konnichiwa[]をANK(Alphabet Numeric Kana: アンク)コードで定義します。
char Minasan_Konnichiwa[]
= {0xD0,0xC5,0xBB,0xDD,0x20,0xBA,0xDD,0xC6,0xC1,0xDC,0x20,0x21,0x21,0x20,0x20,0x20,0x00};
// ミ ナ サ ン コ ン ニ チ ワ ! !
4. μsec、msecの遅延関数 delay_us( )、delay_ms( )を定義します。
void delay_us(volatile unsigned int usec) //1μsec遅延
{
volatile int count;
count = (int)(delay_Clock/20000000)*usec;
……
……
5. APP_Initialize ( )で、ライブラリファイルを初期化します。
lcd_init(); // LCD初期化
6. カーソルを非表示、ブリンクOFFにします。
lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF
(注)カーソルを表示して、ブリンクさせる場合は、lcd_cmd(0b00001111); とします。
その他の液晶表示に関する各種コマンドは液晶に付属してくるデータシートを参照してください。
7. 表示をクリアします。
lcd_clear();
(注)ここでは、lcd_init(); の直後なので無くてもかまいません。
8. 表示の開始位置を1行目の先頭に設定します。
lcd_cmd(0x80); //1目の先頭へ
9. 表示したい文字をバッファーにコピーします。
sprintf(Buf,"PIC32MZ HARMONY ");//
10. バッファーの文字列を液晶に表示します。
lcd_str(Buf);
11. 表示の開始位置を2行目の先頭に設定します。
lcd_cmd(0xC0); //2行目の先頭へ
12. 表示したい文字をバッファーにコピーします。
sprintf(Buf,"Now Running !! ");
13. バッファーの文字列を液晶に表示します。
lcd_str(Buf);
14. LEDが点灯した場合
液晶1行目にHellow World !!を表示します。
また、液晶2行目には LED: ONと点灯回数XXをN=XXと 2秒間表示します。
if(LED == 0)
{
Num++;
LED = 1;
PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, 15 ); //RG15: LED点灯
// LATGbits.LATG15 = 1; //レジスタ直接
lcd_cmd(0x80); //1目の先頭へ
sprintf(Buf,"Hellow World !! ");//
lcd_str(Buf); //液晶表示
lcd_cmd(0xC0); //2行目の先頭へ
sprintf(Buf,"LED:ON N=%d ",Num); //
lcd_str(Buf); // 開始メッセージ1行目表示
delay_ms(2000);
}
15. LEDが消灯した場合
液晶1行目に ミナサン コンニチ ワ ! !を表示します。
また、液晶2行目には LED: OFFと点灯回数XXをN=XXと 2秒間表示します。
else
{
LED = 0;
PLIB_PORTS_PinClear( PORTS_ID_0, PORT_CHANNEL_G, 15 ); //RG15: LED消灯
// LATGbits.LATG15 = 0;
lcd_cmd(0x80); //1目の先頭へ
sprintf(Buf,Minasan_Konnichiwa);//
lcd_str(Buf); //液晶表示
lcd_cmd(0xC0); //2行目の先頭へ
sprintf(Buf,"LED:OFF N=%d ",Num); //
lcd_str(Buf); // 開始メッセージ1行目表示
delay_ms(2000);
}
以下、app.c
(参考)
★ プログラムの中で使っている整数を表示する。
int Value = 56789;
sprintf(Buf, "Num = %d",Value);
<実行結果>
★ プログラムの中で使っている浮動小数(小数点5桁以下を四捨五入して、表示は小数点以下4桁まで)を表示する。
float Value = 1.2345678;
sprintf(Buf,"Value = %.4f", Value); //
<実行結果>
★ カタカナを表示する。
char Minasan_Konnichiwa[]
= {0xD0,0xC5,0xBB,0xDD,0x20,0xBA,0xDD,0xC6,0xC1,0xDC,0x20,0x21,0x21,0x20,0x20,0x20,0x00};
// ミ ナ サ ン コ ン ニ チ ワ ! !
sprintf(Buf,Minasan_Konnichiwa);
<実行結果>
|
⑤ プロジェクトをビルトして、実行ファイルをPICに書き込みます。
<実行結果>