[H8-ML(3659)] H8でグラフィック液晶表示で困っています。
From: hiikosan_y_man@xxxxxxxxxxx
Date: 2003年08月02日(土)21時31分57秒
初めて参加させていただきます。

今までは、秋月さん・イエローソフトさんのサンプルソフト、数冊のC言語
の書籍で、何とかしのいでいました。

今困っているのは、グラフィック液晶に2バイト文字を表示するところです。
実は、今現在表示はしています。日本語・英語・韓国語を表示するように
なっています。今回、OEM出荷で、今後最低6ヶ国語に対応しなければ
ならなくなったため、システムの組み直しをしています。

元は、イエローソフトさんのH8-2644学習キットのものを参照致しました。

const unsigned char __0000[] = {    /* 吉 */
    0x08,0x88,0x88,0x88,0x88,0x88,0x88,0xFF,
    0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x08,
    0x00,0x00,0x00,0xFC,0x84,0x84,0x84,0x84,
    0x84,0x84,0x84,0x84,0xFC,0x00,0x00,0x00,
};

const unsigned char __0001[] = {    /* 村 */
    0x08,0x08,0xC8,0xFF,0x48,0x88,0x00,0x08,
    0x88,0x88,0x08,0x08,0x08,0xFF,0x08,0x08,
    0x08,0x06,0x01,0xFF,0x00,0x00,0x01,0x00,
    0x00,0x01,0x03,0x80,0x80,0xFF,0x00,0x00,
};

void    main(void)
{
    // LCDの初期化表示クリア
    lcd_wr_16(__0000, 0, 0);        // 吉
    lcd_wr_16(__0001, 0, 16);       // 村
}
と、一文字ずつ文字データを参照しなければなりませんでしたので、

少々改良して、文字コードをJISコードに対応させ、ヘッダー化しました。

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

main()
{
    if (lang == 0 || lang == 2)     // 0:韓国語 1:英語 2:日本語
    {
        if (lang == 0)
        {
            klcd_dt[0] = 0xb8e9;                        // ハングル "面"
            klcd_dt[1] = 0xc0fb;                        // ハングル "積"
        }
        else
        {
            klcd_dt[0] = 0x4c4c;                        // "面"
            klcd_dt[1] = 0x4051;                        // "積"
        }
        klcd_dt[2] = '\0';
        khyo_910(0, 0);
    }
}

// ---  9*10の文字のアドレスを求める
unsigned char *get910adr(int dat)
{
    switch(dat)
    {
        case 0x4051: return __4051;             // "積"
        case 0x4c4c: return __4c4c;             // "面"
        case 0xb8e9: return __b8e9;             // ハングル "ミョン" 面
        case 0xc0fb: return __c0fb;             // ハングル "ジョク" 積
        default: return __2120;                 // 9*10blank
    }
}

// --- 9*10文字列を表示する ---
void    khyo_910(unsigned char xa,
                 unsigned char ya)
{
    unsigned int i;

    x_hyo816 = 0;
    x = xa;                                     // Xアドレス
    y = ya;
    i = 0;
    while(klcd_dt[x_hyo816])
    {
        klcd_16dt(get910adr(klcd_dt[x_hyo816]), x, y + ((i++) * 10));
            // klcd_16dtで、表示する
        x_hyo816++;
    }
}

今回の改良で、表示する文字列をヘッダー化し、構造体にしてみました。
文字データは、変更無しです。

ヘッダーファイル:
#define gengo_num 3         // 最大言語数

// --- 構造体宣言
struct HYJ_DT001
{
    unsigned int code[5];
};

// --- "面積" 表示データ
struct HYJ_DT001 const menseki[gengo_num] = 
{
    {0x4c4c, 0x4051, '\0', '\0', '\0'},                 // 日本語(面積)
    {0x0041, 0x0052, 0x0045, 0x0041, '\0'},             // AREA
    {0xb8e9, 0xc0fb, '\0', '\0', '\0'}                  // ハングル
};      // ここまで、ヘッダーファイル

// --- 面積表示
void    main()
{
    dt_adrs = &(menseki[lang].code[0]);
    read_dt();
    while(1)
        klcd_16dt(get910adr(klcd_dt[x_hyo816])・・・);
}

// --- データ呼出
void    read_dt()
{
    comm_lp = 0;
    while(1)
    {
        klcd_dt[comm_lp] = *dt_adrs;
        if (klcd_dt[comm_lp] == '\0')
            break;
        comm_lp++;
        dt_adrs++;
    }
}

とここまで書いて、このまま、get910adrを使うのはいやだなと思って
しまったんです。できれば、switch-caseを使用したくないなと・・・
switch-caseだと、1文字増えればその分 case : return を用意しなくちゃ
いけませんから・・・ 考えとしては、klcd_dt[]に入力された文字コードを
文字列化して、その前に、__をくっつけて、文字データを呼び出せばいいかな
と思っているのですが、int変数を16進表示で、文字列化するような
プログラムはないでしょうか。いやむしろ、2バイト文字の文字列を簡単に、
表示する方法はないのでしょうか。(勝手すぎるかな) 今のCコンパイラだと、
2バイト文字が扱えないので、四苦八苦しています。

現在は、H8-3069F を HEW(Ver1.0A r7)で作成しています。

ちなみにLCDは、秋月さん等で、販売しているSC1602とほぼ同じ外形で、
電源・バス・コントロール(E R/W RS)は、ピンコンパチで、RES CS1 CS2が、
バックライト用端子側に付いているカスタムのLCDです。5V単一電源です。
140×30ドットと中途半端な表示範囲ですが、有償でよければ、多少は、
お譲りしてもいいです。
あっ、今月末まで在庫か無い。来月以降で良ければ・・・
あと、取り説有りません。

長々となってしまいましたが、何かいい方法がございましたら、お教え下さい。

Hiikosan
Mail : hiikosan_y_man@xxxxxxxxxxx or mtp-miya@xxxxxxxxxx
Campany URL http://www5e.biglobe.ne.jp/~mtp-miya/

__________________________________________________
Do You Yahoo!?
Yahoo! BB is Broadband by Yahoo!
http://bb.yahoo.co.jp/

スレッド概略
[表示中](起点)
 └[3660(1)]


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


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