初めて参加させていただきます。
今までは、秋月さん・イエローソフトさんのサンプルソフト、数冊の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/