JJ1WKN Log

自作や移動運用関連のログです。

Sipeed Longan Nano のテスト その3

2019-12-05 | その他
その3です。

任意の漢字の表示ができるようにしました。

フリーの漢字フォントを探したところ、東雲フォントが見つかりました。
16ドットフォントもあり、LCDライブラリがそのまま使えそうです。
東雲フォントはBDF形式のビットマップフォントで下の例はJISコード=2121で、BITMAP以降の16行が16進数で表示したフォントデータです。
1行目が16x16ドットの一番上の1ドット行(0,0)-(15,0)に相当します。2行目は(0,1)-(15,1)。
LCDやプリンタ用のフォントデータは縦8ドットで1バイトの形式が多いのですが、汎用のフォントデータなので素直な並びです。

STARTCHAR 2121
ENCODING 8481
SWIDTH 960 0
DWIDTH 16 0
BBX 16 16 0 -2
BITMAP
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
0000
ENDCHAR

試しにLCDライブラリ中のoledfont.hの漢字の1文字を置き換えてみたところ、鏡文字で表示されたので、ビットの並びが左右逆なようです。
フォントデータのビット列を反転させてもいいのですが、LCD_ShowChines()の1<<iを128>>iに変更して逆にスキャンするようにしました。(><は小文字)

フォントファイルの形式が判明したので、bdf形式ファイルからJISコードの行とビットマップ部分を抜き出して、コメントと16進数での配列定義に変換してファルへ出力しました。
上の2121は下のようになります。

// STARTCHAR 2121
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

変換プログラムは勉強を兼ねてrubyで開発しました。

これで表示したい漢字のJISコードが分かればこのファイルを検索してコピペすればOKですが、単純作業となるので、SJISで記述された文字列からSJISコードに変換、さらにJISコードに変換してこのファイルを検索して必要な部分を抽出して出力するようにしました。
STARTCHAR、JISコード、SJISコード、SJIS文字の順です。
漢字コードが混在しているので、厄介でした。

// JJ1WKN
// STARTCHAR 234a 8269 J
0x00,0x00,0x00,0x70,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x08,0x20,0x04,0x40,0x03,0x80,0x00,0x00,0x00,0x00,
// STARTCHAR 234a 8269 J
0x00,0x00,0x00,0x70,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x08,0x20,0x04,0x40,0x03,0x80,0x00,0x00,0x00,0x00,
// STARTCHAR 2331 8250 1
0x00,0x00,0x00,0x80,0x00,0x80,0x01,0x80,0x02,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x01,0xc0,0x00,0x00,

検索したところ、外部ROMやSDカードに全部の漢字フォントを入れる例がありましたが、テキストビューワーを作る訳ではないので、電光掲示板や画面の一部ならソースに記述する方式で十分です。
LonganNanoにはSDカードが付いているのでそのうち試してみようと思います。

最後に「中景…」の代わりに「JJ1WKN」を表示させた例です。