STM32F103+カラーLCD評価基板で文字を表示させる編 全角/半角混載OKですぅ。 [ARM&Cortex-M3]
※ソースコードのhtml変換はこれを使わせてもらっています。
http://noritan-micon.blog.so-net.ne.jp/2009-06-11
ASCII文字の表示を出来るようにしました。
ASCII/日本語(Shift-JIS)の区別は、最初の文字コードが0x80を越えるか超えないかで判断できます。
日本語のFontは従来から使わせて頂いているFONTX形式のフリーフォントです。ASCII文字のFontデータは、ネットを探せばフリーの物が有るのでしょうけれど、まあ自分でFontデータを作るのは容易いので、作ります。
まずペイントソフトでスペース(0x20)から~(0x7E)までの文字を描画していき、これを2値のビットマップファイルとして保存します。
※単に文字を並べていっても、なかなか等間隔にならないので、その辺はちまちま調整が必要。今回もなんだかんだで30分位作業時間が掛かっている。
次にこのビットマップファイルをお手製のCソース変換ソフトを通してCソース化し、そのソースファイルをプロジェクトに組み込む訳です。
※以下がその変換ソフトのソース。
これ出来上がったCソースは、やっぱり1ピクセル=1bitのデータなので、先にやった日本語Fontと同様にbit長を16bitに変換して使う必要が有ります。
まあその前にASCIIコードから該当のビットマップデータを取得する処理が必要ですので、それは以下の様にしました。
上記処理はあくまでもFontデータの取得のみなので、実際には1bit→16bit変換がこの後に続きますが、これは既に行っているので省略。
で、ASCII文字と日本語の混載文字列の表示例が冒頭の写真になります。
http://noritan-micon.blog.so-net.ne.jp/2009-06-11
ASCII文字の表示を出来るようにしました。
ASCII/日本語(Shift-JIS)の区別は、最初の文字コードが0x80を越えるか超えないかで判断できます。
日本語のFontは従来から使わせて頂いているFONTX形式のフリーフォントです。ASCII文字のFontデータは、ネットを探せばフリーの物が有るのでしょうけれど、まあ自分でFontデータを作るのは容易いので、作ります。
まずペイントソフトでスペース(0x20)から~(0x7E)までの文字を描画していき、これを2値のビットマップファイルとして保存します。
※単に文字を並べていっても、なかなか等間隔にならないので、その辺はちまちま調整が必要。今回もなんだかんだで30分位作業時間が掛かっている。
次にこのビットマップファイルをお手製のCソース変換ソフトを通してCソース化し、そのソースファイルをプロジェクトに組み込む訳です。
※以下がその変換ソフトのソース。
/* ------------------------------------------------------------------------ */ /* Windows ビットマップファイルをCソースに変換する。 */ /* */ /* 変換出来るフォーマットはWindows BMP、2色、RGBです。 */ /* 上記のフォーマットは、大概のペイントツールで可能でしょう。 */ /* Copyright (C) 2007 - by hamayan */ /* ------------------------------------------------------------------------ */ #include <stdio.h> #include <stdlib.h> typedef struct /*ビットマップファイルヘッダー*/ { char bfType[2]; /*認識文字*/ char bfSize[4]; /*ファイルサイズ*/ char bfReserved1[2]; /*予約1*/ char bfReserved2[2]; /*予約2*/ char bfOffBits[4]; /*ピクセルデータまでのバイト数*/ } BITMAPFILEHEADER; typedef struct /*ビットマップ情報ヘッダー*/ { char biSize[4]; /*BITMAPFILEHEADERのサイズ*/ char biWidth[4]; /*ピクセルデータの幅*/ char biHeight[4]; /*ピクセルデータの高さ*/ char Planes[2]; /*カラープレーン数*/ char biBitCount[2]; /*色数*/ char biCompression[4]; /*圧縮形式*/ char biSizeImage[4]; /*ピクセルデータのサイズ*/ char biXPelsPerMeter[4]; /*水平解像度*/ char biYPelsPerMeter[4]; /*垂直解像度*/ char biClrUsed[4]; /*使用カラー数*/ char biClrImportant[4]; /*重要なカラー数*/ } BITMAPINFOHEADER; typedef struct /*カラーパレット*/ { unsigned char rgbBlue; /*青の輝度*/ unsigned char rgbGreen; /*緑の輝度*/ unsigned char rgbRed; /*赤の輝度*/ unsigned char rgbReserved; /*予約*/ } RGBQUAD; typedef struct /*ファイル全体のフォーマット*/ { BITMAPFILEHEADER bf; BITMAPINFOHEADER bi; RGBQUAD rgb[1]; } BITMAPFILEFORMAT; int main( int argc, char *argv[] ) { char *FileBuffer; char *bmp; int i,j,k,width,line,shift; long FileSz,curpos; BITMAPFILEFORMAT *head; RGBQUAD *rgb; FILE *in,*out; if( argc != 2 && argc != 3 ) { printf( "Parameter Error\n" ); return EOF; } if( argc == 2 ) out = stdout; else { out = fopen( argv[2], "w+t" ); } /*引数のファイルをOPENする。*/ if( (in = fopen( argv[ 1 ], "rb" )) == NULL ) return EOF; /*ファイルのサイズを取得する。*/ curpos = ftell( in ); fseek( in, 0, SEEK_END ); FileSz = ftell( in ); fseek( in, curpos, SEEK_SET ); FileBuffer = malloc( FileSz + 1 ); /*ファイルの内容を取込み*/ curpos = fread( FileBuffer, 1, FileSz, in ); /*ファイルの内容を取り込んだので、CLOSEする。*/ fclose( in ); /*ファイルの情報を表示する。*/ head = (BITMAPFILEFORMAT *)FileBuffer; /*意匠表示*/ fprintf( out, "/* ------------------------------------------------------------------------ */\n" "/* 画像データテーブル */\n" "/* designed by hamayan */\n" "/* Copyright (C) 2003 - by hamayan */\n" "/* ------------------------------------------------------------------------ */\n\n" ); fprintf( out, "/*\tGraphic Info*/\n" ); fprintf( out, "/*\tType:%c%c*/\n" "/*\tFile size=%ld*/\n" "/*\tOffset=%ld*/\n\n", head->bf.bfType[0],head->bf.bfType[1], *((long *)head->bf.bfSize), *((long *)head->bf.bfOffBits) ); fprintf( out, "/*\tHeader size=%ld*/\n" "/*\tWidth=%ld*/\n" "/*\tHeight=%ld*/\n" "/*\tPlanes=%d*/\n" "/*\tCount=%d*/\n" "/*\tImg size=%d*/\n" "/*\tX pics=%ld*/\n" "/*\tY pics=%ld*/\n" "/*\tColor Used=%d*/\n\n", *((long *)head->bi.biSize), *((long *)head->bi.biWidth), *((long *)head->bi.biHeight), *((short *)head->bi.Planes), *((short *)head->bi.biBitCount), *((long *)head->bi.biSizeImage), *((long *)head->bi.biXPelsPerMeter), *((long *)head->bi.biYPelsPerMeter), *((long *)head->bi.biClrUsed) ); fprintf( out, "const long PixWidth = %ld;\n" "const long PixHeight = %ld;\n", *((long *)head->bi.biWidth), *((long *)head->bi.biHeight) ); #define BITCOUNT (*((short *)head->bi.biBitCount)) #define OFFBITS (*((long *)head->bf.bfOffBits)) #define HEIGHT (*((long *)head->bi.biHeight) - 1) /*縦横サイズの調整*/ width = *((long *)head->bi.biWidth); /*横方向のbyte数を計算*/ width = ((width - 1) * BITCOUNT / 8) + 1; line = (((width - 1) / sizeof(long)) + 1) * sizeof(long); /*左下を原点にしている為に、上下方向のみ入れ替えが必要となる。*/ /*画像データをCソースファイルに変換する。*/ fprintf( out, "\n/*\tparameter width = %d height = %d line = %d*/\n", width, HEIGHT + 1, line ); fprintf( out, "const char GraphicBMPTable[] = \n" ); fprintf( out, "{\n" ); for( i = HEIGHT; i >= 0; i-- ) /*逆順に廻して行く*/ { fprintf( out, "\t" ); bmp = (char *)head + (i * line) + OFFBITS; /*パレット番号が登録されたテーブルから読み出し*/ for( j = 0; j < width; j++ ) { fprintf( out, "0x%02X,", ~(*bmp) & 0x00ff ); bmp++; } putc( '\n', out ); } fprintf( out, "};\n\n" ); for( i = HEIGHT; i >= 0; i-- ) /*逆順に廻して行く*/ { fprintf( out, "/*\t" ); bmp = (char *)head + (i * line) + OFFBITS; /*パレット番号が登録されたテーブルから読み出し*/ for( j = 0; j < width; j++ ) { for( k = 0; k < 8; k++ ) { fprintf( out, "%c", (*bmp & (0x80 >> k)) ? ' ' : '*' ); } bmp++; } fprintf( out, "*/\n" ); } /*意匠表示*/ fprintf( out, "\n" "/* ------------------------------------------------------------------------ */\n" "/* end of file */\n" "/* designed by hamayan */\n" "/* Copyright (C) 2003 - by hamayan */\n" "/* ------------------------------------------------------------------------ */\n" ); if( argc == 3 ) fclose( out ); free( FileBuffer ); return 0; } /* ------------------------------------------------------------------------ */ /* Copyright (C) 2003 - by hamayan */ /* ------------------------------------------------------------------------ */
これ出来上がったCソースは、やっぱり1ピクセル=1bitのデータなので、先にやった日本語Fontと同様にbit長を16bitに変換して使う必要が有ります。
まあその前にASCIIコードから該当のビットマップデータを取得する処理が必要ですので、それは以下の様にしました。
/*************************************************************************/ /* ASCII文字の表示 */ /* ASCII文字は、横8ピクセル、縦14ピクセルで構成されている。 */ /* 文字範囲は、スペース(0x20)から~(0x7E)までの95文字。 */ /* 失敗するとNULLポインターを返す。 */ /*************************************************************************/ static char *GetASCII( char *dst, int code ) { int i; char *ptr = dst; if( code < ' ' || code > '~' ) return 0; code -= ' '; /*オフセット分を削除*/ for( i = 0; i < ASCII_PixHeight; i++ ) { *ptr++ = *(ASCII_GraphicBMPTable + code + (i * ASCII_PixWidth / 8)); } return dst; }
上記処理はあくまでもFontデータの取得のみなので、実際には1bit→16bit変換がこの後に続きますが、これは既に行っているので省略。
で、ASCII文字と日本語の混載文字列の表示例が冒頭の写真になります。
ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発
- 作者: 濱原 和明
- 出版社/メーカー: オーム社
- 発売日: 2005/04/25
- メディア: 単行本
2009-09-19 12:57
nice!(0)
コメント(0)
トラックバック(0)
コメント 0