[H8-ML(3660)] Re: H8でグラフィック液晶表示で困っています。
From: Kengo Jinno <kengo@xxxxxxxxxxxx>
Date: 2003年08月04日(月)11時48分39秒
神野です。

Sat, 02 Aug 2003 21:31:57 +0900 ごろに
<JX20030802213157.20624186@xxxxxxxxxxx> の
"[H8-ML(3659)] H8でグラフィック液晶表示で困っています。" のメールで
hiikosan_y_man@xxxxxxxxxxx さんは書きました。

> とここまで書いて、このまま、get910adrを使うのはいやだなと思って
> しまったんです。できれば、switch-caseを使用したくないなと・・・
> switch-caseだと、1文字増えればその分 case : return を用意しなくちゃ
> いけませんから・・・

確かに、その通りですね。

>                       考えとしては、klcd_dt[]に入力された文字コードを
> 文字列化して、その前に、__をくっつけて、文字データを呼び出せばいいかな
> と思っているのですが、int変数を16進表示で、文字列化するような
> プログラムはないでしょうか。

無理じゃないですかねぇ。

> const unsigned char __4c4c[] = {    // 面
>     0xFD,0x05,0xFD,0x97,0x95,0x95,0xFD,0x05,
>     0xFD,0x00,0x03,0x02,0x03,0x02,0x02,0x02,
>     0x03,0x02,0x03,0x00,
> }; // ヘッダーファイル終わり(積は省略)

この __4c4c というのはあくまでも「ソース上の文字列」であって、
コンパイラにとってはただのラベルです。
コンパイル・リンクした後は「どこかのアドレス」としてしか
認識されません。

私だったら、

const   struct  FontDataType    {
    unsigned    int     code;
    unsigned    char    bitmap[20];
}   FontData[] = {
    { 0x2120,   ..... },                                    //  9*10blank
    { 0x4c4c,   0xFD,0x05,0xFD,0x97,0x95,0x95,0xFD,0x05,    //  日本語(面)
                0xFD,0x00,0x03,0x02,0x03,0x02,0x02,0x02,
                0x03,0x02,0x03,0x00, },
    { 0x4051,   ..... },                                    //  日本語(積)
    { 0xb8e9,   ..... },                                    //  ハングル "面"
    { 0xc0fb,   ..... },                                    //  ハングル "積"
};
/*
    FontData[0] は必ず 9*10blank とする。
*/

こんな構造体を用意して、
・文字コード
・フォントのビットマップ
を1ヶ所で関連付けられるようにします。
# 元のソースがめんどくさいのは、
# ・文字コードは get910adr() 内に書かれている。
# ・そのフォントは __4c4c[] に書かれている。
# と別れているため。

そうすると、get910adr() は

// ---  9*10の文字のアドレスを求める
unsigned char *get910adr(int dat)
{
    const   int     nCnt = sizeof(FontData) / sizeof(FontData[0]);
    int     i;
    
    for( i = 0; i < nCnt; i++ ) {
        if( dat == FontData[i].code ) {
            return FontData[i].bitmap;
        }
    }
    return( FontData[0].bitmap );   //  9*10blank
}

こんな感じになります。

文字が増えても get910adr() は変更する必要はありません。

-- 
神野健吾 <kengo@xxxxxxxxxxxx>
スレッド概略
[3659(R)](起点)
 └[表示中]
   └[3661(1)]


投稿順に移動
[←前の記事へ(P)]
[→次の記事へ(N)]


リスト表示へ
[このスレッド(T)]
[本記事の前後(L)]