サンプルプログラム L476RG_MSP2807_UTF16_A の説明
タッチパネル付きグラフィックLCD
MSP2807のサンプルプログラムです。
Unicode文字(日本語)表示のプログラムを紹介します。
16x16, 32x32, 48x48 のサイズの文字を
4方向の向きで表示することができます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Unicode文字表示モジュールの引数に
(uint8_t *)"ようこそ!" のように
直接、日本語を指定して、日本語表示を行うことができます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
サンプルプログラムの動作を確認するために
えがおのでんし製の評価用基板 Base-Nucleo-64 と
STMicroelectronics社のfreeの開発ツール、
STM32CubeIDE を使用しています。
MSP2807は秋月電子通商が販売している、
2.8インチのタッチパネル付きグラフィックLCDです。
目次
えがおのでんし製の評価用基板 Base-Nucleo-64 の説明
STM32CubeIDEの日本語設定について
サンプルプログラム L476RG_MSP2807_UTF16_A のプロジェクト
使用している日本語フォント の説明
16x16dot Font UTF-16
サンプルプログラム L476RG_MSP2807_UTF16_A の説明
L476RG_MSP2807_UTF16_A の構成
L476RG_MSP2807_UTF16_A の動作パラメータの定義
ユーザープログラムの実行開始位置
L476RG_MSP2807_UTF16_A のmain()の説明
1) 初期化の部分
2) LED点滅 と MSP2807試験 の部分
MSP2807試験 MSP2807_Test_UTF16_A の説明
1) MSP2807_Test_UTF16_A のコード
2) ILI9341 の初期化
3) 起動画面表示
4) 数字表示
5) 時間待ちと数字のカウントアップ
Unicode文字表示モジュール の使用方法
1) 通常の使用方法
2) 並列動作がよくわからない場合
Unicode文字表示モジュール の説明
1) 描画Frameの構造体設定
2) 表示Frame設定 と 描画Bufferの設定
3) 1Line目の送信データ作成
4) ILI9341のレジスタ設定と表示Data送信
5) 残りの1Lineごとの送信データ作成
6) 残りの1Lineごとのデータ送信と終了判定
えがおのでんし製の評価用基板 Base-Nucleo-64 の説明
このサンプルプログラムは、
えがおのでんし製の評価用基板 Base-Nucleo-64 を使用して動作を確認しています。
基板については、
Base-Nucleo-64基板 の説明 をご覧ください。
STM32CubeIDEの日本語設定について
サンプルプログラム L476RG_MSP2807_UTF16_A を実行するために
開発ツール STM32CubeIDE の設定において Colors and Fonts の
Text Font の文字設定を日本語にする必要があります。
STM32CubeIDE の日本語設定については、
STM32CubeIDEの日本語設定 をご覧ください。
サンプルプログラム L476RG_MSP2807_UTF16_A のプロジェクト
STM32CubeIDE 1.12.0 を使用して作成しました。
ここからサンプルプログラムのプロジェクト W_L476RG_MSP2807_UTF16_A.zip をダウンロードしてください。
プロジェクト W_L476RG_MSP2807_UTF16_A は、
フォルダ C:\Work_CubeIDE\W_L476RG\W_L476RG_MSP2807_UTF16_A のように配置して作成しました。
フォルダ C:\Work_CubeIDE\W_L476RG を作成して、
そのフォルダに W_L476RG_MSP2807_UTF16_A.zip を貼り付けて解凍し、
プロジェクト作成時と同一に C:\Work_CubeIDE\W_L476RG\W_L476RG_MSP2807_UTF16_A と
配置した場合は、普通にプロジェクトを開くことができます。
サンプルプログラムのプロジェクトを任意のフォルダに配置した場合に、
STM32CubeIDEにより、そのプロジェクトを開く方法については
既存のプロジェクトを開く方法 をご覧ください。
使用している日本語フォント の説明
このサンプルプログラムでは、UTF-16の日本語文字のフォント配列を使用しています。
フォントはプログラムに埋め込まれます。
日本語文字を表示するときに
UnicodeのUTF-8文字コードからUTF-16文字コードに変換して、
UTF-16文字コードからフォント配列の位置を算出して
その位置からフォントを抜き出して使用しています。
16x16dot Font UTF-16
Unicode の 16x16dot の UTF-16のフォント配列です。
Font/Font_UTF16_16x16_A/Font_UTF16_16x16_A.c に
フォントの配列が記述されています。
日本語表示に必要な部分のみ、記述しています。
サンプルプログラム L476RG_MSP2807_UTF16_A の説明
タッチパネル付きLCD MSP2807 に日本語の文字表示を行うプログラムです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Unicode文字表示モジュールの引数に
(uint8_t *)"ようこそ!" のように
直接、日本語を指定して、日本語表示を行うことができます。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
16x16, 32x32, 48x48 のサイズの文字を
いろいろな向きで、表示した後、
000 から 999 までカウントアップする
3桁の数字を表示します。
プロジェクトを最初に開いた画面は以下のようになります。
以下、サンプルプログラム L476RG_MSP2807_UTF16_A について説明していきます。
L476RG_MSP2807_UTF16_A の構成
STM32CubeIDEの画面左側、Project Explorerの
L476RG_MSP2807_UTF16_Aを展開した画面は以下のようになります。
サンプルプログラム L476RG_MSP2807_UTF16_A の構成を以下に示します。
L476RG_MSP2807_UTF16_A
|- Includes
|
|- C_Lib
| |- User_IF_Lib
| | |- Blink_LED_Status : Status LED点滅処理
| | |- Blink_LED_Status.c
| | |- Blink_LED_Status.h
| |
| |- Wait_Interval : 時間待ち処理
| |- Wait_Interval.c
| |- Wait_Interval.h
|
|- Core
| |- Inc
| | |- main.h
| | |- stm32l4xx_hal_conf.h
| | |- stm32l4xx_it.h
| |
| |- Src
| | |- main.c
| | |- stm32l4xx_hal_msp.c
| | |- stm32l4xx_it.c
| | |- syscalls.c
| | |- system.c
| | |- system_stm32l4xx.c
| |
| |- Startup
|
|- Draw_Buffer_Lib
| |- Draw_String
| |- String_Unicode : Unicode文字表示
| |- String_Unicode_16x16.c : Unicode文字列表示 : 16x16dot
| |- String_Unicode_16x16.h
| |- String_Unicode_Expand_32x32.c : 16x16dotのUnicode文字を 32x32dotに拡大する。
| |- String_Unicode_Expand_32x32.h
| |- String_Unicode_Expand_48x48.c : 16x16dotのUnicode文字を 48x48dotに拡大する。
| |- String_Unicode_Expand_48x48.h
|
|- Drivers
|
|-Font
| |- Font_UTF16_16x16_A : Unicode文字Fontの配列 : UTF-16(日本語)
| |- Font_UTF16_16x16_A.c : UTF-16文字Font 16x16dot の配列
| |- Font_UTF16_16x16_A.h
|
|- ILI9341_Lib
| |- ILI9341_Display
| | |- ILI9341_Display_String_Unicode : 日本語文字表示
| | |- ILI9341_Display_String_Unicode.c
| | |- ILI9341_Display_String_Unicode.h
| |
| |- ILI9341_SPI_Lib : ILI9341の制御
| |- ILI9341_SPI_Clear_Display.c : 画面表示クリア
| |- ILI9341_SPI_Clear_Display.h
| |- ILI9341_SPI_Draw.c : ILI9341のレジスタ設定とデータ送信
| |- ILI9341_SPI_Draw.h : Color Code, Fontサイズ など各種パラメータの定義
| |- ILI9341_SPI_Init.c : ILI9341初期化
| |- ILI9341_SPI_Init.h
|
|- MSP2807_Ope
| |- L476RG_MSP2807_UTF16_A_Config
| | |- Dev_Conf.h : 動作パラメータの定義
| |
| |- MSP2807_Startup_Screen_UTF16 : MSP2807起動画面表示 : 日本語
| | |- MSP2807_Startup_Screen_UTF16.c
| | |- MSP2807_Startup_Screen_UTF16.h
| |
| |- MSP2807_Test_UTF16_A : MSP2807試験 : 日本語
| |- MSP2807_Test_UTF16_A.c
| |- MSP2807_Test_UTF16_A.h
|
|- Periph : 周辺インターフェースのハンドラ
| |- H_L4_SPI.c : SPIインターフェースのハンドラ
| |- H_L4_SPI.h
|
|- L476RG_MSP2807_UTF16_A.launch
|- STM32L476RGTX_FLASH.ld
|- STM32L476RGTX_RAM.ld
L476RG_MSP2807_UTF16_A の動作パラメータの定義
サンプルプログラム L476RG_MSP2807_UTF16_A の動作パラメータの定義を
MSP2807_Ope/L476RG_MSP2807_UTF16_A_Config/Dev_Conf.h に記述しています。
使用する CPU の定義、ヘッダ名の定義、GPIO のポートとピンの定義、動作パラメータ
などを記述しています。
ユーザープログラムの実行開始位置
プログラムは、int main(void) から実行開始します。
int main(void) は、フォルダ Core/Src/main.c にあります。
STM32CubeIDEでビルドされたプログラムは、自動的にCPUの初期化を
行った後、int main(void) を呼び出します。
ユーザーコード(記述したプログラム)は、
int main(void) の先頭から実行されます。
L476RG_MSP2807_UTF16_A の main()の説明
サンプルプログラム L476RG_MSP2807_UTF16_A の main() の記述は、
以下のとおりです。
int main(void)
{
/* USER CODE BEGIN 1 */
uint8_t uint8_JobNum_LED = 0;
uint8_t uint8_JobNum_MSP2807 = 0;
/* 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 */
//------------------------------------------------------
// Status LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Time_ON : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blink_LED_Status(&uint8_JobNum_LED,
GLB_uint16_Time_LED_Status_ON,
GLB_uint16_Time_LED_Status_OFF);
//------------------------------------------------------------
// MSP2807試験 : Unicode文字表示 : Font配列使用 : プログラム埋め込み
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//------------------------------------------------------------
MSP2807_Test_UTF16_A(&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/STM32L4xx_HAL_Drivers) 内に記述されています。
b) CPU動作クロックの設定
/* Configure the system clock */
SystemClock_Config();
CPUの動作クロックとPeripheralの動作クロックを設定します。
SystemClock_Config(); の設定内容は、
int main(void)
{
.
.
.
}
の、すぐ下に記述されています。
c) MSP2807の初期化
MSP2807試験のモジュール MSP2807_Test_UTF16_A 内で
初期化処理 ILI9341_Initialize を呼びだしています。
2) LED点滅 と MSP2807試験 の部分
永久ループ部分の記述を以下に示します。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
//------------------------------------------------------
// Status LED点滅
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Time_ON : 点灯時間
// uint16_t uint16_Time_OFF : 消灯時間
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG
//------------------------------------------------------
Blink_LED_Status(&uint8_JobNum_LED,
GLB_uint16_Time_LED_Status_ON,
GLB_uint16_Time_LED_Status_OFF);
//------------------------------------------------------------
// MSP2807試験 : Unicode文字表示 : Font配列使用 : プログラム埋め込み
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//------------------------------------------------------------
MSP2807_Test_UTF16_A(&uint8_JobNum_MSP2807);
}
/* USER CODE END 3 */
Status LED点滅処理 Blink_LED_Status と
MSP2807試験 MSP2807_Test_UTF16_A を呼び出しています。
MSP2807_Test_UTF16_A では、起動時の初期画面表示を行います。
Blink_LED_Status と MSP2807_Test_UTF16_A は並列に実行されます。
MSP2807試験 MSP2807_Test_UTF16_A の説明
1) MSP2807_Test_UTF16_A のコード
MSP2807_Test_UTF16_A のコードは
MSP2807_Ope/MSP2807_Test_UTF16_A/MSP2807_Test_UTF16_A.c に
記述されています。
以下に、MSP2807_Test_UTF16_A のコードを示します。
//-----------------------------------------------------------
// MSP2807試験 : Unicode文字表示 : Font配列使用 : プログラム埋め込み
//-----------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納された変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//-----------------------------------------------------------
int16_t MSP2807_Test_UTF16_A(uint8_t *puint8_JobNum)
{
static uint8_t STC_uint8_JobNum_MSP2807; // MSP2807処理番号
static uint16_t STC_uint16_Num; // 数字
static uint8_t STC_uint8_String[12]; // 表示データ
static uint8_t STC_uint8_JobNum_Wait; // 時間待ちの処理番号
static uint32_t STC_uint32_tikstart; // 時間待ち開始時のカウント数
static uint32_t STC_uint32_Interval; // 待ち時間
int16_t int16_Return;
switch(*puint8_JobNum)
{
case 0:
// ILI9341初期化済みを判定
if(GLB_uint8_Flag_Init_ILI9341 == 0){
// ILI9341初期化済みでない場合、初期化する。
//------------------------------------------------------------
// ILI9341初期化
//------------------------------------------------------------
ILI9341_Initialize();
GLB_uint8_Flag_Init_ILI9341 = 1; // ILI9341初期化済みをセット
}
STC_uint8_JobNum_MSP2807 = 0; // MSP2807処理番号初期化
STC_uint16_Num = 0; // 数字初期化
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
case 1:
//------------------------------------------------------------
// MSP2807起動画面表示 : UTF16
//------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//------------------------------------------------------------
int16_Return = MSP2807_Startup_Screen_UTF16(&STC_uint8_JobNum_MSP2807);
if(int16_Return == -1){
// 処理中
break; // 処理番号維持 : 処理継続 : case 1: をループ
}
// 数字の文字列を初期化
memcpy(&STC_uint8_String[0], (uint8_t *)"0", 3);
memcpy(&STC_uint8_String[3], (uint8_t *)"0", 3);
memcpy(&STC_uint8_String[6], (uint8_t *)"0", 3);
STC_uint8_String[9] = 0;
STC_uint8_String[10] = 0;
STC_uint8_String[11] = 0;
(*puint8_JobNum)++; // 次の処理番号に移行する。 : case 2:
int16_Return = -1; // 処理継続
break;
case 2:
//-----------------------------------------------------------------------
// font 32 x 32 : Unicodee : 数字を表示する。
//-----------------------------------------------------------------------
//--------------------------------------------------
// 横長表示 左
//--------------------------------------------------
//---------------------------------------------------------------------------
// LCD文字表示 : Font選択 : ILI9341 : Unicode
//---------------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Font : font指定
// 8 : 16 x 16 font : Unicode
// 9 : 32 x 32 font : Unicode
// 10 : 48 x 48 font : Unicode
// 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_Data : 表示文字コードが格納されているBufferのポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//---------------------------------------------------------------------------
int16_Return = ILI9341_SPI_Display_String_Unicode(&STC_uint8_JobNum_MSP2807,
(uint16_t)def_Font_Unicode_Expand_32x32,
def_WidthwiseL, 0,
(uint32_t)def_Code_White,
132, 128,
3, STC_uint8_String);
if(int16_Return == -1){
// 処理中
break; // 処理番号維持 : 処理継続 : case 2: をループ
}
STC_uint8_JobNum_Wait = 0; // 時間待ちの処理番号初期化
STC_uint32_Interval = (uint32_t)1000; // 待ち時間 : 1000mSec
(*puint8_JobNum)++; // 次の処理番号に移行する。 : case 3:
int16_Return = -1; // 処理継続
break;
case 3:
//------------------------------------------------------
// 時間待ち : 単位 mSec
//------------------------------------------------------
// 戻り値が -1 以外になるまで、繰り返し呼び出してください。
//------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号が格納される変数のポインタ
// uint32_t *puint32_tikstart : 時間待ち開始時のカウント数
// uint32_t uint32_mSec : 待ち時間(mSec)
// 戻り値:
// -1 : 処理中 : 時間が経過していない。
// 0 : OK終了 : 時間が経過した。
// 1 : NG終了
//------------------------------------------------------
int16_Return = Wait_Interval(&STC_uint8_JobNum_Wait,
&STC_uint32_tikstart,
STC_uint32_Interval);
if(int16_Return == -1){
// 処理中 : 時間未経過
break; // 処理番号維持 : 処理継続 : case 3: をループ
}
STC_uint16_Num++; // 数字をインクリメント
if(STC_uint16_Num > 999){
// 数字が 999 を越えたら 0 に戻す。 : 0 - 999 を繰り返す。
STC_uint16_Num = 0;
}
//-------------------------------------------------------------------
// 数字を3桁の文字列に変換 : Unicode
//-------------------------------------------------------------------
// 引数:
// uint16_t uint16_Num : 数字
// uint8_t *puint8_String : 3桁の文字列に変換したデータを格納するバッファのポインタ
// 戻り値:
// なし
//-------------------------------------------------------------------
Conv_Num_String_3_Unicode(STC_uint16_Num, STC_uint8_String);
(*puint8_JobNum)--; // 次の処理番号に移行する。 : case 2:
int16_Return = -1; // 処理継続
break;
default:
*puint8_JobNum = 0; // 処理番号初期化
int16_Return = 1; // NG
break;
}
return(int16_Return);
}
2) ILI9341 の初期化
case 0: では、初期化済みフラグ GLB_uint8_Flag_Init_ILI9341 を判定して、
初期化済みでない場合は、モジュール ILI9341_Initialize を呼び出して
ILI9341 の初期化を行います。
3) 起動画面表示
case 1: では、MSP2807_Startup_Screen_UTF16 を呼び出して
起動画面の表示を行います。
以下の画面が表示されます。
4) 数字表示
case 2: では、3桁の数字を表示します。
上記の画面で 377 の部分です。
数字は case 3: でカウントアップされます。
5) 時間待ちと数字のカウントアップ
case 3: では、1000mSec の時間待ちをします。
1000mSec 経過したら、表示する数字をカウントアップします。
数字が 999 を超えたら、000 に戻します。
000 から 999 を繰り返しカウントアップします。
処理番号を 2 にします。
case 2: と case 3: を繰り返し実行します。
Unicode文字表示モジュール の使用方法
Unicode文字表示モジュール ILI9341_SPI_Display_String_Unicode の使用方法を
簡単に説明します。
Unicode文字表示は、ILI9341_Display_String_Unicode/ILI9341_Display_String_Unicode.c 内の
モジュール ILI9341_SPI_Display_String_Unicode に文字コードなどの引数を渡して行います。
引数に (uint8_t *)"ようこそ!" のように
直接、日本語を指定して、日本語表示を行うことができます。
1) 通常の使用方法
使用例として MSP2807_Startup_Screen_UTF16/MSP2807_Startup_Screen_UTF16.c 内の
MSP2807起動画面表示モジュール MSP2807_Startup_Screen_UTF16 で
"ようこそ!" を 16 x 16 のフォントで表示している部分を以下に示します。
case 4:
//-----------------------------------------------------------------------
// "ようこそ!" : 16 x 16 font : UTF-8
//-----------------------------------------------------------------------
//--------------------------------------------------
// 横長表示 左
//--------------------------------------------------
//----------------------------------------------------------------------------
// LCD文字表示 : Font選択 : ILI9341 : Unicode
//----------------------------------------------------------------------------
// 引数:
// uint8_t *puint8_JobNum : 処理番号を格納する変数のポインタ
// uint16_t uint16_Font : font指定
// 8 : 16 x 16 font : Unicode
// 9 : 32 x 32 font : Unicode
// 10 : 48 x 48 font : Unicode
// 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_Data : 表示文字コードが格納されているBufferのポインタ
// 戻り値:
// -1 : 処理中
// 0 : OK終了
// 1 : NG終了
//----------------------------------------------------------------------------
int16_Return = ILI9341_SPI_Display_String_Unicode(&STC_uint8_JobNum_LCD,
(uint16_t)def_Font_16x16_Unicode,
def_WidthwiseL, 0,
(uint32_t)def_Code_Blue,
192, 0,
5, (uint8_t *)"ようこそ!");
if(int16_Return == -1){
// 処理中
break; // 処理番号維持 : 処理継続
}
(*puint8_JobNum)++; // 次の処理番号に移行する。
int16_Return = -1; // 処理継続
break;
それぞれの引数に、目的の値をセットして呼び出しています。
戻り値が "処理中" でなくなるまで、case 4: をループして繰り返し呼び出します。
戻り値が "処理中" 以外になったら、次の処理番号に移行します。
case 5: では "電子工作" を 48 x 48dot に拡大表示しています。
MSP2807起動画面表示モジュール MSP2807_Startup_Screen_UTF16 では、
いろいろなサイズと向きでUnicode文字を表示しているので、参考にしてください。
2) 並列動作がよくわからない場合
以下のように、int16_Return が -1 以外の値になるまで繰り返し呼び出すことにより
文字列を表示することができます。
STC_uint8_JobNum_LCD = 0;
do{
//-----------------------------------------------------------------------
// "ようこそ!" : 16 x 16 font : UTF-8
//-----------------------------------------------------------------------
//--------------------------------------------------
// 横長表示 左
//--------------------------------------------------
//----------------------------------------------------------------------------
// LCD文字表示 : Font選択 : ILI9341 : Unicode
//----------------------------------------------------------------------------
int16_Return = ILI9341_SPI_Display_String_Unicode(&STC_uint8_JobNum_LCD,
(uint16_t)def_Font_16x16_Unicode,
def_WidthwiseL, 0,
(uint32_t)def_Code_Blue,
192, 0,
5, (uint8_t *)"ようこそ!");
}while(int16_Return == -1);
Unicode文字表示モジュール の説明
Unicode文字表示モジュール ILI9341_Display_String_Unicode の説明を記します。
ILI9341_Lib/ILI9341_Display/ILI9341_Display_String_Unicode/ILI9341_Display_String_Unicode.c に
記述されています。
1) 描画Frameの構造体設定
case 0: では Set_structFrame_UTF16 を呼びだして
表示範囲を、描画Frame設定用の構造体にセットします。
case 0:
STC_uint8_JobNum = 0; // 表示処理番号初期化
STC_uint16_Position = 0;
STC_uint16_SendCount = 0;
STC_uint16_Position_DrawBuffer = 0;
//----------------------------------------------------------------------------
// 描画Frameの構造体設定 : Unicode
//----------------------------------------------------------------------------
// 引数:
// uint16_t uint16_Font : font指定
// 8 : 16 x 16 font : Unicode
// 9 : 32 x 32 font : Unicode
// 10 : 48 x 48 font : Unicode
// 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_Unicode(uint16_Font,
uint16_StartX, uint16_StartY,
uint16_Length,
&STC_structFrame_LCD);
if(int16_Return != 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_UTF16 を呼び出して
表示Frame に書き込むための文字列データを
描画Bufferにセットします。
case 1:
//---------------------------------------------------------------------------
// 表示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){
*puint8_JobNum = 0; // 処理番号初期化
break; // NG終了
}
//----------------------------------------------------------------------------
// 描画Buffer設定 : Unicode
//----------------------------------------------------------------------------
// 引数:
// uint16_t uint16_Font : font指定
// 8 : 16 x 16 font : Unicode
// 9 : 32 x 32 font : Unicode
// 10 : 48 x 48 font : Unicode
// uint8_t uint8_Type : 表示選択
// 0 : 通常表示
// 1 : 反転表示
// 2 : 通常表示の上書き
// 3 : 反転表示の上書き
// uint16_t uint16_Length : 表示文字数
// uint8_t *puint8_Char : 文字コードが格納されたBufferのポインタ
// uint8_t *puint8_Buffer : 描画Bufferのポインタ
// uint16_t *puint16_Width : 文字の幅の変数のポインタ
// uint16_t *puint16_Height : 文字の高さの変数のポインタ
//----------------------------------------------------------------------------
Set_DrawBuffer_Unicode(uint16_Font,
uint8_Type,
uint16_Length,
puint8_Data, GLB_uint8_DrawBuffer_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送信 : case 2: - case 5: で、送信データの作成と送信を行う。
//----------------------------------------------------------------------
if(uint8_Type < 0x02){
// 0 : 通常表示
// 1 : 反転表示
for(int16_I = 0; int16_I < (int16_t)(STC_uint16_Width * def_RGB_byte); int16_I++){
GLB_uint8_Buffer_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_DrawBuffer_LCD,
GLB_uint8_Buffer_1Line_LCD);
}
else{
// 2 : 通常表示の上書き
// 3 : 反転表示の上書き
MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
STC_uint16_Width,
STC_uint16_Position,
GLB_uint8_DrawBuffer_LCD,
&GLB_uint8_Work_1Line_LCD[STC_uint16_Position_DrawBuffer]);
}
// 送信データ数セット
STC_uint16_SendLength = STC_uint16_Width * def_RGB_byte;
(*puint8_JobNum)++; // 次の処理番号に移行する。 : case 3:
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_Buffer_1Line_LCD);
}
else{
// 2 : 通常表示の上書き
// 3 : 反転表示の上書き
int16_Return = ILI9341_SPI_SendData(&STC_uint8_JobNum,
1,
STC_uint16_SendLength,
&GLB_uint8_Work_1Line_LCD[STC_uint16_Position_DrawBuffer]);
}
if(int16_Return == -1){
// 処理中
break; // 処理番号維持 : 処理継続
}
if(int16_Return != 0){
*puint8_JobNum = 0; // 処理番号初期化
break; // NG終了
}
STC_uint16_SendCount++; // 送信カウントをインクリメント
STC_uint16_Position += STC_uint16_DataSize; // 次のデータ位置をセット
STC_uint16_Position_DrawBuffer += STC_uint16_SendLength;
// 描画Bufferの位置を更新
(*puint8_JobNum)++; // 次の処理番号に移行する。 : case 4:
int16_Return = -1; // 処理継続
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_SPI1_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_DrawBuffer_LCD,
GLB_uint8_SPI1_TxBuffer);
}
else{
// 2 : 通常表示の上書き
// 3 : 反転表示の上書き
MakeSendData_1Line_ColorCode_2byte(uint32_ColorCode,
STC_uint16_Width,
STC_uint16_Position,
GLB_uint8_DrawBuffer_LCD,
&GLB_uint8_Work_1Line_LCD[STC_uint16_Position_DrawBuffer]);
for(uint16_I = 0; uint16_I < (STC_uint16_Width * def_RGB_byte); uint16_I++){
GLB_uint8_SPI1_TxBuffer[uint16_I]
= GLB_uint8_Work_1Line_LCD[STC_uint16_Position_DrawBuffer + uint16_I];
}
}
// 送信データ数セット
GLB_int16_vSPI1_TxNumber = STC_uint16_Width * def_RGB_byte;
(*puint8_JobNum)++; // 次の処理番号に移行する。 : case 5:
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){
int16_Return = SPI1_Master_TxRxByte(&STC_uint8_JobNum, 0);
}
else{
int16_Return = SPI1_Master_TxRxByte(&STC_uint8_JobNum, 1);
}
if(int16_Return == -1){
// 処理中
break; // 処理番号維持 : 処理継続
}
if(int16_Return != 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;
// 描画Bufferの位置を更新
(*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);
*puint8_JobNum = 0; // 処理番号初期化
int16_Return = 0; // OK終了
break;
A+-2C (ええ加減にC) のページに戻る
メールアドレス: apm2c.sumi@gmail.com
なんでも、気軽に ご相談ください。
担当:おの
えがおのでんし 案内