神野です。
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>