WAVプレーヤーの製作(その8:カラーLCDに漢字表示)

前回、長いファイル名の表示ができたところで、次は漢字やかなを含むファイル名をカラー・グラフィックLCDに表示することが課題です。4月はCMがとても忙しく、やっとこの連休で本格的な取り組みができた。

開発環境は、STBee(stm32F103)+ssd1289 カラーグラフィックLCD+SDIO SDカードを使い、マイコン徹底入門のEclipse IDEを使います。オリジナルのサンプルソフト(小生が一部修正)で、ssd1289のドライブライブラリができており、英数字ならば表示も可能になっているのですが、今回は「日本語表示」がメイン課題です。

グラフィックLCDに文字を表示させるにはビットマップ文字データが必要になる。今回はpicfunの漢字表示グラフィックライブラリを使用させて頂いた。このライブラリでは12×12ドットの漢字データが使われているのでサイズ的に丁度良さそうなのと、オン・メモリーで使いたいので、190kByte程度のオブジェクトサイズという記事を見て使ってみることにしました。

漢字データ(ビットマップ)のドットデータをssd1289の240×320ドットLCDに印字するにはオリジナルのDraw_Pixel関数を使えば良さそうだが、さて表示したい漢字から使用するデータへの橋渡しはどうやってやるのだろうかを調べると、先のpicfunのライブラリの中に漢字コード2Byteから配列インデックスを求める方法が記載されている。これを自分の環境用に変形すれば良さそうです。

・・・・と、簡単に書きましたが、例によって試行錯誤の連続でした。

【ASCII文字の表示】
stm32_proj_22.jpg

picfunで使っているfont.hデータ(5×7ドット)を使ったものですが、小さすぎます。

【漢字データ(0x81,・・・等)で与えた文字の表示】
stm32_proj_29.jpg

ありゃ、横向きでした。このLCDの物理原点は右上なので、行とカラムを入れ替え、行中のカラムデータは物理的最大位置から減ずる方向で作図します。(これは作図ドライバと関連あるかもしれませんが結果合わせでやってます。後日詳細を調べます)

【修正済み】
stm32_proj_23.jpg

stm32_proj_24.jpg

【ファイルリストの表示】
stm32_proj_27.jpg

これぐらいの文字の大きさだったら丁度良いのではないでしょうか?
気付かれたと思いますが、全て2バイト文字になってます。(ここらは改良要かな)

SDIO接続のSDカードから読んでいますが、何故か物理的にPULLアップしないと動かなくなってました。
マイコン徹底入門のEclipse IDE環境ではPULLアップせよ と記載されているので正常な動作なのですが、内部PULLアップ機能を備えた stm32 なのですから、SDIOでのソフトウエア設定は何処でやるのかな? これは宿題です。


完成後の表示を見ると何でもない(簡単なという意味)ことですが、またまた難航しました。以下、備忘録です。

1.二次配列の漢字フォントデータが、KanjiFont12.h というような外部ファイルに置いた状態で
  読み込みができない。

  散々調べましたが、「gccの仕様」らしいとしか解りませんでした。
  →何と! main.c の中に835kbyteものテキストデータを入れ込みました
    更に調べると一次配列として読み込んでから二次にキャストする方法があるらしいですが、未着手です。

2.ASCII文字のフォントが小さすぎる。これを12×12のものに入れ替えると内部メモリを圧迫する
  (現在295k)
ので中止。
  →全てを2バイト文字に変換するルーチンを挿入したこちらのコードをそのまま使用させて頂いた
    半角と全角が混じっていても全てが全角になるのでGoodです。

3.コード上に置いたリテラル文字(漢字)が表示できない。
  →Eclipse IDEのEditorがUTF-8なので、SJISフォント(ANKは1バイト、漢字は2バイト)を前提としている
    コード処理がエラーとなる(UTF-8は漢字が3バイト)。EditorをSJISに変更した
    Eclipse のProject 欄にあるファイルを右クリックし、property を出す。最下段にフォント選択欄があるが
    sjis が無いので、sjis と入力し適用ボタンを押す。

    最初は全く気が付かずにあたふたしました。漢字コードをHex表示させて気が付きました。
    ただ、Eclipse Debug がエラーで動かないので、LCDで表示させなければならず手間でした。
    これはこれで直しておかねばならないが。

備忘録の備忘録
1.
LCDに文字を表示させるには、文字コードからフォントデータの配列インデックスを算出し、更にその配列インデックスからLCDのピクセルにドット打って作図するのだが、その仕組みは 後閑さんの picfun 記事にしっかりと記載されています。
こちらのページにはフォントデータの配列インデックスとLCD各ドットへの点位置関係が図解されています。
ただし LCD が特殊なので、ドットを打つルーチンはこちらのページこのコードが直接的に参考になります。

2.
半角全角交じりの文字を全て全角に変換する機能は上記2.こちらのコード でOKになったのだが、当初は半角だけの文字列を全角にすると思い込んでいたので、自分で半角と全角を識別するルーチンを作った。
ここで問題を発生させたのが「文字列の定義の仕方」でした。c言語1年生レベルの小生が起しそうなミスでした。
簡単に書くと
 char *str = "ABC"; と記述する方法は「書き換えられない文字リテラル」を定義しており
 char str[] = "ABC"; と記述する方法は「書き換えられることができる文字リテラル」を定義することになる。

3.
同上の半角から全角に変換するコードには私が使ったことの無い for 文の使い方がありました。
コードを記述すると、
int han2zen(char *str)
{
        char *buf,*p,*ptr;
        buf=(char *)calloc(strlen(str)*2+1,sizeof(char));
        for(ptr=str,p=buf;*ptr!='\0';*ptr++){
            if(issjiskanji(*ptr)){
                    /* SJIS漢字1バイト目の場合 */
                    *p=*ptr;
                    p++;
                    ptr++;
                    *p=*ptr;
                    p++;
                    *p='\0';
                    continue;
            }
                switch((int)*ptr){
                        case    ' ': strcpy(p," ");p+=2;break;
                        case    '!': strcpy(p,"!");p+=2;break;
         ・・・・・中略・・・・・・・・・・・・・・・・・・・・・・・
                        case    '}': strcpy(p,"}");p+=2;break;
                        default:
                                *p=*ptr;
                                p++;
                                *p='\0';
                                break;
                }
        }
        strcpy(str,buf);
        free(buf);
        return(0);
}
私なりに解釈すると(ptr=str)関数han2zenに渡された文字列 str アドレスを ptr に、(p=buf)buf アドレスを
p に引き継ぐ。(*ptr != '\0') 文字列の最後でなかったら、(*ptr++)文字列のアドレスを進める。巧妙だ。
しかし、その後に繋がる
                    *p=*ptr;
                    p++;
                    ptr++;
                    *p=*ptr;
                    p++;
                    *p='\0';
p++やptr++はアドレスを増やすものと理解できるが、*p=*ptr はどういう意味なのか理解出来ていません。
そもそも*というポインタ記号が付く場合(for文内の*ptr++)と、付かない場合(上記 ptr++)の違いが
解っていない自分であります。

尚、本課題を進めるについて本文中で紹介したページ以外に、以下のページを参照しました。
マイコンでフォントを読み込む!!
チカラの技術、ビットマップフォントでLCDにファイル名を表示
マイコン風雲録、FONTX2ビューワ
半角と全角の混在するShiftJIS文字コードの扱い方(C/C++)


理解していないところが多々ありますが、追々調べるとして、次はファイルリストにタッチして画面を次に送る
ことや、音楽再生させることかな。それには画面デザインも考える必要がありそうです。





テーマ : 電子工作・電気関係工作
ジャンル : 趣味・実用

コメントの投稿

非公開コメント

プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード