1文字分(8×8=64ドット分)毎に画像を切り出して、横方向8ドットを1バイトにまとめて16進数表示で表示。それを縦8ライン分まとめて1文字分としています。1文字分は8バイトに相当するわけです。AVRのアセンブリ言語用に編集出力しているので、アセンブラソースから普通にincludeすれば使えます。一応、at-mega128用のテストプログラムでアセンブルしてみて大丈夫そうな結果を得ました。他のマイコンを使っている方は適宜手直しして使ってください。文字の左がMsb、右がLsbになってます。この8バイトが一組で出力ファイル上1行分に相当します。(7-dx))のところをちょっと変えれば左右逆向きにできます。インテルhex形式ファイルへの変換インテルのhex形式ファイルに変換してみることにします。容量の小さいマイコンでも外部に漢字ROMとして実装することも可能になります。64KBタイプ(512Kbitタイプ)以上のEEPROMが必要になります。マイコンに接続する表示装置に合わせて2つほど実装方法を考えてみました。それとも横に切り出すか...といった観点です。横を8ライン一組で1文字としておくと表示しやすいので、まずはこの並びにならってみます。左が1バイト目、右が8バイト目の並びです。hexhl実行すると以下のようにインテルhex形式に整形されたファイルが出力されます。1行あたりに8バイト分のデータ+アドレスやチェックサム等を収録しています。:080000000000000000000000F8:08000800204000000000000090:08001000205020000000000058(中略):08F6A80000000000000000005A:08F6B000000000000000000052:08F6B80000000000000000004A:00000001FF次に、同じhex形式でもビットの並びが横方向のタイプも作っておきます。さっきのアセンブラと違って左がLsb右がMsbになってます。hexhlどちらのhexファイルも、秋月PICライターなどでEEPROMに書き込みができます。書き換えれば左右の並びを逆にできます。C言語用の配列定義文に変換C言語の配列定義文に変換してみます。あとは各言語環境などに合わせて修飾子などを指定するなどで配置先を変えて使ってください。普通のマイコンであれば、登載している容量の関係からプログラムコードのエリアに展開させるのが常套手段でしょうか。その辺の指定は同じC言語でも環境によって若干異なるでしょうから、そこまでは盛り込みません。適宜環境に合わせて微調整してください。hexhlデータの並び順ですが、横8ドットを1バイトにして左がMsb右がLsbです。必要に応じて直して使ってください。実行結果はこんな感じ。{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};試しにAVR用のGCC(WIN-AVR)に取り込んでコンパイルしてみました。PROGMEMって指定をして「フラッシュ領域」に配置してみたところ、コンパイラ仕様に抵触してエラーとなりました。その制約事項はブログに纏めておいたのでそちらをご参照ください。要は、1個の配列で定義が可能なサイズをオーバーしたということです。回避方法の一案をブログに纏めてあります。以上、各スクリプトは使いまわしが簡単にできるので各種言語用に作り直すのは造作無いでしょう。適当に使いまわしてください。他の言語に移行した方がいいかもしれませんねぇ。実際に使ってみようBMP画像に収録されたフォントデータをHSPのスクリプトを使って各種プログラムのソースに変形するところまでやりました。次はこれらを使って実際にスクリーン表示してみたいと思います。作戦的なものある程度妥当性の確認ができればいいやというレベルで考えているので、可能な限り手抜きをします。SG12864Aならまさにビットマップ表示のためのデバイスなので、深く考えずにこれを使ってみます。このSG12864Aはマイコンと20ピンのインターフェースで接続し、マイコンからコマンドやビットマップデータを送信して使います。これを扱うにあたって注意が必要なのは、まず制御方法についてです。マイコンからSG12864Aに向かって各種コマンド等を送る必要がありますが、面倒くさいので手を抜くことを考えます。表示装置にはSG12864Aを使用して、手抜きでサクッと動作確認を済ますことにします。データ形式についてもう一つ注意するのは、SG12864Aに送信する時のビットマップデータの並びのことです。SG12864Aに限らず、ビデオRAMをアクセスする際にはそのビデオRAMがどの様なならびでデータを保持しているのかということが影響します。SG12864Aをarduino用ライブラリを使ってアクセスする際も、この点についてライブラリのi/f仕様が大きく影響を受けています。どの様な形式の引数を渡せばいいかというお話です。このメソッドの詳細はarduino公式サイトをご覧ください。このメソッドのビットマップに8×8ドットの漢字データをどのように与えればいいかというお話。uint8-t型というarduino独自の符号なし8ビット整数の配列(のポインタ)を引き渡すことになっています。その後ろにビットマップデータをズラズラと格納することになっています。その際のビットの並びですが、言葉だけで示すのは難しいのでまずはマンガを描いてみます。この図の見方について簡単な解説を。図の左上から縦に8ドットを一まとめにして1バイトのデータとします。次にその1行右隣に移って同じように縦8ドットを1バイトに纏めます。このように1文字分(=8ライン)を一まとめにして1バイト分8バイトのデータが出来上がります。いう8バイトのデータが出来上がるわけです。(お時間有る方は、この8バイトをビット列に戻して眺めてみてください)図を見ると、「亜」という字が左上に片寄っているかと思いますが、それが美咲フォントの肝となる部分です。文字と文字をぴったりくっつけても、文字同士がゴチャゴチャにならないっていうわけですね。複数文字を一度にたくさん表示するには、この8バイトのデータを必要なだけズラズラ並べればいいというわけです。その際、横幅と高さのドット数は配列の先頭に1個だけあればよく、その後ろは8バイトのビットマップデータがズラズラ並んでいるというわけ。実際に表示してみましょう文章で表しても解り難いと思いますので、arduino用のスケッチを実際に書いてみます。計64バイトだけを取り出したものです。このスケッチを実行してみると文字は縦一列にならんでこんな風になります。このスケッチをちょっと弄って横幅を64ドット、高さを8ドットと指定しなおしてみると、何の問題も無く横一列の漢字が表示されることになります。このように、8ドット単位ということで色々扱いがラクチンになるというのが美咲フォントを使うメリットの一つとして挙げられるかと思います。潰れ気味のフォントですが、文脈(コンテキスト)をヒントにすればそれなりに読み取ることは可能な範疇でしょう。もろもろの注意事項arduino+SG12864Aの場合のHSPスクリプトについてarduinoとSG12864Aを組み合わせて使った場合、ビットの並び、バイトの並びは、実は上記のHSPスクリプトでは対応してません。この組み合わせに似つかわしいHSPスクリプトも作ってみました。先ほどのarduino用スケッチ中の定義はこの実行結果を使ったモノです。{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};こんな感じになります。0x44,0x5C,0x37,0x2C,0x76,0x55,0x76,0x00};というわけでした。ちなみにこの配列は1行が漢字1文字に相当していて、8文字分のビットマップイメージを配列に収めているわけです。64と言うのはビットイメージ分の要素数です。8と64という数値を元にビットイメージを画面上に表示してくれます。扱いが簡単なのはさすがarduino。表示自体は上手くできることが判りました。arduinoといえば、AVR用のC言語系コンパイラであるgccがベースになっています。gccでは配列定義の際に言語仕様上の制限があり、使用の際に注意が必要です。収まっていなければならないという制約があります。バイト数、もしくはインデックスの数が15ビットの整数までしか扱えないことに起因します。構造体の中に、複数に分割した配列を格納するという手もアウトです。構造体全体のインデックス数はやはり32K個を超えてしまうことになるからです。記載してあるのでそちらをご参照ください。arduinoの場合は、JIS1、JIS2の漢字データを取り込むとなると、容量が足りないだけでなく、この制約にも抵触します。そのため今回のサンプルスケッチも漢字データの一部分しか取り込みませんでした。同じAVRでも、アセンブラやその他の言語となると話は別ですし、AVR以外のマイコンの場合はやはりこの制約とは無関係となります。マイコンによってはオンチップROMに全部登載することも可能でしょう。外付けのEEPROMに格納してI2Cで読み出すなどの工夫が必要となるかと思います。使う環境に合わせて多少のアレンジが必要になるかと思います。まとめHSPを使って美咲フォントのグラフィックデータから各種言語用のビットマップ定義のスクリプトを作成することができました。あとはこの出力されたスクリプトを各種言語用に読み込むなりすれば漢字の表示が比較的容易に出来るようになるかと思います。当初の目的は見えたのでこのページはひとまず完結にします。何かメモとして残しておきたいことが出来たらまた追記したいと思います。Design入門書WebIOPi・WiringPiでWebと電子回路を連動Arduino1.0対応です。お手にとって眺めて頂けるとうれしいです。