秋月H8-3069ネット対応マイコンで32x16ドットLEDマトリクス、ASCIIフォント情報抽出

「秋月H8-3069ネット対応マイコンで32x16ドットLEDマトリクスに東雲フォントを表示」前編後編
東雲フォントの表示を行なった。このときは、表示文字列のビットマップ情報を毎回生成していた。
今回、ASCII コード領域のフォントに関して、表示文字列によらず同一フォント情報を利用できるように、
ビットマップ情報を抽出した。

動作環境

  • 秋月 H8-3069 ネット対応マイコン エコノミーLANボードキット
  • 秋月「32x16ドットLEDマトリクス表示装置パーツセット」
  • 自作 接続ボード
  • USB to シリアルケーブル(秋月で売られていた USB-シリアル変換器)
  • 秋月のUSB-シリアル変換器に付属していたシリアル延長ケーブル
  • キットに付属していた 5V のACアダプター
  • ACアダプター 5V 800mA
  • ミノムシクリップ
  • Vine 3.2
  • ruby
  • 東雲フォント


ASCII フォント抽出用 ruby スクリプト


0x20 の「スペース」から 0x7e の「~」までのビットマップ情報を抽出する ruby スクリプトを書いた。

#!/usr/bin/env ruby

FONT_FILE = 'shinonome-0.9.11-src/16/latin1/font_src.bit'

def read_font(file)
ret = {}
mode = :START
code = nil
bitmap = []

File.foreach(file) do |line|
if /ENCODING\s+(\d+)/ =~ line
code = $1.to_i
if code >= 0x20 || code <= 0x7e
mode = :IN
end
elsif mode == :IN && /BITMAP/ =~ line
mode = :BITMAP
bitmap = []
elsif mode == :BITMAP && /ENDCHAR/ =~ line
mode = :START
ary = []
bitmap.transpose.each do |x|
ary.push sprintf("0x%04x", x.join.to_i(2))
end
ret[code] = ary
elsif mode == :BITMAP
bitmap.push line.chomp.split(//).map {|x| x == "." ? 0 : 1 }
end
end

return ret
end

def bitmap_ary(font_info)
ret = []

0x20.upto(0x7e) do |code|
ret.concat font_info[code]
end

return ret
end

def output_bitmap(ascii_bitmap)
print "\n#define ARY_SIZE #{ascii_bitmap.size}\n\n"
print "unsigned short ascii[] = {\n"

ascii_bitmap.each do |x|
print " #{x},\n"
end

print "};\n"
end


font_info = read_font(FONT_FILE)
bitmap_ary = bitmap_ary(font_info)
output_bitmap(bitmap_ary)

以下のように実行し、ASCII フォント情報を生成した。
$ ./led04_mk_ascii_bitmap.rb > led04_ascii_font.h

生成されたASCII フォント情報(led04_ascii_font.h)

#define ARY_SIZE 760

unsigned short ascii[] = {
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x7fe6,
0x7800,
0x0000,
0x0000,
0x0000,
0x0000,
0x9000,
0xe000,
0x0000,
0x9000,
0xe000,
0x0000,
0x0000,
0x0020,
0x083e,
0x0fe0,
0x7820,
0x083e,
0x0fe0,
0x7820,
0x0800,
0x1c30,
0x2208,
0x4104,
0xffff,
0x4104,
0x2088,
0x1870,
0x0000,
0x3c03,
0x420c,
0x4230,
0x3cc0,
0x033c,
0x0c42,
0x3042,
0xc03c,
0x0070,
0x3888,
0x4504,
0x4304,
0x44c8,
0x3830,
0x00c8,
0x0004,
0x0000,
0x9000,
0xe000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x07f0,
0x180c,
0x2002,
0x4001,
0x0000,
0x0000,
0x4001,
0x2002,
0x180c,
0x07f0,
0x0000,
0x0000,
0x0000,
0x0440,
0x0280,
0x0100,
0x0fe0,
0x0100,
0x0280,
0x0440,
0x0000,
0x0100,
0x0100,
0x0100,
0x1ff0,
0x0100,
0x0100,
0x0100,
0x0000,
0x0000,
0x0009,
0x000e,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0100,
0x0100,
0x0100,
0x0100,
0x0100,
0x0100,
0x0100,
0x0000,
0x0000,
0x000c,
0x000c,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0006,
0x0018,
0x0060,
0x0180,
0x0600,
0x1800,
0x6000,
0x0000,
0x0000,
0x0fe0,
0x3018,
0x4004,
0x4004,
0x3018,
0x0fe0,
0x0000,
0x0000,
0x0800,
0x1000,
0x7ffc,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x181c,
0x2064,
0x4084,
0x4104,
0x2204,
0x1c04,
0x0000,
0x1830,
0x2008,
0x4104,
0x4104,
0x4104,
0x2288,
0x1c70,
0x0000,
0x00c0,
0x0340,
0x0c40,
0x3040,
0x7ffc,
0x0040,
0x0040,
0x0000,
0x0730,
0x7a08,
0x4404,
0x4404,
0x4404,
0x4208,
0x01f0,
0x0000,
0x0ff0,
0x3108,
0x4204,
0x4204,
0x4204,
0x2108,
0x00f0,
0x0000,
0x4000,
0x4000,
0x4000,
0x407e,
0x4780,
0x5800,
0x6000,
0x0000,
0x1c70,
0x2288,
0x4104,
0x4104,
0x4104,
0x2288,
0x1c70,
0x0000,
0x1e10,
0x2108,
0x4084,
0x4084,
0x4084,
0x2108,
0x1ff0,
0x0000,
0x0000,
0x0000,
0x0000,
0x0c18,
0x0c18,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0c24,
0x0c38,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0180,
0x0240,
0x0420,
0x0810,
0x1008,
0x0000,
0x0440,
0x0440,
0x0440,
0x0440,
0x0440,
0x0440,
0x0440,
0x0000,
0x0000,
0x1008,
0x0810,
0x0420,
0x0240,
0x0180,
0x0000,
0x0000,
0x1c00,
0x2000,
0x4000,
0x4066,
0x4180,
0x2200,
0x1c00,
0x0000,
0x07c0,
0x1830,
0x2788,
0x4c44,
0x4844,
0x2784,
0x1848,
0x0780,
0x003c,
0x03c0,
0x1c40,
0x6040,
0x1c40,
0x03c0,
0x003c,
0x0000,
0x7ffc,
0x4104,
0x4104,
0x4104,
0x2304,
0x1c88,
0x0070,
0x0000,
0x0fe0,
0x3018,
0x4004,
0x4004,
0x4004,
0x2008,
0x1010,
0x0000,
0x7ffc,
0x4004,
0x4004,
0x4004,
0x2008,
0x1830,
0x07c0,
0x0000,
0x7ffc,
0x4104,
0x4104,
0x4104,
0x4104,
0x4104,
0x4004,
0x0000,
0x7ffc,
0x4100,
0x4100,
0x4100,
0x4100,
0x4100,
0x4000,
0x0000,
0x07e0,
0x1818,
0x2008,
0x4004,
0x4104,
0x2108,
0x11fc,
0x0000,
0x7ffc,
0x0100,
0x0100,
0x0100,
0x0100,
0x0100,
0x7ffc,
0x0000,
0x0000,
0x0000,
0x4004,
0x7ffc,
0x4004,
0x0000,
0x0000,
0x0000,
0x0000,
0x0010,
0x0008,
0x0004,
0x0004,
0x0008,
0x7ff0,
0x0000,
0x0000,
0x7ffc,
0x0180,
0x0200,
0x0700,
0x18c0,
0x6030,
0x000c,
0x0000,
0x7ffc,
0x0004,
0x0004,
0x0004,
0x0004,
0x0004,
0x0000,
0x7ffc,
0x1c00,
0x0380,
0x0078,
0x0380,
0x1c00,
0x7ffc,
0x0000,
0x7ffc,
0x3000,
0x0c00,
0x0380,
0x0060,
0x0018,
0x7ffc,
0x0000,
0x0fe0,
0x3018,
0x4004,
0x4004,
0x4004,
0x3018,
0x0fe0,
0x0000,
0x7ffc,
0x4100,
0x4100,
0x4100,
0x4100,
0x2200,
0x1c00,
0x0000,
0x0fe0,
0x3018,
0x4024,
0x4024,
0x4026,
0x3019,
0x0fe1,
0x0000,
0x7ffc,
0x4100,
0x4100,
0x4100,
0x4180,
0x2270,
0x1c0c,
0x0000,
0x1c30,
0x2208,
0x4204,
0x4104,
0x4104,
0x2088,
0x1870,
0x0000,
0x4000,
0x4000,
0x4000,
0x7ffc,
0x4000,
0x4000,
0x4000,
0x0000,
0x7ff0,
0x0008,
0x0004,
0x0004,
0x0004,
0x0008,
0x7ff0,
0x0000,
0x7800,
0x0700,
0x00e0,
0x001c,
0x00e0,
0x0700,
0x7800,
0x0000,
0x7f80,
0x007c,
0x01c0,
0x7e00,
0x01c0,
0x007c,
0x7f80,
0x0000,
0x400c,
0x3030,
0x0dc0,
0x0200,
0x0dc0,
0x3030,
0x400c,
0x0000,
0x6000,
0x1c00,
0x0300,
0x00fc,
0x0300,
0x1c00,
0x6000,
0x0000,
0x400c,
0x4034,
0x40c4,
0x4304,
0x4c04,
0x7004,
0x4004,
0x0000,
0x0000,
0x0000,
0x0000,
0xffff,
0x8001,
0x8001,
0x8001,
0x0000,
0x6000,
0x1800,
0x0600,
0x0180,
0x0060,
0x0018,
0x0006,
0x0000,
0x8001,
0x8001,
0x8001,
0xffff,
0x0000,
0x0000,
0x0000,
0x0000,
0x1000,
0x2000,
0x4000,
0x8000,
0x4000,
0x2000,
0x1000,
0x0000,
0x0002,
0x0002,
0x0002,
0x0002,
0x0002,
0x0002,
0x0002,
0x0000,
0x0000,
0x0000,
0xe000,
0x9000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0038,
0x0244,
0x0484,
0x0484,
0x0484,
0x0488,
0x03fc,
0x0000,
0x7ffc,
0x0208,
0x0404,
0x0404,
0x0404,
0x0208,
0x01f0,
0x0000,
0x01f0,
0x0208,
0x0404,
0x0404,
0x0404,
0x0208,
0x0110,
0x0000,
0x01f0,
0x0208,
0x0404,
0x0404,
0x0404,
0x0208,
0x7ffc,
0x0000,
0x01f0,
0x0248,
0x0444,
0x0444,
0x0444,
0x0248,
0x01d0,
0x0000,
0x0000,
0x0400,
0x0400,
0x3ffc,
0x4400,
0x4400,
0x0000,
0x0000,
0x000e,
0x03b1,
0x0451,
0x0451,
0x0451,
0x0389,
0x0406,
0x0400,
0x0000,
0x7ffc,
0x0200,
0x0400,
0x0400,
0x0400,
0x03fc,
0x0000,
0x0000,
0x0000,
0x0400,
0x67fc,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x0001,
0x0001,
0x0402,
0x67fc,
0x0000,
0x0000,
0x0000,
0x0000,
0x7ffc,
0x0040,
0x0080,
0x0140,
0x0230,
0x040c,
0x0000,
0x0000,
0x0000,
0x4000,
0x7ffc,
0x0000,
0x0000,
0x0000,
0x0000,
0x07fc,
0x0400,
0x0400,
0x03fc,
0x0400,
0x0400,
0x03fc,
0x0000,
0x0000,
0x07fc,
0x0200,
0x0400,
0x0400,
0x0400,
0x03fc,
0x0000,
0x01f0,
0x0208,
0x0404,
0x0404,
0x0404,
0x0208,
0x01f0,
0x0000,
0x07ff,
0x0210,
0x0408,
0x0408,
0x0408,
0x0210,
0x01e0,
0x0000,
0x01e0,
0x0210,
0x0408,
0x0408,
0x0408,
0x0210,
0x07ff,
0x0000,
0x0000,
0x0000,
0x07fc,
0x0200,
0x0400,
0x0400,
0x0000,
0x0000,
0x0000,
0x0388,
0x0484,
0x0444,
0x0444,
0x0424,
0x0238,
0x0000,
0x0000,
0x0400,
0x0400,
0x3ff8,
0x0404,
0x0404,
0x0000,
0x0000,
0x0000,
0x07f8,
0x0004,
0x0004,
0x0004,
0x0008,
0x07fc,
0x0000,
0x0700,
0x00c0,
0x0030,
0x000c,
0x0030,
0x00c0,
0x0700,
0x0000,
0x07e0,
0x001c,
0x0060,
0x0780,
0x0060,
0x001c,
0x07e0,
0x0000,
0x0404,
0x0208,
0x01b0,
0x0040,
0x01b0,
0x0208,
0x0404,
0x0000,
0x0601,
0x0181,
0x0062,
0x001c,
0x0070,
0x0180,
0x0600,
0x0000,
0x0004,
0x040c,
0x0414,
0x0464,
0x0584,
0x0604,
0x0404,
0x0000,
0x0000,
0x0000,
0x0000,
0x0100,
0x7efe,
0x8001,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0xffff,
0x0000,
0x0000,
0x0000,
0x0000,
0x0000,
0x8001,
0x7efe,
0x0100,
0x0000,
0x0000,
0x0000,
0x0000,
0x0800,
0x1000,
0x1000,
0x0800,
0x0400,
0x0400,
0x0800,
0x0000,
};

動作確認用プログラム


全文字をスクロール表示するプログラムを書き、動作確認をした。

#include <h8/reg3067.h>
#include <h8/syscall.h>
#include "led04_ascii_font.h"

#define TIMER_NUM 128

#define CLOCK (1<<3)
#define LATCH (1<<4)

int x = 0;

void inc_x(void)
{
x++;

if (x >= ARY_SIZE) {
x = 0;
}
}

void led_out(int sin1, int sin2, int sin3)
{
int out;

out = LATCH; /* LATCH 1 */
out |= (sin1 == 1) ? 1 : 0;
out |= (sin2 == 1) ? 1 << 1 : 0;
out |= (sin3 == 1) ? 1 << 2 : 0;
P4DR = out;

out |= CLOCK;
P4DR = out;
}

void led_out_ary(unsigned short ascii[])
{
int x1, x2, sin1_i, sin23;

while (1) {
for (sin1_i = 15; sin1_i >= 0; sin1_i--) {
for (sin23 = 15; sin23 >= 0; sin23--) {
x1 = x + sin23; x1 = (x1 >= ARY_SIZE) ? x1 - ARY_SIZE : x1;
x2 = x + sin23 + 16; x2 = (x2 >= ARY_SIZE) ? x2 - ARY_SIZE : x2;
led_out((sin1_i == sin23) ? 1 : 0,
(ascii[x1] >> sin1_i) & 0x1,
(ascii[x2] >> sin1_i) & 0x1);
}
P4DR = CLOCK; /* LATCH 0 */
}
}
}

int main(void) {
P4DDR = 0xff;
timer1_regist(inc_x, TIMER_NUM);

led_out_ary(ascii);

return 0;
}

実行すると、0x20 の「スペース」から 0x7e の「~」までがスクロール表示される

画像


まとめ


  • 秋月H8-3069ネット対応マイコンに接続した32x16ドットLEDマトリクス用にASCII コード領域のフォントのビットマップ情報を抽出した。

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント

この記事へのトラックバック

  • プラダ バッグ

    Excerpt: 秋月H8-3069ネット対応マイコンで32x16ドットLEDマトリクス、ASCIIフォント情報抽出 のりつぐのメモ/ウェブリブログ Weblog: プラダ バッグ racked: 2013-07-07 00:33