はじめに
前回、正体が分かった液晶ディスプレイ(TX1094A-02)を、PSoC 5LP Prototyping Kitを使って表示させる方法をまとめました。この液晶ディスプレイはコモン電極が多い以外は、特殊な機能は無いので、PSoCマイコンでセグメントLCDを利用する方法を中心に説明します。
開発環境
PSoCマイコンの開発には無償で利用できる、PSoC Creator 4.2を使用します。
PSoC® Creator™ Integrated Design Environment (IDE)
PSoC Creatorは、Windowsにしか対応していないので、Windows環境が必要です。
概要
液晶ディスプレイ(TX1094A-02)はバックライトや端子は付いていますが、セグメントLCDの駆動回路や電源回路を持っていないので、マイコンの電子工作でよく使われるI2Cインターフェースを持った液晶モジュールのようには使えません。
セグメントLCDの駆動回路を持たないマイコンで、プログラムと電圧生成のための外部回路を使ってLCDの表示を行う例もありますが、正確な仕様が分からないので、動作する可能性を高くするために、駆動回路を持っているPSoCマイコンを利用しました。
PSoCマイコンでセグメントLCDの駆動回路を利用する場合は「Segment LCD」コンポーネントを使用します。
「Segment LCD」コンポーネントには、7セグメントの数字や、メーターなど、よく使われる表示のパターンを楽に制御するための関数を生成する「Display Helper」機能があります。
以降で、「Display Helper」を使用しないで表示を行った後、同じプロジェクトへ「Display Helper」を追加し、「Segment LCD」コンポーネントと、「Display Helper」を利用した場合のイメージをつかみます。
ハードウェアの準備
ブレッドボード上に、液晶ディスプレイ(TX1094A-02)とPSoC 5LP Prototyping Kitを表1のように配線します。配線のイメージは図1を参考にしてください。
com/seg | PSoC 5LP | TX1094A-02 |
---|---|---|
com0 | P3[3] | 2 |
com1 | P3[4] | 3 |
com2 | P3[5] | 4 |
com3 | P3[6] | 5 |
com4 | P3[7] | 6 |
com5 | P15[0] | 7 |
com6 | P15[1] | 8 |
seg0 | P0[5] | 1 |
seg1 | P0[6] | 9 |
seg2 | P0[7] | 1 |
seg3 | P2[7] | 10 |
seg4 | P2[6] | 11 |
seg5 | P2[5] | 12 |
seg6 | P2[4] | 13 |
seg7 | P2[3] | 14 |
表1
ブレッドボード上で配線した結果が写真1です。
コンポーネントの設定とプログラム
PSoC Creatorで新規プロジェクトを作成し、「TopDesign」に「Segment LCD」コンポーネントを配置します。今回は、プロジェクト名やコンポーネント名は、デフォルトのまま使用します。
手順1 – 新規プロジェクトの作成する
PSoC Creatorを起動して、[File]->[New]->[Project…]メニューから「Create project」画面を開きます。
ターゲットデバイスを画面1のように設定して、以降はデフォルト設定のまま、空の新規プロジェクトを作成します。
手順2 – 詳細なデバイスの選択する
新規プロジェクトを作成後、「Project Explorer」(画面4)のデバイスの表示が「CY8C5888LTI-LP097」になっているかを確認し、異なる場合は変更します。
「Project Explorer」のプロジェクトルートを右クリックして[Device Selector…]メニューから「Select Device」画面(画面5)を開きます。
「Device Selector」画面にリストされているデバイスが多いので、「Package」を「68-QFN」のみにしてフィルタをかけると「CY8C5888LTI-LP097」(画面6)が見つけやすいです。
手順3 – 「Segment LCD」コンポーネントの設定する
「Component Catalog」から[Display]->[Segment LCD]をドラッグ&ドロップして、画面中央の「TopDesign」(画面7)へ配置します。
配置した「Segment LED」コンポーネントをダブルクリックして設定画面を開き「Basic Configuration」タブで、コモン電極の数を7に変更します。合わせて、デフォルトの設定では電圧(Bias Voltage)が高すぎてオフの部分に残像が出るのと、更新頻度(Framte Rate)が遅すぎてチラつくので以下のように変更します(画面8)。
- 「Frame Rate, Hz」を60に設定する
- 「Bias Voltage, V」を2.509に設定する
制御する電極の数が決まると、セグメントとコモンの各組合せ(LCDの1つのセグメントに対応)を表すマクロ名が生成されます。ユーザープログラムからは、このマクロ名で制御するセグメントを決めます。生成されたマクロ名は「Display Helpers」タブの下部にある表(画面9)で確認できます。
自動で生成されたマクロ名は単純な連番で扱いづらいので、前回調べた「変換基板のピン番号と、電極(セグメントとコモン)の組み合わせ(表2)」に合わせて画面10のように変更します。
com6 (8) | com5 (7) | com4 (6) | com3 (5) | com2 (4) | com1 (3) | com0 (2) | |
seg0(1) | 7a | 6a | 5a | 4a | 3a | 2a | 1a |
seg1(9) | 7b | 6b | 5b | ※1 | 3b | 2b | ※1 |
seg2(10) | 7c | 6c | 5c | ※1 | 3c | 2c | 1c |
seg3(11) | 7d | 6d | 5d | ※1 | 3d | 2d | 1d |
seg4(12) | 7e | 6e | 5e | ※1 | 3e | 2e | 1e |
seg5(13) | 7f | 6f | 5f | ※1 | 3f | 2f | 1f |
seg6(14) | 7g | 6g | 5g | ※1 | 3g | 2g | 1g |
seg7(15) | 7h | 6h | 5h | 4h | 3h | 2h | 1h |
表2
ユーザープログラムでは、接頭辞としてコンポネント名が付くので数字で始めても問題ありません。また、マクロ名になるため同一コンポーネント内で重複する名前は付けられません。
「Display Helper」を利用しない場合、ここまでの設定で終了です。[Build]->[Generate Application]メニューからコードの自動生成を行います。
手順4 – コンポーネントの入出力と物理のピンを対応させる
「Project Explorer」の[Pins]をダブルクリックして物理ピンの設定画面(画面12)を開きます。
手順3の最後で行ったコードの自動生成(Generate Application)により、自動でコンポーネントの入出力と物理ピンの対応が作成されています(画面13)。
しかし、使用するピンは決めているので表1に合わせて再設定します(画面14)。
ユーザープログラムを作成する時に、コードの入力補完や静的チェックを有効にするために、コンポーネントの設定を変更したら必ずコードの自動生成(Generate Application)を行います。この時に、利用できない物理ピンを指定した場合は、エラーとなるので修正を行います。
例えば、P12[n]のピンはアナログ出力が行えないため「Segment LCD」の出力に割り当てるとエラーとなります。
手順5 – プログラム作成(Display Helperを利用しない場合)
「Project Explorer」の[Source Files]内にある[main.c]をダブルクリックして、main.cファイルを開きユーザープログラムを作成していきます(画面15)。
スケルトンコードはシンプルで、無限ループを持ったmain関数が一つあるだけです。
コンポーネントを利用した場合、自動生成された「コンポーネント名_Start()関数」により有効にする必要があります。コードの入力補完が効くので名前の一部が分かれば楽に入力できます。
個別のセグメントを表示するためには「コンポーネント名_WritePixel()関数」を利用します。この関数には2つのパラメータがあります。
- 1つ目は表示したいセグメントを表す番号で、手順3で設定したセグメントに対する名前から生成されたマクロ名「コンポーネント名_マクロ名」になります。
- 2つ目は表示のオンオフを決める値で、オンなら1、オフなら0を設定します。
詳細は「Segment LCD」コンポーネントの設定画面の左下にある[Datasheet]ボタンで表示できるデータシートを参照してください。
例として、中央の「℃」を表示するコードは以下のようになります。
コードを見ての通り、オフにしないのならWritePixel関数を、1度呼び出すだけで駆動回路により適切な表示を維持します。
コード
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include "project.h"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
LCD_Seg_1_Start();
LCD_Seg_1_WritePixel(LCD_Seg_1_2A, 1);
for(;;)
{
/* Place your application code here. */
}
}
/* [] END OF FILE */
手順6 – プログラムをデバイスへ書き込む
書き込むプログラムは、[File]->[File Load…]メニュー(または[F4])からファイル選択ダイアログを開きファイルを選択します。
すべてデフォルトの名前を使っているならば、「C:\Users\ユーザー名\Documents\PSoC Creator\ワークスペース名\プロジェクト名.cydsn\CortexM3\ARM_GCC_541\Debug\プロジェクト名.hex」となります。前回選択したファイルは「PSoC Programmer」を再起動しても記憶されているので、前回と同じならばファイル選択は不要です。
「PSoC 5LP Prototyping Kit」と正しく接続できていれば、画面左上の「Port Selection」リストに「KitProg/xxxxxx」が表示されます。
「PSoC 5LP Prototyping Kit」の接続と、書き込みファイルの選択が正しく行われると、書き込み機能が有効になるので[File]->[Program]メニュー(または[F5])で書き込みを行います(画面16)。
実行結果
「℃」のような特殊な要素なら、WritePixel関数による表示が向いていますが、数字やメーターなど多く使われるパターンの表示ロジックをゼロから作るのは面倒です。この数字やメーターなどの表示ロジックを、使用するセグメントの対応付けだけで、自動生成してくれるのが「Display Helper」です。
手順7 – Display Helperを追加する
「Segmen LCD」の設定画面を開き「Display Helpers」タブで、「Display Helper」を追加します。
例として、液晶画面中央の数字2桁の設定を行います。
手順7-1 7セグ数字2桁のHelperを設定する
「Helpers」リストから[7 Segment]を選択して、[右矢印]ボタンにより「Selected Helpers」リストへ追加すると、画面中段の「Helper function configuration」に1桁の7セグ数字のイメージが表示されます。2桁にしたいので、[+]ボタンより桁を増やします(画面17)。
「Helper function configuration」のイメージからセグメントをドラッグ後、「Pixel Mapping Table」の対応させたいセグメントにドロップすると設定できます。
前回調べた表示パターン(写真3)を元に設定した結果が画面18になります。
「Pixel Mapping Table」のマクロ名は変更更新されますが、ヘルパー関数を介して制御を行うので名前はそのままで問題ありません。
設定後に、コードの自動生成(Generate Application)を行いヘルパー関数を生成します。
手順8 – プログラムの作成(Display Helperを利用した場合)
自動生成により、いくつかのヘルパー関数が追加されます。
例えば「コンポーネント名_Write7SegNumber_n()関数」(nは0始まりの連番)は渡された数値を、桁を考慮して表示する関数です。
この関数には3つのパラメータがあります。
- 1つ目は表示する数値です。「Helper」で設定した桁以上の値を渡した場合、上位の桁は表示されません。
- 2つ目は表示を開始する桁です。0始まりで下位の桁から上位の桁に向けて増加します。
- 3つ目は上位桁の0を表示するか制御するフラグです。数値が表示桁数未満の場合に、左0埋めにするなら1を、何も表示させないなら0を指定します。
詳細は「Segment LCD」コンポーネントのデータシートを参照してください。
「コンポーネント名_Write7SegNumber_n()関数」を利用した、0から99までをカウントして表示するコードは以下のようになります。
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include "project.h"
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
LCD_Seg_1_Start();
LCD_Seg_1_WritePixel(LCD_Seg_1_2A, 1);
uint16 n = 0;
for(;;)
{
/* Place your application code here. */
LCD_Seg_1_Write7SegNumber_0(n, 0, 0);
CyDelay(300);
n = (n + 1) % 100;
}
}
/* [] END OF FILE */
実行結果
おまけ
表示パターンの全セグメントを順に表示させるコードは以下のようになります。
/* ========================================
*
* Copyright YOUR COMPANY, THE YEAR
* All Rights Reserved
* UNPUBLISHED, LICENSED SOFTWARE.
*
* CONFIDENTIAL AND PROPRIETARY INFORMATION
* WHICH IS THE PROPERTY OF your company.
*
* ========================================
*/
#include "project.h"
const uint16 TX1094A_SEGS[] =
{
LCD_Seg_1_7A, LCD_Seg_1_7B, LCD_Seg_1_7C, LCD_Seg_1_7D,
LCD_Seg_1_7E, LCD_Seg_1_7F, LCD_Seg_1_7G, LCD_Seg_1_7H,
LCD_Seg_1_6A, LCD_Seg_1_6B, LCD_Seg_1_6C, LCD_Seg_1_6D,
LCD_Seg_1_6E, LCD_Seg_1_6F, LCD_Seg_1_6G, LCD_Seg_1_6H,
LCD_Seg_1_5A, LCD_Seg_1_5B, LCD_Seg_1_5C, LCD_Seg_1_5D,
LCD_Seg_1_5E, LCD_Seg_1_5F, LCD_Seg_1_5G, LCD_Seg_1_5H,
LCD_Seg_1_4A, LCD_Seg_1_4H,
LCD_Seg_1_3A,
LCD_Seg_1_H7SEG0_D, LCD_Seg_1_H7SEG0_C, LCD_Seg_1_H7SEG0_E,
LCD_Seg_1_H7SEG0_G, LCD_Seg_1_H7SEG0_B, LCD_Seg_1_H7SEG0_F,
LCD_Seg_1_H7SEG0_A,
LCD_Seg_1_2A,
LCD_Seg_1_H7SEG1_D, LCD_Seg_1_H7SEG1_C, LCD_Seg_1_H7SEG1_E,
LCD_Seg_1_H7SEG1_G, LCD_Seg_1_H7SEG1_B, LCD_Seg_1_H7SEG1_F,
LCD_Seg_1_H7SEG1_A,
LCD_Seg_1_1A, LCD_Seg_1_1C, LCD_Seg_1_1D, LCD_Seg_1_1E,
LCD_Seg_1_1F, LCD_Seg_1_1G, LCD_Seg_1_1H,
};
int main(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
LCD_Seg_1_Start();
int seg_max = sizeof(TX1094A_SEGS)/sizeof(TX1094A_SEGS[0]);
uint8 px_status = 1;
for (;;)
{
for (int i=0; i<seg_max; i++)
{
LCD_Seg_1_WritePixel(TX1094A_SEGS[i], px_status);
CyDelay(200);
}
// toggle the pixelStatus
px_status = 1 - px_status;
}
}
/* [] END OF FILE */
実行結果
まとめ
謎の液晶ディスプレイ(TX1094A-02)を駆動させる過程で、PSoCマイコンでセグメントLCDの直接駆動を行う設定と手順の概要はつかめました。
液晶ディスプレイ(TX1094A-02)はatendoの店頭特売品なので、いつまで入手できるか分からないですが、PSoCマイコンによりセグメントLCDを直接駆動する方法は、駆動回路を持たない安価な液晶ディスプレイにも応用できるので良しとします。