YS電子工作ラボ

グラフィックス液晶 INT035
 LED タッチ オンオフ

(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード


液晶に表示されるボタン(スイッチ)ウィジェットをクリックするとLEDがオンオフするプログラムです。このプログラムを設計する場合を 例にしてグラフィック液晶を使う場合の
① MHCの設定
② グラフィック液晶INT035のドライバーの組み込み方法
③ Graphics Composerによる液晶画面表示の操作方法
④ 外部I/Oの制御方法
   などを説明します。




<仕様>
 ・Harmony Ver.2のグラフィックスライブラリを使い液晶画面にボタンウィジェット(以下、ボタンと云う)を表示する。
 ・ボタンの表面には "LED ON/OFF"と表示する。文字は黒色とする。
 ・ボタン表面色は 水色(skyblue)とし、背景色は黄緑色(lightgreen)とする。
 ・グラフィック液晶は Displaytech社のINT035(3.5インチ、QVGA)とする。
 ・ボタンをクリックすると 4個のLEDが消灯している場合は点灯し、点灯している場合は消灯すること。
   尚、LEDはPIC起動後は消灯していること。
 ・LEDの点灯、消灯動作はボタンをリリース(指を離した時)のイベントにもとづき行われること。
 ・ボタンのチャタリング対策を織り込むこと。
 ・キャラクタ液晶も接続しタッチの位置を表示すること。 タッチ位置の座標原点(X= 0, Y = ,0)は左上とし、右下は(X = 320, Y = 240)とする。
   尚、タッチされていない場合は X = -1, Y = -1を表示のこと
 ・PIC起動時、キャラクタ液晶に以下を 2sec 表示すること
     1行目: Harmony Graphics
     2行目: LED Touch OnOff
   



<回路図> (→PDFファイル





<外観>PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。



<動作結果> (→ 動画:1080pのHD動画を見ることができます。) 

 ①タッチの瞬間 ②右下を鉛筆でクリックした瞬間 ③起動直後のキャラクタ液晶画面




<解説> 記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
        (以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なる点があるかもしれませんので注意してください。)

■ 新規プロジェクトの作成 (→ 新規プロジェクト作成手順
   PICは、PIC32MZ2048EFH100を選択します。 グラフィックに係る特段の設定はありません。
  忘れないで設定項目しておく項目としてencodingに Shift_JISを選択しておくことがあげられます。 これを忘れるとコメント欄が文字化けして
  しまいます。


 MHC設定 1 Options & Pin Settingsの設定

  Options

項目 ①Configuration設定
Device & Project Configuration
  > PIC32MZ2048 Device Configuration
②PMP設定 
Harmony Framework Configuration > Drivers
 > PMP
③ Touch Drivers 設定
Harmony Framework Configuration > Drivers
 > Touch Drivers
M
H
C

デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部
 主発振器: 24MHz

#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2
デフォルトからの変更要領:
 □Use PMP driver? : チェック追加
 Transfer size: PMP_DATA_SIZE_16BITS
 
デフォルトからの変更要領:
□Use GENERIC Driver?: チェック追加

④ Graphics Stacks 設定
Harmony Framework Configuration > Graphics Stacks
⑤Message 設定
Harmony Framework Configuration > System Services
>Message
⑥Touch ,Timer設定
Harmony Framework Configuration > System Services
 > Touch
Harmony Framework Configuration > System Services

 > Timer
M
H
C

デフォルトからの変更要領:
 □Use Graphics Stack?: チェックを追加
 Graphics display > Resolution >Height: 240
 Graphics controller >Select controller type
      : Generic Customizable Driver
   
デフォルトからの変更要領:
 □Use Message System Service?
                  : チェックを追加
 
デフォルトからの変更要領:
 □Use Touch System Service?
                 : チェックを追加
 □Use Timer System Service?
                 : チェックを追加


 Pin Settings
   LEDが接続されているポートを 出力モードに設定します。


 ① RG15ポート  ② RD4、RA14、RA15
M
H
C
 


 デフォルトからの変更要領:
 Function: GPIO_OUT
 デフォルトからの変更要領:
 Function: GPIO_OUT




 MHC設定2 Graphics Composerの設定 

項目 ① UtilityアイコンをクリックしてGaraphics Composerを開きます。 ② 以下の画面が デフォルト状態でのGaraphics Composerです。  ③Create New Screenアイコンをクリックするとダイアログが開きます。スクリーン名は変更できますがscreen1のままとし、Createボタンをクリックします。
Garaphics Composer  
備考   ・ スクリーンウィザードが現れた場合は閉じます。
・別のレイアウト状態から、このデフォルト状態に戻したい場合は メニューバーの[Window] → [Reset Dog Areas]をクリックします。
・スクリーン名は自動生成されるプログラムの関数名の一部として使用されるので プログラムの中に於いて、わかり易い名称をつけておきます。

④Screen Designerウィンドウに液晶画面作成用のデザイン画面が現れます。 ⑤スクリーン名defaultのスクリーンは不要なので 行を選択してDelete Screenアイコンをクリックして削除します。 ⑥Widget Tool Boxウィンドウの中からButtonウィジェットをscreen1スクリーンの中央部にドラッグしてきます。指でタッチしやすいサイズに拡大します。
Garaphics Composer  

画面サイズがW320 x H240が表示されていますが、異なる画面サイズが表示されている場合は Graphics Stacks > Graphics display > Resolution >Height: の設定が間違っている可能性があります。(MHC1 ④参照)  

⑦SchemesウィンドウのEdit Existing Schemeアイコンをクリックしてダイアログを開きます。 ⑧Background行のアイコンをクリックして、 Color Pikerダイアログを開き、LightGreen色を選択します。 ⑨SchemesウィンドウのCreate New SchemeアイコンをクリックしてButtonSchemeと云う名称のスキームをつくります。このスキームのBase行のをクリックして、Color Pickerダイアログを開きSkyBlues色を選択します。
Garaphics Composer

    スキームの名称変更はScheme EditorのNameに表示されている名称をダブルクリックすると変更できるようになります。

目 
⑩Tree View ウィンドウのLayer0を選択します。 次にProperty Editorウィンドウの項目Schemeのドロップダウンリストの中からdefaultを選択するとスクリーンのバックグラウンド色としてLightGreen色が選択されます。 ⑪同様に、ボタンウィジェットを選択してProperty Editorウィンドウの項目Schemeを選択すると表示されるドロップダウンリストの中からButtonSchemeを選択してボタンウィジェットの表面色をSkyBlue色にします。 ⑫ メニューバーから [Asset] → [String Table Configuration]を選択します。
Garaphics Composer

     

⑬一行目のdefaultをダブルクリックしてEnglishに変更します。 ⑭メニューバーの[Asset] → [Fonts]をクリックするとFonts Assetダイアログが開きますのでAdded Installed FontアイコンをクックしてSelect System Fontダイアログを開きます。  ⑮Windowsに標準で入っているArialを選択します。
 Garaphics Composer

これからボタンウィジェットの表面に記載する文字列のフォントを定義します。 をクリックすると ユーザ殿のPCに入っているPC用のフォントを全部検索して表示することからダイアログが表示されるまでかなり時間(例:20-30sec)がかかります。
 

⑯使用するフォントのサイズ、 また太字化、斜体化などの有無を選択します。 ⑰Rename Selected Fontアイコンを使って、使用するフォントの名称を諸元がわかり易い名称に変更しておきます。 ここでは Arial、サイズ16、太字(Bold)を選んだので Arial_26Bとします。 ⑱メニューバーの[Asset] → [Strings]をクリックしてAdd String Dialogダイアログを開き、ボタンウィジェットの表面に記載する文字列の名称を定義します。ここでは文字列の名称をLED_ON_OFFとします。記入が終わったらCreateボタンをクリックします。
 Garaphics Composer

     

⑲String Assetsダイアログが現れますので、FontにArial_26Bを選択し、Language English行のValue欄に ボタンウィジェット表面に記載する LED ON/OFFを記入します。 ⑳Screen Designerウィンドウでボタンウィジェットを選択して、Property Editorウィンドウの項目Text StringのドロップダウンリストからLED_ON_OFFを選択するとボタンウィジェット表面に LED ON/OFFの文字列が表示されます。 (21) 次にボタンウィジェットを選択してウィジェットの名前NameをLedButtonに変更します。そしてProperty EditorウィンドウのEventsのReleasedのチェックボックスにチェックを入れ、更にこの行の右端にあるアイコンをクリックします。
 Garaphics Composer
      ウィジェットの名前を変更するのはこの名前がイベントハンドラの中で使用されるのでプログラム作成時わかり易くするためです。

(22)Event Editor Releasedのダイアログが開くのでNewアイコンをクリックします。 (23)Action Edit ダイアログが開くのでイベントのアクション名を記載します。 ここではLed_Control とします。 LEDをON/OFFさせるプログラムはTemplateは使わないでC言語で直接記載するのでCustomにチェックを入れ、Nextボタンをクリックします。 (24)Action Editダイアログが現れます。 Custom Action Difnition欄は C言語で所要の動作を記載する欄ですが 後でまとめてコーディングするのでここでは コメントアウト//だけ記載します。
 Garaphics Composer

     Custom Action Difnition欄に記載した内容は、そのままLibaria_events.cに生成されます。

目 
(25)メニューバーの[File] → [save]で Graphics Composerの内容を保存します。  (26)Generate codeボタンをクリックしてプロジェクトファイルを生成します。  
Graphics Composer  

     


■キャラクタ液晶表示ライブラリの追加要領
  キャラクタ液晶表示のライブラリ 1lcd_lib_XC32.h と 1lcd_lib_XC32.cを main.cと同じフォルダにコピーして、プロジェクトに追加します。
                                              (使い方 → キャラクタ液晶表示方法 参照
  プロジェクトへの追加は以下のようにします。




■ INT035用グラフィックライブラリの追加要領
  INT035用グラフィックライブラリを以下の要領で組み込みます。
   以下の説明ではプロジェクトフォルダは"C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01 035 Led OnOff" です。

 ①  drv_gfx_generic.h
 

 "C:\microchip\harmony\v2_04\_WK\sample204\gfx1
         \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\driver\controller\generic\drv_gfx_generic.h"
上記パスにあるdrv_gfx_generic.hを開きファイル内容をすべて削除したあと、ys_drv_gfx_int035.h(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
"C:\microchip\harmony\v2_04\framework\gfx\driver\controller\generic\templates\drv_gfx_generic.h.ftl"
上記ファイルの内容をys_drv_gfx_int035.hの内容に変更しておくとMHCが自動的に所要の drv_gfx_generic.hを生成してくれます。また煩わしいプロジェクトファイル再生成時のチェックが発生しなくなります。

以下、ys_drv_gfx_int035.h
  drv_gfx_generic.c
 
 "C:\microchip\harmony\v2_04\_WK\sample204\gfx1
         \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\driver\controller\generic\drv_gfx_generic.c"
上記パスにあるdrv_gfx_generic.cを開きファイル内容をすべて削除したあと、ys_drv_gfx_int035.c(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
"C:\microchip\harmony\v2_04\framework\gfx\driver\controller\generic\templates\drv_gfx_generic.c.ftl"
上記ファイルの内容をys_drv_gfx_int035.cの内容に変更しておくとMHCが自動的に所要の drv_gfx_generic.hを生成してくれます。また煩わしいプロジェクトファイル再生成時のチェックが発生しなくなります。
以下、ys_drv_gfx_int035.c

 ③ gfx_driver_def.c
 
"C:\microchip\harmony\v2_04\_WK\sample204\gfx1
         \01 035 Led OnOff\firmware\src\system_config\default\framework\gfx\hal\gfx_driver_def.c"
上記パスにあるgfx_driver_def.cを開きファイル内容をすべて削除したあと、ys_gfx_driver_def_int035.c(以下参照)のファイル内容をコピーして貼り付けます。

以下、ys_gfx_driver_def_int035.c
 ④  drv_touch_generic.h
 

"C:\microchip\harmony\v2_04\framework\driver\touch\generic\drv_touch_generic.h"
drv_touch_generic.hの内容を削除したあと、ys_drv_touch_generic_int035.h(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
 このファイルはMHCの内部ファイルを変更することになるので、以降MHCが自動的に所要の drv_touch_generic.hを生成してくれます。

以下、ys_drv_touch_generic_int035.h
 ⑤  drv_touch_generic.c
 
"C:\microchip\harmony\v2_04\framework\driver\touch\generic\src\drv_touch_generic.c"
drv_touch_generic.cの内容を削除したあと、ys_drv_touch_generic_int035.c(以下参照)のファイル内容をコピーして貼り付けます。
(備考)
 このファイルはMHCの内部ファイルを変更することになるので、以降MHCが自動的に所要の drv_touch_generic.hを生成してくれます。

以下、ys_drv_touch_generic_int035.c




■ app.cに、青字部分を追加します。 
    
①インクルードファイルを追加します。stdio.hがないと、sprintf( )がコンパイラのバージョンによってコンパイルで警告となることが
  あります。  
   #include <stdio.h>
   #include "1lcd_lib_XC32.h"
   

② 所要の変数定義します。 システムクロックは200MHzです。
   int delay_Clock = 200000000; //200MHz
   char Buf[32];

③ delay_us( )、delay_ms( ) という NOPを使った 1μsec 、1msec単位の遅延関数をつくります。HarmonyではSYS_Tasks ( )の中で
   長い時間の遅延をつかうとその遅延時間だけタスクがそこで止まってしまいますので注意して使う必要があります。
     void delay_us(volatile unsigned int usec) //1μsec遅延
     {
        volatile int count;

     ……
     ……

④ キャラクタ液晶を初期化して"Harmony Graphics" "LED Touch OnOff"を表示する部分です。 (→ キャラクタ液晶表示方法 参照
    lcd_init(); // LCD初期化
    lcd_cmd(0b00001100); // カーソル:OFF ブリンク:OFF
    lcd_clear();
    
    lcd_cmd(0x80); //1目の先頭へ
    ……
    ……


⑤ MyLibariaEvents( )は、グラフィック液晶INT035へのタッチ位置をリアルタイム(SYS_TASKS( ))で検出し、キャラクタ液晶に表示する関数です。       libaria_events.cに定義されています。
   尚、libaria_events.cの場所は "C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01 035 Led OnOff
                          \firmware\src\system_config\default\framework\gfx\libaria\libaria_events.c"です。



    MyLibariaEvents(); //グラフィック関連イベント ---> libaria_event.c

以下、app.c




 system_init.cに、青字部分を追加します。 

   ① PICの立ち上がりを350msec遅延させます。INT035の内部制御回路が完全に立ち上がるまでの遅延時間です。 INT035が完全に立ち上がる前にPICが立ち上がり、 PICと接続しているピン(CS,RS,RD,WR,RESET 及びDATA00-DATA15)に何らかのパルス信号が入ってしまうとINT035は    永遠に立ち上がれなくなってしまいます。 PIC32MZ評価ボード(MZ100-A001)ではハードの回路で リセットICM51957Bにより650msecの遅延時間を作って、 合計1000msec(= ハード650msec + ソフト350msec )でプログラムをつくるようにしています。
 ( → INT035の立ち上がり時間に係るQ.A.)

    delay_ms(350); //INT035の内部回路が立ち上がるまで待つ

以下、system_init.c



■ libaria_events.c に青字部分を追加します。
 libaria_events.cの場所は "C:\microchip\harmony\v2_04\_WK\sample204\gfx1\01 035 Led OnOff
                          \firmware\src\system_config\default\framework\gfx\libaria\libaria_events.c"です。
 


①#include <stdio.h>がないと sprintf( )に対してコンパイラワーニングがでます。ボタンウィジェットのチャタリング対策としてシステムタイマを
 使いますので コールバック関数SYS_TMR_CallbackSingle( )関数のハンドル handleTimer1を定義しています。
    #include <stdio.h>
    bool LED; //LED点滅モード
    SYS_TMR_HANDLE handleTimer1; //SYS_TMR_CallbackSingle()関数のハンドル
    bool ChangeNG; //LED切替わり不可の時、1となるフラグ
    char Buf[32]; //液晶表示用バッファー


②MyLibariaEvents( ) は、グラフィック液晶INT035のタッチの位置を検出してキャラクタ液晶に表示する関数です。ys_TouchGetX();ys_TouchGetY();は、
 タッチの位置を検出し戻り値に座標(整数値)を返す関数です。 座標は左上端を原点(0,0) 右下端(320,240)と定義されています。例えば液晶の
 中央がタッチされた場合はys_TouchGetX();ys_TouchGetY()の戻り値は それぞれ160、120 です。
  この関数はAPP_Tasks( )から、システムが1巡するごとに呼び出されます。
    void MyLibariaEvents(void) //APP_Tasks ()からの呼び出し
    {
      short int tempX,tempY;

      tempX = ys_TouchGetX();
      tempY = ys_TouchGetY();

      lcd_cmd(0x80); //1行目の先頭へ
      sprintf(Buf,"X = %d ",tempX);//タッチX座標表示
      lcd_str(Buf); //液晶表示
      lcd_cmd(0xC0); //2行目の先頭へ
      sprintf(Buf,"Y = %d ",tempY); //タッチY座標表

      lcd_str(Buf); // 開始メッセージ1行目表示
    }

③void LedFunc( )は、呼び出されるたびに、LEDが点灯していれば消灯させ、消灯していれば点灯させる関数です。

    void LedFunc(void) //LEDオンオフ制御
    { 
      if(LED == false)
      {
        LED = true;
        PLIB_PORTS_PinSet( PORTS_ID_0, PORT_CHANNEL_G, 15 ); //RG15: LED1点灯
        //LATGbits.LATG15 = 1;
    ……
    ……


④ Timer_Callback1( )は、SYS_TMR_CallbackSingle( )のコールバック関数で呼び出しから500 msec後に1回だけ呼び出され フラグをクリアしています。
  LedButtonがリリースされた場合500msecの間は LedがON/OFFしないようにしてチャタリングを防止しています。
   LedButton_ReleasedEvent(laButtonWidget* btn)はHarmonyからアプリケーションが受け取るLedButtonのリリースイベント関数でリリースが
  発生した時、制御がまわってきます。
    //500msec後のコールバック関数
    void Timer_Callback1 ( uintptr_t context, uint32_t currTick )
    {
      ChangeNG = false;
    }


    // LedButton - ReleasedEvent
    void LedButton_ReleasedEvent(laButtonWidget* btn)
    {
      // Led_Control
      //

      //チャタリング対策
      if(ChangeNG == false) //切り替わり可の場合
      {
        ChangeNG = true;
        LedFunc(); //LEDオンオフ制御
        handleTimer1 = SYS_TMR_CallbackSingle(500, 1, Timer_Callback1);//500msecの非繰り返しコールバックイベントセット
      }

    }




以下、libaria_events.c