STM32F103+カラーLCD評価基板で文字を表示させる編 [ARM&Cortex-M3]
某blogのグダグダした書き込みをLCDに表示させてみました。
Fontの扱いについてはこことか
http://hamayan.ddo.jp/~hamayan/so-net/font.html
こことか
http://hamayan.ddo.jp/~hamayan/so-net/colorlcd.html
を参照してください。まあ過去に通った道なので、
但しまだ半角のFontを作っていないので全角しか表示できません(笑、ずーっとそれだけれど)。
ただ過去にFontを扱った時は開発環境はHEWだったので、Shift-JISのコードを文字列に組み込む事は問題が無かったのだけれど、今回はWindows上で動くgcc環境なので、文字(文字コード)によっては正常に処理できない物もあります。
例えば写真の一番上の行では「開発環境を穀しています」となっていますが、本当は「開発環境を構築しています」です。どうも”構築”の”構”に反応してしまったみたいで、、、。他にも正常に処理できない文字は幾つかあります。
※元々Fontデータ(16ドットFont)は2値(1bit)データなのですが、このLCDには1ピクセルに16bitの情報を与えますので、一旦16×16×2byteのバッファにbit→unsigned shortの変換を掛けて展開を行い、それからDMAでカラーLCDへ転送しています。けれどメモリが少ない(勿体無い)場合はバッファしなくてもできるかな。
※補足
呼び出し側も掲載して置きます。
Fontの扱いについてはこことか
http://hamayan.ddo.jp/~hamayan/so-net/font.html
こことか
http://hamayan.ddo.jp/~hamayan/so-net/colorlcd.html
を参照してください。まあ過去に通った道なので、
但しまだ半角のFontを作っていないので全角しか表示できません(笑、ずーっとそれだけれど)。
ただ過去にFontを扱った時は開発環境はHEWだったので、Shift-JISのコードを文字列に組み込む事は問題が無かったのだけれど、今回はWindows上で動くgcc環境なので、文字(文字コード)によっては正常に処理できない物もあります。
例えば写真の一番上の行では「開発環境を穀しています」となっていますが、本当は「開発環境を構築しています」です。どうも”構築”の”構”に反応してしまったみたいで、、、。他にも正常に処理できない文字は幾つかあります。
※元々Fontデータ(16ドットFont)は2値(1bit)データなのですが、このLCDには1ピクセルに16bitの情報を与えますので、一旦16×16×2byteのバッファにbit→unsigned shortの変換を掛けて展開を行い、それからDMAでカラーLCDへ転送しています。けれどメモリが少ない(勿体無い)場合はバッファしなくてもできるかな。
/*********************************************************************************/ /* LCDディスプレイに文字を描画する処理 */ /* designed by hamayan since 2009/05/21 */ /*********************************************************************************/ #include "delivertive.h" #include "S1D13743.h" #include "dib.h" /*************************************************************************/ /* 端子定義 */ /*************************************************************************/ /*************************************************************************/ /* その他の定義 */ /*************************************************************************/ typedef struct { unsigned short start; /*漢字コードの開始番号*/ unsigned short end; /*漢字コードの終了番号*/ const char *font; /*フォントデータ領域の先頭アドレス*/ } AREA_RECORD; /*************************************************************************/ /* 大域変数宣言 */ /*************************************************************************/ extern unsigned short BGColor; /*背景色*/ /*フォントヘッダー情報*/ extern const unsigned short KanjiXSize; extern const unsigned short KanjiYSize; extern const unsigned short KanjiTnum; extern const AREA_RECORD KanjiAreaRecord[]; static unsigned short font_buffer[ 16 * 16 ]; /*************************************************************************/ /* プロトタイプ宣言 */ /*************************************************************************/ /*************************************************************************/ /* 漢字表示処理 */ /* 一時的に512byteのバッファを必要とする。 */ /*************************************************************************/ void KanjiPrint( const char *msg ) { #define __X_STEP__ 16 #define __Y_STEP__ 20 int i,j,k; int pos_x,pos_y; char *str,*ptr,temp; unsigned short code,*bmp; DrawForm df; str = (char *)msg; pos_x = pos_y = 0; while( *str ) { if( *str < 0x80 ) /*ASCII文字*/ { if( *str == '\r' ) { pos_x = 0; } else if( *str == '\n' ) { pos_y += __Y_STEP__; if( pos_y >= Y_MAX_PIXEL ) pos_y = 0; } else ; str++; /*文字列のポインターを進める*/ } else /*Shift-JISコード*/ { for( i = 0; i < KanjiTnum; i++ ) /*Shift-JISコード表からコードを検索*/ { code = str[ 1 ] + (str[ 0 ] << 8); /*リトルエンディアンなので前後を入れ替える*/ if( code >= KanjiAreaRecord[ i ].start && code <= KanjiAreaRecord[ i ].end ) { ptr = (char *)KanjiAreaRecord[ i ].font + ((code - KanjiAreaRecord[ i ].start) * KanjiXSize / 8 * KanjiYSize); break; /*見付かった時はループを抜ける*/ } else ; } if( i != KanjiTnum ) /*コードが見付かった時の処理*/ { /*fontデータのビットを調べて、16bit長のデータに変換して行く。*/ for( i = 0, bmp = font_buffer; i < 16; i++ ) { for( j = 0; j < 2; j++ ) { temp = *ptr; for( k = 0; k < 8; k++ ) { if( temp & 0x80 ) *bmp++ = WHITE; else *bmp++ = DARKBLUE; temp <<= 1; } ptr++; } } /*文字の表示*/ PutPics( pos_x, KanjiXSize, pos_y, KanjiYSize, font_buffer ); str += 2; /*文字列のポインターを進める*/ pos_x += __X_STEP__; if( pos_x >= X_MAX_PIXEL ) { pos_x = 0; pos_y += __Y_STEP__; if( pos_y >= Y_MAX_PIXEL ) pos_y = 0; } } } } } /*********************************************************************************/ /* end of file */ /* designed by hamayan since 2009/05/21 */ /*********************************************************************************/
※補足
呼び出し側も掲載して置きます。
static const char msg[] = "現在2台のPCにARMの開発環境を構築しています。\r\n" "某アプリケーションを試してみようとサンプルプロジェクトをビルドしたのだけれど、ビルドの途中で「そんなオプションスイッチは有りませーん」と怒られて終了してしまう。\r\n" "しかし別のPC上ではちゃんとビルドできている。\r\n" "\r\n" "さて、この2つの違いは、、、開発環境の構築時期、つまり幾つかのツールチェインのバージョンが上がっている事が真っ先に考えられます。\r\n" "\r\n" "引っかかっているコンパイルオプションスイッチはこれ、\r\n"; KanjiPrint( msg );
ARM組み込みソフトウェア入門―記述例で学ぶ組み込み機器設計のためのシステム開発 (Design Wave Advanceシリーズ)
- 作者: Andrew N. Sloss
- 出版社/メーカー: CQ出版
- 発売日: 2007/08
- メディア: 単行本
ARM Cortex‐M3システム開発ガイド―最新アーキテクチャの理解からソフトウェア開発までを詳解 (Design Wave Advance)
- 作者: Joseph Yiu
- 出版社/メーカー: CQ出版
- 発売日: 2009/05
- メディア: 単行本
2009-09-19 01:58
nice!(0)
コメント(6)
トラックバック(0)
いわゆるダメ文字問題ですね。
http://www.wdic.org/w/WDIC/%E3%81%A0%E3%82%81%E6%96%87%E5%AD%97
HEWで使っていたソースを移植するときに出て困ったことがあります。
http://www8.plala.or.jp/kusutaku/yusuket/gcc_memo.html
このオプションで回避できるでしょうか?
by おる (2009-09-24 10:12)
駄目文字と言うのですか。
-finput-charset=cp932 -fexec-charset=cp932
を付けてみましたら、
「no iconv implementation, cannot convert from cp932 to UTF-8」
だそうです。
単純にiconv.exeとiconv.dllを探して来てパスの通っているところに置いても駄目でした。トホホ。
by hamayan (2009-09-24 11:08)
ああ勿論、iconv.dllはsystem32に置いています。
by hamayan (2009-09-24 11:09)
charsetオプションそのものがない可能性があります。
http://d.hatena.ne.jp/embedded/20090226/p1
ソフトは詳しくないのですが、出力はシフトJISになってるようなので、iconv.exeでUTF-8の中間ファイルを作成してgccかけるといいのかも。
by おる (2009-09-25 09:43)
> iconv.exeでUTF-8の中間ファイルを作成してgccかけるといいのかも。
確かに、makefileの中にこの処理を組み込んでしまうと言うのが実際的でしょうね。ちょっと残念な気がするけれど。
でもこのiconvって、今後色々活躍しそうですね。
by hamayan (2009-09-25 13:14)
arm用のgccそのものがiconvを呼び出していないみたいです。
iconvでUTF-8に変換かけて、gccを通すと出力されるファイルもUTF-8のコードになってしまいました。
¥マークつけていくしか手がないのかもしれませんが、HEWとかに戻すとおまぬけな表示になってしまって面倒です。
by おる (2009-09-25 14:29)