記事一覧

ドットマトリックスLED時計の製作③

2009.07.12

今回は、簡単にプログラムの内容を説明します。
まずは、プログラムの最後尾部分。
文字パターンの定義を今回はEEPROMに書き込んでいます。

__EEPROM_DATA(14,17,17,17,17,17,17,14);//0
__EEPROM_DATA(4,12,4,4,4,4,4,14);//1
__EEPROM_DATA(14,17,17,2,4,8,16,31);//2
__EEPROM_DATA(14,17,1,1,14,1,17,14);//3

7セグLEDは1桁のパターン定義は1バイトで済みましたが、今回は8x8ドット分の定義なので、1文字当たり8バイト必要になります。RAMだけでは足りなくなりそうなので、今回はEEPROMへ書き込んだということです。
このパターンを作成するのには、MikroBasic等に付属してくる「Custom LCD Character」というツールが使いやすいのですが、このツールで作成できるのは5x8ドット分までです。

ちなみに、8x8ドット分のソースは、

__EEPROM_DATA(228, 191, 164, 255, 162, 191, 226, 10); //時 (24)
__EEPROM_DATA(24, 36, 66, 129, 126, 18, 18, 38); //分 (25)
__EEPROM_DATA(224, 64, 64, 229, 2, 229, 32, 224); //エコoff(26)
__EEPROM_DATA(224, 64, 70, 233, 9, 230, 32, 224); //エコon (27)
__EEPROM_DATA(4, 136, 240, 167, 32, 72, 18, 62); //Game (28)

となっています。
このパターンを読み込んでいるのが、make_dot_patarn()関数になります。

void make_dot_patarn() {// ドットパターン作成
unsigned short r;

make_dot_doing = 1;// 割込み禁止フラグ
if (disp_ch == disp_len)// 1.2バイト目のINDEX
disp_next = 0;
else
disp_next = disp_ch + 1;
for (r = 0; r < MAX_ROW; r++) {
ee_adr = dgt[disp_ch] * EEP_BLOCK + r;// 1文字目r行目のアドレス
ee_dat = eeprom_read(ee_adr);// EEPROMから読む
ee_dat = (ee_dat << chr_sft);// 左に詰める
dat_up = (ee_dat << disp_bt);// スクロール分シフト
if (disp_len > 0) {// 2文字目あり
ee_adr = dgt[disp_next] * EEP_BLOCK + r;
ee_dat = eeprom_read(ee_adr);
ee_dat = (ee_dat << chr_sft);
dat_dn = ee_dat >> (chr_width - disp_bt);
} else {
dat_dn = 0;
}
rom_dat[r] = (unsigned char) dat_up | dat_dn;// 合成
}


スクロールする場合、2文字分のパターンを読みこんでいます。
ee_dat = eeprom_read(ee_adr);
まず、上位1文字目を変数に入れ、
ee_dat = (ee_dat << chr_sft);
空白分を左へシフト。(5x8パターンの場合、4ドット分シフトした状態で左詰となる)
dat_up = (ee_dat << disp_bt);
最後に、文字全体のスクロールとしてさらに左シフトします。

タグ:PIC 16F648A ドットマトリックス