2014年4月22日火曜日

PSoC5LPでキャラクターLCDを使おう!

「キャラクターLCDはちょっと値段が高いし
壊したり、扱い切れないともったいないよなぁ・・・」

PSoC5LPなら
設定も簡単に、易しく、表現豊かに
扱うことができます。

さて、キャラクターLCDモジュールを使って
文字(アスキーコード)
数字(整数)
バーグラフ
をキャラクターLCDに表示させましょう。

使うキャラクターLCDモジュールは
HD44780互換のモジュール
(秋月だとSC1602***系のLCDモジュール、心配ならお店の人と相談しよう。)

つなぎ方が気になるかと思う。けれど先にPSoC5LPで使う
ポート決めて置く方が先になります。
「ポート」と言うのは
「ある7本のピンを1つのカデゴリーとして表すこと」です。
ちょうど、住所を
緯度と経度で書くのか、
市区町村の番地で書くのか
だと近いかも??。


LCDのデータ入出力用のピンが6本あるのですが
設定の時点で、ポートごとの設定となってしまいます。なので
今回は先に使うポートをザックリ決めておいてください。


さて、まずは「LEDチカチカしようの準備編」の状態から
「Character LCD」をドラックアンドドロップだけ


さて、ドラックアンドドロップしたら

ダブルクリックをして設定をしましょう。


ここで設定できるのは、
「バーグラフ」の設定で
「Vertical Bargraph」は、垂直棒グラフ
「Horizontal Bargrah」は、水平棒グラフ

今回は水平棒グラフを選びます。

そうしたら、「OK」ボタンを押して閉じましょう。

次にポートの設定をしましょう。
[****].cydwrをダブルクリックして
「Pin」のタブでつなぐポートの設定しましょう。
「Port」のプルダウンメニューを開くと不思議な表記になっていますね。

P*[6:0]とP*[7:1]と言うような表記ですね。
これは、ポート*の何番目から何番目まで使いますよ。
って言う表記です。

カッコの中のコロン(:)の右側が「X番目から」と言う意味で
コロンの左側が「Y番目まで」と言う意味なのです。
今回の表記だと、
「ポート*番の0番目~6番目まで」
もしくは
「ポート*番の1番目~7番目まで」
が選択できるようになっています。
ポートはどこでも良いのですがP*[6:0]と表記されているタイプが良いでしょう。

選んだら、一度コンパイル。
ここまで来たら、LCDモジュールの準備をしましょう。
まずは、LCDのバックライトが点灯する様に抵抗とジャンパーをはんだづけします。
(へたくそだったのでJ3のパターンを壊しただけです。)


PSoC5LPとキャラクターLCDのつなぎ方はコンポーネットの
データシートにあるのでそれを見ましょう。
つなぎ方を見やすくしたのでこれを参考にすると良いでしょう。


PSoC5LPとの接続ができたら、
「main.c」をダブルクリックして、main.cのタブを出しましょう。

まずは
Int main(){…の中に

LCD_Char_1_Start();
LCD_Char_1_Position(0,0);
LCD_Char_1_PrintString("Hello PSoC5LP");

と書きましょう。

LCDモジュールに文字や数字を書くには
LCDのここから書き始めて!」っと言うのをプログラムに書きます。
ディスプレイ内を行と列として扱うことで「LCDのここ!」を指定できます。
2列16行の場合このようになっていて

左上が「0行0列」となっています。

LCD_Char_1_Position(0,0);
が「ここから書き始めて」っという事です。
次の行に書いた
LCD_Char_1_PrintString(Hello PSoC5LP);

Stringとあるように「文字列」なんです。
表示させたいことを()の中“”の中に書きます。
残念ながら日本語の表示には対応していないので、
アスキーコードの中にあるものしか使えません。

数値の場合は
LCD_Char_1_PrintNumber();
となります。PrintNumber()の場合は“”は要りません。
ただし16bit整数しか使えません。つまり0~65536までしか扱えないので
注意してください。(小数点も使いたい場合、文字に変換するひと手間がいります。)

さてバーグラフは
uint8 Bar=0;
   
    while(Bar <=80){
   
    LCD_Char_1_DrawHorizontalBG(1,0,16,Bar);
    CyDelay(200);
    Bar++;
   
    }
とこんな感じに書くと動きます。

LCDに書いている本体は
LCD_Char_1_CrawHorizontalBG(,始めの列,終わりの列,ここまで書く)

となっていて、「ここまで書いて」と言うのは
LCD表示の1つのブロックを縦に5等分したものを「1個」としています。
「80」の場合、始めの列から縦に80個分という事になります。

今回は、プログラムが単純な割に長いので
私が書いたものをコピーしておきます。

int main()
{
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    LCD_Char_1_Start();
   
    LCD_Char_1_Position(0,0);//0行0列に書く
    LCD_Char_1_PrintString("Hello PSoC5LP");//書くのは文字列
    CyDelay(2000);
    LCD_Char_1_ClearDisplay();//ディスプレイをすべて消せ!
   
    LCD_Char_1_Position(0,0);//0行0列に書く
    LCD_Char_1_PrintString("print number");
    LCD_Char_1_Position(1,0);//1行0列に書く
    LCD_Char_1_PrintNumber(43210);//書くのは数値
   
    CyDelay(2000);
   
    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString("Downlod START");
   
    uint8 Bar=0;//8bitの整数の箱
   
    while(Bar <=80){
   
    LCD_Char_1_DrawHorizontalBG(1,0,16,Bar);//水平バーグラフを書け
    CyDelay(200);
    Bar++;
   
    }
   
    LCD_Char_1_ClearDisplay();
   
    LCD_Char_1_Position(0,0);
    LCD_Char_1_PrintString("Exit Test");
   
    LCD_Char_1_Position(1,0);
    LCD_Char_1_PrintString("==Complete==");
   
    /* CyGlobalIntEnable; */ /* Uncomment this line to enable global interrupts. */
    for(;;)
    {
        /* Place your application code here. */
    }
}

これに書き替えたら、もう一度コンパイル。

LCDモジュールとPSoC5LPとの配線が比較的にややこしいかと思いますので
ゆっくり配線するのがいいでしょう。

 ~~2行のLCDと4行のLCD~~
HD44780互換のLCDモジュールには
2行16列のタイプと4行20列のタイプがあります。

どちらも動かすのが可能ですが、
0行19列を超えると1行0列となってしまいます。

2行16列のタイプを使う方が簡単なのでそちらを使うことを勧めます。

0 件のコメント:

コメントを投稿