サンプルプログラム F446RE_MSP2807_JIS_X_0208 の説明
MSP2807_Startup_Screen_JIS_X_0208   タッチパネル付きグラフィックLCD
 MSP2807のサンプルプログラムです。

  JIS X 0208日本語文字表示のプログラムを紹介します。

  16x16, 32x32, 48x48 のサイズの文字を
 4方向の向きで表示することができます。


  STM32F446RE のプログラム領域 512Kbytes のサイズでも、日本語の表示が可能なように
 サイズが約222Kbyteの JIS X 0208 日本語フォントを使用しています。

  JIS X 0208日本語文字表示モジュールの引数に EUCコード文字列を指定して、
 日本語表示を行います。

  日本語の全角文字のフォントのコードをEUCコード文字列にに変換するための
 PCアプリケーション Convert_into_EUC を用意しています。

 UnicodeをEUCコードに変換 をご覧ください。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  "ようこそ!" を表示する場合、JIS X 0208日本語文字表示モジュールの引数に
 (uint8_t *)"A4E8A4A6A4B3A4BDA1AA" のように
 EUCコード文字列を指定して、日本語表示を行います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

  サンプルプログラムの動作を確認するために
 えがおのでんし製の評価用基板 Base-F446RE
 STMicroelectronics社のfreeの開発ツール、
 STM32CubeIDE を使用しています。

  MSP2807は秋月電子通商が販売している、
 2.8インチのタッチパネル付きグラフィックLCDです。



目次

Base-F446RE基板 の説明

サンプルプログラム F446RE_MSP2807_JIS_X_0208 のプロジェクト

使用している日本語フォント の説明
 16x16dot Font JIS X 0208

PCアプリケーション Convert_into_EUC
  日本語の全角文字のフォントのコードをEUCコード文字列に変換するための
 PCアプリケーションです。

  サンプルプログラム F446RE_MSP2807_JIS_X_0208 では、
 日本語を表示するための文字コードとしてEUCコード文字列を使用しています。

サンプルプログラム F446RE_MSP2807_JIS_X_0208 の説明
 1) Font配列を使用するモード
 2) Font Binary Fileを使用するモード

 F446RE_MSP2807_JIS_X_0208 の構成

 F446RE_MSP2807_JIS_X_0208 の動作パラメータの定義
 ユーザープログラムの実行開始位置
 F446RE_MSP2807_JIS_X_0208 のmain()の説明
  1) 初期化の部分
  2) LED点滅 と MSP2807試験 の部分

 MSP2807試験 MSP2807_Test_JIS_X_0208 の説明
  1) MSP2807_Test_JIS_X_0208 のコード
  2) ILI9341 の初期化
  3) 起動画面表示
  4) 数字表示
  5) 時間待ちと数字のカウントアップ

 JIS X 0208文字表示モジュール の使用方法
  1) 通常の使用方法
  2) 並列動作がよくわからない場合

 JIS X 0208文字表示モジュール の説明
  1) 描画Frameの構造体設定
  2) 表示Frame設定 と 描画Bufferの設定
  3) 1Line目の送信データ作成
  4) ILI9341のレジスタ設定と表示Data送信
  5) 残りの1Lineごとの送信データ作成
  6) 残りの1Lineごとのデータ送信と終了判定



  このサンプルプログラムは、
  えがおのでんし製の評価用基板 Base-F446RE を使用して動作を確認しています。

 Base-F446RE基板 の説明
Base_F446RE_Dim

  Base-F446RE基板については、
 Base-F446RE基板 の説明 をご覧ください。



サンプルプログラム F446RE_MSP2807_JIS_X_0208 のプロジェクト
 STM32CubeIDE 1.18.0 を使用して作成しました。

 ここからサンプルプログラムのプロジェクト L_F446RE_MSP2807_JIS_X_0208.zip をダウンロードしてください。

  プロジェクト L_F446RE_MSP2807_JIS_X_0208 は、
 フォルダ C:\Project_CubeIDE\Launch_F446RE\L_F446RE_MSP2807_JIS_X_0208 のように配置して作成しました。

  フォルダ C:\W_CubeIDE\W_F446RE を作成して、
 そのフォルダに L_F446RE_MSP2807_JIS_X_0208.zip を貼り付けて解凍し、
 プロジェクト作成時と同一に C:\Project_CubeIDE\Launch_F446RE\L_F446RE_MSP2807_JIS_X_0208 と
 配置した場合は、普通にプロジェクトを開くことができます。

  サンプルプログラムのプロジェクトを任意のフォルダに配置した場合に、
 STM32CubeIDEにより、そのプロジェクトを開く方法については
既存のプロジェクトを開く方法 をご覧ください。



使用している日本語フォント の説明
  このサンプルプログラムでは、JIS X 0208の日本語文字のフォント配列を使用しています。
  フォントはプログラムに埋め込まれます。

  日本語文字を表示するときに
 EUCコード文字列からJIS X 0208文字コードに変換して、
 JIS X 0208文字コードからフォント配列の位置を算出して
 その位置からフォントを抜き出して使用しています。

16x16dot Font JIS X 0208
  16x16dot の JIS X 0208のフォント配列です。
  サイズは約222Kbyteです。

  MSP2807_Lib/Font_Lib/Font_JIS_X_0208_16x16_A/Font_JIS_X_0208_16x16_A.c に
 フォントの配列が記述されています。



 PCアプリケーション Convert_into_EUC
  日本語の全角文字のフォントのコードをEUCコード文字列に変換するための
 PCアプリケーションです。

 UnicodeをEUCコードに変換 をご覧ください。

  サンプルプログラム F446RE_MSP2807_JIS_X_0208 では、
 日本語を表示するための文字コードとしてEUCコード文字列を使用しています。



サンプルプログラム F446RE_MSP2807_JIS_X_0208 の説明
  タッチパネル付きLCD MSP2807 に日本語の文字表示を行うプログラムです。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
  "ようこそ!" を表示する場合、JIS X 0208文字表示モジュールの引数に
 (uint8_t *)"A4E8A4A6A4B3A4BDA1AA" のように
 EUCコード文字列を指定して、日本語表示を行います。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

MSP2807_Startup_Screen_JIS_X_0208
  16x16, 32x32, 48x48 のサイズの文字を
 いろいろな向きで、表示した後、
 000 から 999 までカウントアップする
 3桁の数字を表示します。


 プロジェクトを最初に開いた画面は以下のようになります。

F446RE_MSP2807_JIS_X_0208_Scrn_First


 1) Font配列を使用するモード
   動作パラメータ定義を記述している、
  MSP2807_JIS_X_0208_Ope/F446RE_MSP2807_JIS_X_0208_Config/Dev_Conf.h の
 以下の部分を、
//----------------------------------------------------------
// JIS X 0208 16x16 Font配列
// FONT_uint8_aJIS_X_0208_16x16_A[] を使用する場合は
//                                  コメントアウトする。
//----------------------------------------------------------
// JIS X 0208 16x16 Font Binary File
// Font_JIS_X_0208_16x16_B.bin を使用する場合、宣言する。
//----------------------------------------------------------
//#define def_USE_Font_binary_File
//----------------------------------------------------------
 のようにして、JIS X 0208 16x16 Font配列
 FONT_uint8_aJIS_X_0208_16x16_A[] を使用する設定にしてビルドした場合、
 MSP2807_Lib/Font_Lib/Font_JIS_X_0208_16x16_A/Font_JIS_X_0208_16x16_A.c の
 Font配列を使用するモードになります。



 2) Font Binary Fileを使用するモード
   動作パラメータ定義を記述している、
  MSP2807_JIS_X_0208_Ope/F446RE_MSP2807_JIS_X_0208_Config/Dev_Conf.h の
 以下の部分を、
//----------------------------------------------------------
// JIS X 0208 16x16 Font配列
// FONT_uint8_aJIS_X_0208_16x16_A[] を使用する場合は
//                                  コメントアウトする。
//----------------------------------------------------------
// JIS X 0208 16x16 Font Binary File
// Font_JIS_X_0208_16x16_B.bin を使用する場合、宣言する。
//----------------------------------------------------------
#define def_USE_Font_binary_File
//----------------------------------------------------------
 のようにして、Font Binary File を使用する設定にしてビルドした場合、
 マイクロコントローラ STM32F446RE の Flash Memory の 0x08040000 番地に配置する
 JIS X 0208 16x16 Font Binary File
 Font_JIS_X_0208_16x16_B.bin を使用するモードになります。

  このモードでは、サンプルプログラム F446RE_MSP2807_JIS_X_0208 全体の配置は、
 以下のようになります。
sector 0 : 0x08000000 - 0x08003FFF : 16Kbytes : F446RE_MSP2807_JIS_X_0208 を配置
sector 1 : 0x08004000 - 0x08007FFF : 16Kbytes : F446RE_MSP2807_JIS_X_0208 を配置
sector 2 : 0x08008000 - 0x0800BFFF : 16Kbytes : 空き
sector 3 : 0x0800C000 - 0x0800FFFF : 16Kbytes : 空き
sector 4 : 0x08010000 - 0x0801FFFF : 64Kbytes : 空き
sector 5 : 0x08020000 - 0x0803FFFF : 128Kbytes : 空き
sector 6 : 0x08040000 - 0x0805FFFF : 128Kbytes : Font_JIS_X_0208_16x16_B.bin を配置
sector 7 : 0x08060000 - 0x0807FFFF : 128Kbytes : Font_JIS_X_0208_16x16_B.bin を配置

  JIS X 0208 16x16 Font Binary File
 Font_JIS_X_0208_16x16_B.bin をFlash Memoryに書き込む方法については、
 PCアプリケーション STM32CubeProgrammer の説明 をご覧ください。

  「ST-LINK接続でバイナリFontを書き込む」で説明しています。



 以下、サンプルプログラム F446RE_MSP2807_JIS_X_0208 について説明していきます。



 F446RE_MSP2807_JIS_X_0208 の構成
  STM32CubeIDEの画面左側、Project Explorerの
 F446RE_MSP2807_JIS_X_0208を展開した画面は以下のようになります。

F446RE_MSP2807_JIS_X_0208_Tree

  サンプルプログラム F446RE_MSP2807_JIS_X_0208 の構成を以下に示します。
F446RE_MSP2807_JIS_X_0208
  |- Includes
  |
  |- Core
  |    |- Inc
  |    |    |- main.h
  |    |    |- stm32f4xx_hal_conf.h
  |    |    |- stm32f4xx_it.h : 割り込み処理モジュールのヘッダ
  |    |
  |    |- Src
  |    |    |- main.c
  |    |    |- stm32f4xx_hal_msp.c
  |    |    |- stm32f4xx_it.c : 割り込み処理モジュール
  |    |    |- syscalls.c
  |    |    |- system.c
  |    |    |- system_stm32f4xx.c
  |    |
  |    |- Startup
  |
  |- Drivers
  |
  |- MSP2807_JIS_X_0208_Ope : MSP2807_JIS_X_0208 の操作
  |     |-F446RE_MSP2807_JIS_X_0208_Config
  |     |    |- Dev_Conf.h : 動作パラメータの定義
  |     |
  |     |- MSP2807_Startup_Screen_JIS_X_0208 : MSP2807起動画面表示 : 日本語
  |     |    |- MSP2807_Startup_Screen_JIS_X_0208.c
  |     |    |- MSP2807_Startup_Screen_JIS_X_0208.h
  |     |
  |     |- MSP2807_Test_JIS_X_0208 : MSP2807試験
  |          |- MSP2807_Test_JIS_X_0208.c
  |          |- MSP2807_Test_JIS_X_0208.h
  |
  |- MSP2807_Lib
  |    |- Calc_Address_Font_JIS_X_0208_16x16 : EUCコード文字列(4byte単位)を
  |    |    |                                 JIS X 0208文字コード(uint16_t) に変換する。
  |    |    |-Calc_Address_Font_JIS_X_0208_16x16.c
  |    |    |-Calc_Address_Font_JIS_X_0208_16x16.h
  |    |
  |    |- Color_Lib
  |    |    |- Color_Code.h : Color Code の定義
  |    |
  |    |- Draw_Buffer_Lib
  |    |    |- Draw_Buffer_ASCII_8x8 : ASCII文字表示 8x8
  |    |    |    |- Draw_Buffer_JIS_X_0208.c : JIS X 0208文字列表示 : 16x16dot
  |    |    |    |- Draw_Buffer_JIS_X_0208.h
  |    |    |
  |    |    |- Draw_Buffer_JIS_X_0208 : JIS X 0208文字表示
  |    |         |- Draw_Buffer_JIS_X_0208_16x16.c : JIS X 0208文字列表示 : 16x16dot
  |    |         |- Draw_Buffer_JIS_X_0208_16x16.h
  |    |         |- Draw_Buffer_JIS_X_0208_Expand_32x32.c : 16x16dotのJIS X 0208文字を 32x32dotに拡大する。
  |    |         |- Draw_Buffer_JIS_X_0208_Expand_32x32.h
  |    |         |- Draw_Buffer_JIS_X_0208_Expand_48x48.c : 16x16dotのJIS X 0208文字を 48x48dotに拡大する。
  |    |         |- Draw_Buffer_JIS_X_0208_Expand_48x48.h
  |    |
  |    |-Font_Lib
  |    |    |- Font_ASCII_A : ASCII Font
  |    |    |    |- Font_ASCII_16x16_A.c : ASCII Font 16x16dot の配列
  |    |    |    |- Font_ASCII_16x16_A.h
  |    |    |    |- Font_ASCII_8x8_A.c : ASCII Font 8x8dot の配列
  |    |    |    |- Font_ASCII_8x8_A.h
  |    |    |
  |    |    |- Font_16x16_JIS_X_0208_A : JIS X 0208 日本語文字Font
  |    |         |- Font_JIS_X_0208_16x16_A.c : JIS X 0208 日本語文字Font 16x16dot の配列
  |    |         |- Font_JIS_X_0208_16x16_A.h
  |    |
  |    |- ILI9341_Lib
  |         |- ILI9341_Display
  |         |    |- ILI9341_Display_Clear : 画面表示クリア
  |         |    |    |- ILI9341_Display_Clear.c
  |         |    |    |- ILI9341_Display_Clear.h
  |         |    |
  |         |    |- ILI9341_Display_JIS_X_0208 : ASCII文字 と 日本語文字表示
  |         |         |- ILI9341_Display_JIS_X_0208.c
  |         |         |- ILI9341_Display_JIS_X_0208.h
  |         |
  |         |- ILI9341_SPI_Lib : ILI9341の制御
  |              |- ILI9341_SPI_Draw.c : ILI9341のレジスタ設定とデータ送信
  |              |- ILI9341_SPI_Draw.h : Fontサイズ など各種パラメータの定義
  |              |- ILI9341_SPI_Init.c : ILI9341初期化
  |              |- ILI9341_SPI_Init.h
  |
  |- Periph_Lib : 周辺インターフェースライブラリ
  |    |- H_Common_STM32F4 : 周辺インターフェース共通処理
  |    |     |- H_Common_STM32F4_SPI : SPIインターフェースの共通ハンドラ
  |    |          |- H_Common_STM32F4_SPI.c
  |    |          |- H_Common_STM32F4_SPI.h
  |    |
  |    |- H_STM32F4_SPI_1 : SPI1インターフェースのハンドラ
  |         |- H_STM32F4_SPI_1.c
  |         |- H_STM32F4_SPI_1.h
  |
  |- Shared_Lib : 共有ライブラリ
  |    |- Handle_UI_Lib : ユーザーインターフェースライブラリ
  |    |    |- Blink_LED_ST : ST LED点滅処理
  |    |         |- Blink_LED_ST.c
  |    |         |- Blink_LED_ST.h
  |    |
  |    |- Modules_Lib : 共通ライブラリ
  |    |    |- Modules_Lib.c
  |    |    |- Modules_Lib.h
  |    |
  |    |- Time_Interval : 時間待ち処理
  |         |- Time_Interval.c
  |         |- Time_Interval.h
  |
  |- F446RE_MSP2807_JIS_X_0208.launch
  |- STM32F446RETX_FLASH.ld
  |- STM32F446RETX_RAM.ld


 F446RE_MSP2807_JIS_X_0208 の動作パラメータの定義
  サンプルプログラム F446RE_MSP2807_JIS_X_0208 の動作パラメータの定義を
  MSP2807_JIS_X_0208_Ope/F446RE_MSP2807_JIS_X_0208_Config/Dev_Conf.h に記述しています。

  使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、動作パラメータ
 などを記述しています。



 ユーザープログラムの実行開始位置
  プログラムは、int main(void) から実行開始します。

  int main(void) は、フォルダ Core/Src/main.c にあります。

F446RE_MSP2807_JIS_X_0208_main

  STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
 行った後、int main(void) を呼び出します。

  ユーザーコード(記述したプログラム)は、
 int main(void) の先頭から実行されます。



 F446RE_MSP2807_JIS_X_0208 の main()の説明
  サンプルプログラム F446RE_MSP2807_JIS_X_0208 の main() の記述は、
 以下のとおりです。


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{

  /* USER CODE BEGIN 1 */

  //-----------------------------------------------------------------
  // main関数内では、以下の処理番号の変数、
  // STC_uint8_JobNum_LED と
  // STC_uint8_JobNum_MSP2807 は

  // while(1){
  // }

  // の永久ループ内で使用しているので、
  // static宣言をする必要はない。

  // しかし、main関数以外の全ての関数内では
  // 処理番号をstatic宣言をする必要があるので、
  // 合わせるために、ここでも static宣言をしている。
  //-----------------------------------------------------------------
  static uint8_t STC_uint8_JobNum_LED;      // LED処理番号
  static uint8_t STC_uint8_JobNum_MSP2807;  // MSP2807処理番号


  //------------------------------------------------------------
  // 呼び出す関数を case 0: から実行させるために
  // 処理番号に 0 をセットします。
  //------------------------------------------------------------
  STC_uint8_JobNum_LED = 0;      // LED処理番号初期化
  STC_uint8_JobNum_MSP2807 = 0;  // MSP2807処理番号初期化

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  /* USER CODE BEGIN 2 */

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // ST LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_ST(&STC_uint8_JobNum_LED,
                 &GLB_structParam_Blink_LED_ST);


    //------------------------------------------------------------
    // MSP2807試験 : JIS X 0208文字表示 : Font配列使用 : プログラム埋め込み
    //------------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //------------------------------------------------------------
    MSP2807_Test_JIS_X_0208(&STC_uint8_JobNum_MSP2807);
  }
  /* USER CODE END 3 */
}


 1) 初期化の部分

  a) CPUのPeripheral初期化
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
   により、CPUのPeripheralなどの基本的な初期化を行います。
  PeripheralとはCPUの周辺インターフェースなどのことを言います。

   プロジェクト構築時に自動的に組み込まれる、
  HAL Drivers(フォルダ Drivers/STM32F4xx_HAL_Drivers) 内に記述されています。


  b) CPU動作クロックの設定
  /* Configure the system clock */
  SystemClock_Config();

   CPUの動作クロックとPeripheralの動作クロックを設定します。

   SystemClock_Config(); の設定内容は、

int main(void)
{
         .
         .
         .
}
 の、すぐ下に記述されています。


  c) MSP2807の初期化
   MSP2807試験のモジュール MSP2807_Test_JIS_X_0208 内で
  初期化処理 ILI9341_Initialize を呼びだしています。



 2) LED点滅 と MSP2807試験 の部分
   永久ループ部分の記述を以下に示します。


  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
    //------------------------------------------------------
    // ST LED点滅
    //------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Blink_LED_ST *pstructParam_Blink_LED_ST :
    //              ST LED点滅用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG
    //------------------------------------------------------
    Blink_LED_ST(&STC_uint8_JobNum_LED,
                 &GLB_structParam_Blink_LED_ST);


    //------------------------------------------------------------
    // MSP2807試験 : JIS X 0208文字表示 : Font配列使用 : プログラム埋め込み
    //------------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //------------------------------------------------------------
    MSP2807_Test_JIS_X_0208(&STC_uint8_JobNum_MSP2807);
  }
  /* USER CODE END 3 */
  Status LED点滅処理 Blink_LED_ST と
 MSP2807試験 MSP2807_Test_JIS_X_0208 を呼び出しています。
  MSP2807_Test_JIS_X_0208 では、起動時の初期画面表示を行います。

  Blink_LED_ST と MSP2807_Test_JIS_X_0208 は並列に実行されます。



 MSP2807試験 MSP2807_Test_JIS_X_0208 の説明

 1) MSP2807_Test_JIS_X_0208 のコード
  MSP2807_Test_JIS_X_0208 のコードは
 MSP2807_JIS_X_0208_Ope/MSP2807_Test_JIS_X_0208/MSP2807_Test_JIS_X_0208.c に
 記述されています。

  以下に、MSP2807_Test_JIS_X_0208 のコードを示します。
//-----------------------------------------------------------
// MSP2807試験 : JIS X 0208文字表示 : Font配列使用 : プログラム埋め込み
//-----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ

// 戻り値:
//   -1 : 処理中
//    0 : OK終了
//    1 : NG終了
//-----------------------------------------------------------
int16_t MSP2807_Test_JIS_X_0208(uint8_t *puint8_JobNum)
{
  //----------------------------------------------------
  // 呼び出す関数の引数に使用する処理番号は、
  // 必ず static の変数宣言をしてください。
  //----------------------------------------------------
  static uint8_t STC_uint8_JobNum_Time;  // Time_Interval処理番号

  //--------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言は、
  // 使用する関数内で、必ず static で宣言してください。
  //--------------------------------------------------------
  // Time_Interval用パラメータの構造体の宣言
  //--------------------------------------------------------
  static struct sParam_Time_Interval STC_structParam_Time_Interval;


  static uint8_t STC_uint8_JobNum_MSP2807;  // MSP2807処理番号

  static uint16_t STC_uint16_Num;  // 数字
  static uint8_t STC_uint8_aString[4];  // 表示データ


  int16_t int16_Return;


  switch(*puint8_JobNum)
  {
  case 0:
    STC_uint8_JobNum_MSP2807 = 0;  // MSP2807処理番号初期化

    STC_uint16_Num = 0;  // 数字初期化


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 1:
    //----------------------------------------------------------
    // ILI9341初期化
    //----------------------------------------------------------
    // 戻り値:
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = ILI9341_Initialize(&STC_uint8_JobNum_MSP2807);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      // NG
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
      // 初期化が正常に終了しない場合、ここから下の処理に進まない。
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 2:
    //----------------------------------------------------------
    // MSP2807起動画面表示 : JIS X 0208
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return
        = MSP2807_Startup_Screen_JIS_X_0208(&STC_uint8_JobNum_MSP2807);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    // 数字の文字列を初期化
    STC_uint8_aString[0] = (uint8_t)'0';
    STC_uint8_aString[1] = (uint8_t)'0';
    STC_uint8_aString[2] = (uint8_t)'0';
    STC_uint8_aString[3] = 0;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  case 3:
    //------------------------------------------------------
    // font 32 x 32 : ASCII : 数字を表示する。
    //------------------------------------------------------

    //--------------------------------------------------
    // 横長表示 左
    //--------------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : Font選択 : ILI9341
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Check_Semaphore : セマフォチェック有無
    //    0 : チェックなし
    //    1 : チェックあり

    // uint16_t uint16_Font : font指定
    //    0 : 8 x 8 font : ASCII
    //    1 : 16 x 16 font : ASCII
    //    2 : 32 x 32 font : ASCII
    //    3 : 48 x 48 font : ASCII

    // uint16_t uint16_Font : font指定
    //    7 : 16 x 16 font : JIS X 0208
    //    8 : 32 x 32 font : JIS X 0208
    //    9 : 48 x 48 font : JIS X 0208

    // uint8_t uint8_Oblong : 縦長/横長
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // uint32_t uint32_ColorCode : カラーコード

    // uint16_t uint16_StartX : 表示開始位置X
    // uint16_t uint16_StartY : 表示開始位置Y

    // uint16_t uint16_Length : 表示文字数
    // uint8_t *puint8_EUC :
    //      表示文字コード(EUC)が格納されているBufferのポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_JIS_X_0208(
                            &STC_uint8_JobNum_MSP2807,
                            1,
                            (uint16_t)def_Font_ASCII_Expand_32x32,
                            def_WidthwiseL, 0,
                            (uint32_t)def_Code_White,
                            132, 128,
                            3, STC_uint8_aString);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    STC_uint8_JobNum_Time = 0;  // Time_Interval処理番号初期化
    STC_structParam_Time_Interval.uint32_Interval = (uint32_t)1000;
                                // 待ち時間セット : 1000mSec


    (*puint8_JobNum)++;  // 次の処理番号に移行する。:
    int16_Return = -1;   // 処理継続
    break;

  case 4:
    //----------------------------------------------------------
    // 時間待ち : 単位 mSec
    //----------------------------------------------------------
    // 戻り値が -1 以外になるまで、繰り返し呼び出してください。
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // struct sParam_Time_Interval *pstructParam_Time_Interval :
    //              Time_Interval用パラメータの構造体のポインタ


    // 戻り値:
    //   -1 : 処理中 : 時間が経過していない。
    //    0 : OK終了 : 時間が経過した。
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = Time_Interval(&STC_uint8_JobNum_Time,
                                 &STC_structParam_Time_Interval);
    if(int16_Return == -1){
      // 処理中 : 時間未経過
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    STC_uint16_Num++;  // 数字をインクリメント
    if(STC_uint16_Num > 999){
      // 数字が 999 を越えたら 0 に戻す。 : 0 - 999 を繰り返す。
      STC_uint16_Num = 0;
    }

    //--------------------------------------------------------------
    // 数字を3桁の文字列に変換 : ASCII
    //--------------------------------------------------------------
    // 引数:
    // uint16_t uint16_Num : 数字

    // uint8_t *puint8_aString :
    //      3桁の文字列に変換したデータを格納するバッファのポインタ

    // 戻り値:
    //    なし
    //--------------------------------------------------------------
    Conv_Num_String_3_ASCII(STC_uint16_Num, STC_uint8_aString);


    (*puint8_JobNum)--;  // ひとつ前の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

  default:
    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 1;    // NG
    break;
  }

  return(int16_Return);
}

 2) ILI9341 の初期化
  a) case 0:
   MSP2807処理番号 の初期化と 表示する数字変数 の初期化を行います。

  b) case 1:
   モジュール ILI9341_Initialize を呼び出してILI9341 の初期化を行います。


 3) 起動画面表示
   case 2: では、MSP2807_Startup_Screen_JIS_X_0208 を呼び出して
  起動画面の表示を行います。

   以下の画面が表示されます。

MSP2807_Startup_Screen_JIS_X_0208


 4) 数字表示
   case 3: では、3桁の数字を表示します。
   上記の画面で 072 の部分です。

   数字は case 4: でカウントアップされます。


 5) 時間待ちと数字のカウントアップ
   case 4: では、1000mSec の時間待ちをします。

   1000mSec 経過したら、表示する数字をカウントアップします。
   数字が 999 を超えたら、000 に戻します。
   000 から 999 を繰り返しカウントアップします。

   処理番号を 3 にします。
   case 3: と case 4: を繰り返し実行します。



 JIS X 0208文字表示モジュール の使用方法
  JIS X 0208文字表示モジュール ILI9341_SPI_Display_String_JIS_X_0208 の使用方法を
 簡単に説明します。

  JIS X 0208文字表示は、ILI9341_Display_JIS_X_0208/ILI9341_Display_JIS_X_0208.c 内の
 モジュール ILI9341_SPI_Display_String_JIS_X_0208 に文字コードの引数を渡して行います。

  "ようこそ!" を表示する場合、JIS X 0208文字表示モジュールの引数に
 (uint8_t *)"A4E8A4A6A4B3A4BDA1AA" のように
 EUCコード文字列を指定して、日本語表示を行います。


 1) 通常の使用方法
  使用例として MSP2807_Startup_Screen_JIS_X_0208/MSP2807_Startup_Screen_JIS_X_0208.c 内の
 MSP2807起動画面表示モジュール MSP2807_Startup_Screen_JIS_X_0208 で
 "ようこそ!" を 16 x 16 のフォントで表示している部分を以下に示します。
    //------------------------------------------------------
    // "ようこそ!" : 16 x 16 font : EUC
    //------------------------------------------------------
    //--------------------------------------------------
    // 横長表示 左
    //--------------------------------------------------
    //----------------------------------------------------------
    // LCD文字表示 : Font選択 : ILI9341
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_Check_Semaphore : セマフォチェック有無
    //    0 : チェックなし
    //    1 : チェックあり

    // uint16_t uint16_Font : font指定
    //    0 : 8 x 8 font : ASCII
    //    1 : 16 x 16 font : ASCII
    //    2 : 32 x 32 font : ASCII
    //    3 : 48 x 48 font : ASCII

    //    7 : 16 x 16 font : JIS X 0208
    //    8 : 32 x 32 font : JIS X 0208
    //    9 : 48 x 48 font : JIS X 0208

    // uint8_t uint8_Oblong : 縦長/横長
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    //  uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // uint32_t uint32_ColorCode : カラーコード

    // uint16_t uint16_StartX : 表示開始位置X
    // uint16_t uint16_StartY : 表示開始位置Y

    // uint16_t uint16_Length : 表示文字数
    // uint8_t *puint8_EUC :
    //      表示文字コード(EUC)が格納されているBufferのポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK終了
    //    1 : NG終了
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_JIS_X_0208(
                                    &STC_uint8_JobNum_LCD,
                                    1,
                            (uint16_t)def_Font_JIS_X_0208_16x16,
                                    def_WidthwiseL, 0,
                                    (uint32_t)def_Code_Blue,
                                    192, 0,
                            5, (uint8_t *)"A4E8A4A6A4B3A4BDA1AA");
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;
  それぞれの引数に、目的の値をセットして呼び出しています。

  戻り値が "処理中" でなくなるまで、case 4: をループして繰り返し呼び出します。
  戻り値が "処理中" 以外になったら、次の処理番号に移行します。

  引数の
    // uint8_t *puint8_EUC :
    //      表示文字コード(EUC)が格納されているBufferのポインタ
 の部分には、"ようこそ!" をEUCコード文字列に変換した、
 (uint8_t *)"A4E8A4A6A4B3A4BDA1AA" を指定しています。

 case 5: では "電子工作" を 48 x 48dot に拡大表示しています。

  MSP2807起動画面表示モジュール MSP2807_Startup_Screen_JIS_X_0208 では、
 いろいろなサイズと向きでJIS X 0208文字を表示しているので、参考にしてください。

 2) 並列動作がよくわからない場合
  以下のように、int16_Return が -1 以外の値になるまで繰り返し呼び出すことにより
 文字列を表示することができます。
  STC_uint8_JobNum_LCD = 0;


  do{
    //-----------------------------------------------------------------------
    // "ようこそ!" : 16 x 16 font : EUC
    //-----------------------------------------------------------------------
    //--------------------------------------------------
    // 横長表示 左
    //--------------------------------------------------
    //----------------------------------------------------------------------------
    // LCD文字表示 : Font選択 : ILI9341 : JIS X 0208
    //----------------------------------------------------------------------------
    int16_Return = ILI9341_SPI_Display_JIS_X_0208(
                                    &STC_uint8_JobNum_LCD,
                                    1,
                            (uint16_t)def_Font_JIS_X_0208_16x16,
                                    def_WidthwiseL, 0,
                                    (uint32_t)def_Code_Blue,
                                    192, 0,
                            5, (uint8_t *)"A4E8A4A6A4B3A4BDA1AA");
  }while(int16_Return == -1);


 JIS X 0208文字表示モジュール の説明
  JIS X 0208文字表示モジュール ILI9341_Display_JIS_X_0208 の説明を記します。
  MSP2807_Lib/ILI9341_Lib/ILI9341_Display/ILI9341_Display_JIS_X_0208/ILI9341_Display_JIS_X_0208.c に
 記述されています。

 1) 描画Frameの構造体設定
  case 0: では Set_structFrame_JIS_X_0208 を呼びだして
 表示範囲を、描画Frame設定用の構造体にセットします。
  case 0:
    // セマフォチェック有無判定
    if(int16_Check_Semaphore == 1){
      // セマフォチェックありの場合
      //------------------------------------------------
      // セマフォチェック
      //------------------------------------------------
      if(GLB_int8_Semaphore_LCD != 0){
        // 他のモジュールがセマフォを使用中
        int16_Return = -1;  // 処理継続
        break;  // 処理番号維持 : 現在の処理番号をループ
      }

      GLB_int8_Semaphore_LCD = 1;  // セマフォ取得
      //------------------------------------------------
    }


    STC_uint8_JobNum = 0;  // 表示処理番号初期化

    STC_uint16_Position = 0;
    STC_uint16_SendCount = 0;

    STC_uint16_Position_DrawBuffer = 0;


    //----------------------------------------------------------
    // 描画Frameの構造体設定 : JIS X 0208
    //----------------------------------------------------------
    // 引数:
    // uint16_t uint16_Font : font指定
    //    0 : 8 x 8 font : ASCII
    //    1 : 16 x 16 font : ASCII
    //    2 : 32 x 32 font : ASCII
    //    3 : 48 x 48 font : ASCII

    //    7 : 16 x 16 font : JIS X 0208
    //    8 : 32 x 32 font : JIS X 0208
    //    9 : 48 x 48 font : JIS X 0208

    // uint16_t uint16_StartX : 表示開始位置X
    // uint16_t uint16_StartY : 表示開始位置Y

    // uint16_t uint16_Length : 表示文字数

    // struct sFrame_LCD *pstructFrame_LCD :
    //                      表示パラメータ構造体のポインタ

    // 戻り値:
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = Set_structFrame_JIS_X_0208(uint16_Font,
                                              uint16_StartX,
                                              uint16_StartY,
                                              uint16_Length,
                                              &STC_structFrame_LCD);
    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

      break;  // NG終了
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

 2) 表示Frame設定 と 描画Bufferの設定
  case 1: では ILI9341_SPI_SetFrame を呼びだして、
 描画Frame設定用の構造体 STC_structFrame_LCD の内容を
 表示の向きと範囲を設定するための ILI9341 のレジスタに設定します。

  表示Frame設定が終了したら、Set_DrawBuffer_JIS_X_0208 を呼び出して
 表示Frame に書き込むための文字列データを
 描画Bufferにセットします。
    //----------------------------------------------------------
    // 表示Frame設定
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // uint16_t uint16_Oblong : 縦長/横長 選択
    //    0 : Lengthwise : 縦長 左
    //    1 : Lengthwise : 縦長 右
    //    2 : WidthwiseL : 横長 左
    //    3 : WidthwiseR : 横長 右

    // struct sFrame_LCD *pstructFrame_LCD : 表示パラメータ構造体のポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    int16_Return = ILI9341_SPI_SetFrame(&STC_uint8_JobNum,
                                        (uint16_t)uint8_Oblong,
                                        &STC_structFrame_LCD);
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

      *puint8_JobNum = 0;  // 処理番号初期化
      break;  // NG終了
    }


    //----------------------------------------------------------
    // 描画Buffer設定 : JIS X 0208
    //----------------------------------------------------------
    // 引数:
    // uint16_t uint16_Font : font指定
    //    0 : 8 x 8 font : ASCII
    //    1 : 16 x 16 font : ASCII
    //    2 : 32 x 32 font : ASCII
    //    3 : 48 x 48 font : ASCII

    //    7 : 16 x 16 font : JIS X 0208
    //    8 : 32 x 32 font : JIS X 0208
    //    9 : 48 x 48 font : JIS X 0208

    //  uint8_t uint8_Type : 表示選択
    //      0 : 通常表示
    //      1 : 反転表示
    //      2 : 通常表示の上書き
    //      3 : 反転表示の上書き

    // uint16_t uint16_Length : 表示文字数

    // uint8_t *puint8_aChar :
    //          文字コードが格納されたBufferのポインタ
    // uint8_t *puint8_aBuffer : 描画Bufferのポインタ

    // uint16_t *puint16_Width : 文字の幅の変数のポインタ
    // uint16_t *puint16_Height : 文字の高さの変数のポインタ
    //----------------------------------------------------------
    Set_DrawBuffer_JIS_X_0208(uint16_Font,
                              uint8_Type,
                              uint16_Length,
                              puint8_aChar,
                              GLB_uint8_aDrawBuffer_LCD,
                              &STC_uint16_Width,
                              &STC_uint16_Height);


    STC_uint16_DataSize = STC_uint16_Width / 8;
    if((STC_uint16_Width % 8) > 0){
      STC_uint16_DataSize++;
    }


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

 3) 1Line目の送信データ作成
  case 2: では 1Line目の送信データの作成を行います。
  case 2:
    //----------------------------------------------------------
    // 表示Data送信
    //----------------------------------------------------------
    if(uint8_Type < 0x02){
      // 0 : 通常表示
      // 1 : 反転表示
      for(int16_I = 0;
          int16_I < (int16_t)(STC_uint16_Width * def_RGB_byte);
          int16_I++){
        GLB_uint8_aBuffer_1Line_LCD[int16_I] = 0;
      }

      //--------------------------------------------------------
      // LCD表示用送信データ作成(カラーコード指定)  : RGB 2byte
      //--------------------------------------------------------
      // uint32_t uint32_ColorCode : カラーコード

      // uint16_t uint16_Width : 表示領域の幅
      // uint16_t uint16_Position : GraphDataの位置
      // uint8_t *puint8_GraphData :
      //        Graphicデータが格納されたBufferのポインタ
      // uint8_t *puint8_SendData :
      //            送信データを格納するBufferのポインタ
      //--------------------------------------------------------
      MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                         GLB_uint8_aDrawBuffer_LCD,
                                         GLB_uint8_aBuffer_1Line_LCD);
    }
    else{
      // 2 : 通常表示の上書き
      // 3 : 反転表示の上書き
      MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                         GLB_uint8_aDrawBuffer_LCD,
        &GLB_uint8_aWork_1Line_LCD[STC_uint16_Position_DrawBuffer]);
    }

    // 送信データ数セット
    STC_uint16_SendLength = STC_uint16_Width * def_RGB_byte;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

 4) ILI9341のレジスタ設定と表示Data送信
  case 3: では ILI9341のレジスタ設定と1Line目の送信データの送信を行います。
  case 3:
    //----------------------------------------------------------
    // ILI9341のレジスタ設定と表示Data送信
    //----------------------------------------------------------
    // 引数:
    // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

    // int16_t int16_NSS_OnOff : 設定データ送信終了時NSS ON/OFF選択
    //    0 : 送信後 NSSをOFFにする。
    //    1 : 送信後 NSSをONのままにする。

    // uint16_t uint16_Length : 送信データ数
    // uint8_t *puint8_Data :
    //          送信データが格納されているBufferのポインタ


    // 戻り値:
    //   -1 : 処理中
    //    0 : OK
    //    1 : NG
    //----------------------------------------------------------
    if(uint8_Type < 0x02){
      // 0 : 通常表示
      // 1 : 反転表示
      int16_Return = ILI9341_SPI_SendData(&STC_uint8_JobNum,
                                          1,
                                          STC_uint16_SendLength,
                                          GLB_uint8_aBuffer_1Line_LCD);
    }
    else{
      // 2 : 通常表示の上書き
      // 3 : 反転表示の上書き
      int16_Return = ILI9341_SPI_SendData(&STC_uint8_JobNum,
                                          1,
                                          STC_uint16_SendLength,
        &GLB_uint8_aWork_1Line_LCD[STC_uint16_Position_DrawBuffer]);
    }
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

      *puint8_JobNum = 0;  // 処理番号初期化
      break;  // NG終了
    }

    // 終了判定
    STC_uint16_SendCount++;
    if(STC_uint16_SendCount < STC_uint16_Height){
      STC_uint16_Position += STC_uint16_DataSize;  // 次のデータ位置をセット
      STC_uint16_Position_DrawBuffer += STC_uint16_SendLength;

      (*puint8_JobNum)++;  // 次の処理番号に移行する。
      int16_Return = -1;   // 処理継続
      break;
    }

    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;

 5) 残りの1Lineごとの送信データ作成
  case 4: では 残りの1Lineごとの送信データの作成を行います。
  case 4:
    if(uint8_Type < 0x02){
      // 0 : 通常表示
      // 1 : 反転表示
      for(int16_I = 0;
            int16_I < (int16_t)(STC_uint16_Width * def_RGB_byte);
            int16_I++){
        GLB_uint8_aSPI1_TxBuffer[int16_I] = 0;
      }

      //--------------------------------------------------------
      // LCD表示用送信データ作成(カラーコード指定)  : RGB 2byte
      //--------------------------------------------------------
      // uint32_t uint32_ColorCode : カラーコード

      // uint16_t uint16_Width : 表示領域の幅
      // uint16_t uint16_Position : GraphDataの位置
      // uint8_t *puint8_GraphData :
      //            Graphicデータが格納されたBufferのポインタ
      // uint8_t *puint8_SendData :
      //            送信データを格納するBufferのポインタ
      //--------------------------------------------------------
      MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                         GLB_uint8_aDrawBuffer_LCD,
                                         GLB_uint8_aSPI1_TxBuffer);
    }
    else{
      // 2 : 通常表示の上書き
      // 3 : 反転表示の上書き
      MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
                                         STC_uint16_Width,
                                         STC_uint16_Position,
                                         GLB_uint8_aDrawBuffer_LCD,
        &GLB_uint8_aWork_1Line_LCD[STC_uint16_Position_DrawBuffer]);

      for(uint16_I = 0;
            uint16_I < (STC_uint16_Width * def_RGB_byte);
            uint16_I++){
        GLB_uint8_aSPI1_TxBuffer[uint16_I]
            = GLB_uint8_aWork_1Line_LCD[
                    STC_uint16_Position_DrawBuffer + uint16_I];
      }
    }


    // 送信データ数セット
    GLB_structParam_Handle_SPI1.int16_vSPI_TxNumber
                            = STC_uint16_Width * def_RGB_byte;


    (*puint8_JobNum)++;  // 次の処理番号に移行する。
    int16_Return = -1;   // 処理継続
    break;

 6) 残りの1Lineごとのデータ送信と終了判定
  case 5: では 残りの1Lineごとのデータ送信と終了判定を行います。
  終了でない場合、case 4: に戻ります。
  終了するまで、case 4: と case 5: を繰り返します。
  case 5:
    // SPI送信 : データのみ送信
    if(STC_uint16_SendCount == STC_uint16_Height - 1){
      //----------------------------------------------------------
      // SPIx  Master送受信
      //----------------------------------------------------------
      // 引数;
      // uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ

      // SPI_HandleTypeDef *pHandle_SPIx : SPI handler declaration

      // IRQn_Type DMA_Stream_IRQn_Transmit_SPIx : SPI DMA Transmit IRQn
      // IRQn_Type DMA_Stream_IRQn_Receive_SPIx : SPI DMA Receive IRQn

      // struct sParam_Handle_SPIx *pstructParam_Handle_SPIx :
      //              Handle SPI用パラメータの構造体のポインタ

      // GPIO_TypeDef *pGPIOx_SPIx_NSS : SPIx_NSS のGPIOポート
      // uint16_t uint16_GPIO_Pin_x_SPIx_NSS : SPIx_NSS のGPIOピン

      // int16_t int16_Value_Wait_SPI_TxRx : SPI送受信待ちの値

      // int16_t int16_NSS_OnOff : 送信終了時NSS ON/OFF選択
      //    0 : 送信後 NSSをOFFにする。
      //    1 : 送信後 NSSをONのままにする。


      // 戻り値;
      //   -1 : 処理中
      //    0 : OK
      //    1 : NG
      //----------------------------------------------------------
      int16_Return = SPIx_Master_TxRxByte(&STC_uint8_JobNum,
                                          &Handle_SPI1,
                                          DMA2_Stream3_IRQn,
                                          DMA2_Stream2_IRQn,
                                          &GLB_structParam_Handle_SPI1,
                                          def_GPIOx_SPI1_NSS,
                                          def_GPIO_PIN_x_SPI1_NSS,
                                          STC_int16_Value_Wait_SPI_TxRx,
                                          0);
    }
    else{
      int16_Return = SPIx_Master_TxRxByte(&STC_uint8_JobNum,
                                          &Handle_SPI1,
                                          DMA2_Stream3_IRQn,
                                          DMA2_Stream2_IRQn,
                                          &GLB_structParam_Handle_SPI1,
                                          def_GPIOx_SPI1_NSS,
                                          def_GPIO_PIN_x_SPI1_NSS,
                                          STC_int16_Value_Wait_SPI_TxRx,
                                          1);
    }
    if(int16_Return == -1){
      // 処理中
      break;  // 処理番号維持 : 処理継続 : 現在の処理番号をループ
    }

    if(int16_Return != 0){
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放

      *puint8_JobNum = 0;  // 処理番号初期化
      break;  // NG終了
    }

    // 終了判定
    STC_uint16_SendCount++;
    if(STC_uint16_SendCount < STC_uint16_Height){
      STC_uint16_Position += STC_uint16_DataSize;
                                    // 次のデータ位置をセット
      STC_uint16_Position_DrawBuffer += STC_uint16_SendLength;

      (*puint8_JobNum)--;  // 次の処理番号に移行する。 : case 4:
      int16_Return = -1;   // 処理継続
      break;
    }


    // End : NSS OFF
    HAL_GPIO_WritePin(def_GPIOx_LCD_SPI_NSS,
                      def_GPIO_PIN_x_LCD_SPI_NSS,
                      GPIO_PIN_SET);


    //----------------------------------------------
    // セマフォチェック有無判定
    //----------------------------------------------
    if(int16_Check_Semaphore == 1){
      // セマフォチェックありの場合
      GLB_int8_Semaphore_LCD = 0;  // セマフォ解放
    }
    //----------------------------------------------


    *puint8_JobNum = 0;  // 処理番号初期化
    int16_Return = 0;    // OK終了
    break;


A+-2C (ええ加減にC) のページに戻る




 メールアドレス: apm2c.sumi@gmail.com

 なんでも、気軽に ご相談ください。
 担当:おの


  えがおのでんし 案内