記事一覧

シフトレジスタ(74HC164)その2

2009.07.15


シフトレジスタで遊んでみました。

program SHIFREG

dim i, j, k as byte
const pp=50

main:

TRISIO = %00000000
'OPTION_REG.NOT_GPPU = 0
WPU = %00000100
GPIO = %00000000

do
'CLEAR
GPIO.4 = 0
for i = 0 to 8
GPIO.2 = 1
GPIO.2 = 0
delay_ms(pp)
next i
delay_ms(pp*2)

'LEFT > RIGHT
GPIO.4 = 1
for i = 0 to 8
GPIO.2 = 1
GPIO.4 = 0
GPIO.2 = 0
delay_ms(pp)
next i
delay_ms(pp*2)

'RIGHT > LEFT
for j = 0 to 8
GPIO.4 = 1
for i = j to 8
GPIO.2 = 1
GPIO.4 = 0
GPIO.2 = 0
next i
delay_ms(pp)
for i= 8-j to 8
GPIO.2 = 1
GPIO.2 = 0
next i
next j
delay_ms(pp*2)
delay_ms(pp*2)

'LEFT > RIGHT FILL
GPIO.4 = 1
for i = 0 to 7
GPIO.2 = 1
GPIO.2 = 0
delay_ms(pp)
next i
delay_ms(pp*2)
'ERASE
GPIO.4 = 0
for i = 0 to 7
GPIO.2 = 1
GPIO.2 = 0
delay_ms(pp)
next i
delay_ms(pp*2)

'LEFT > RIGHT FILL
for k = 0 to 8
for j = 0 to k
GPIO.4 = 1
GPIO.2 = 1
GPIO.2 = 0
next j
GPIO.4 = 0
for i = j to 7
GPIO.2 = 1
GPIO.2 = 0
next i
delay_ms(pp)
next k
delay_ms(pp*2)

'LEFT > RIGHT ERASE
for k = 0 to 7
for j = 0 to 7 - k
GPIO.4 = 1
GPIO.2 = 1
GPIO.2 = 0
next j
delay_ms(pp)
GPIO.4 = 0
for i = 0 to 7
GPIO.2 = 1
GPIO.2 = 0
next i
next k
delay_ms(pp*2)

'FLASH
for k = 0 to 7
for j = 0 to 7
GPIO.4 = 1
GPIO.2 = 1
GPIO.2 = 0
next j
delay_ms(pp*2)
for i = 0 to 7
GPIO.4 = 0
GPIO.2 = 1
GPIO.2 = 0
next i
delay_ms(pp*2)
next k
delay_ms(pp*2)
loop until 0 = 1
end.


Mikrobasicにてプログラミング。この手の実験的な軽い開発には便利なツールですね。
難しかったのは、右から左への点灯です。
シフトレジスタは左から右への一方向へのシフトしかできないので、反対方向に流すにはコツがいります。

タグ:74HC164 12F629 LED ロジックIC

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

2009.07.13


今回はプラスチックの名刺ケースに収めてみました。
スモークがかってるのでLEDのコントラストも上がり見やすいです。


基板裏の様子。半田付けに6時間掛かりました・・・

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

ドットマトリックス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 ドットマトリックス

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

2009.07.11

とりあえずソースを公開します
こちらから、ダウンロードしてください

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

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

2009.07.10

今回は秋月の「赤色LEDドットマトリクス(8×8)38x38mm(1個100円)」を使用して、電光掲示板風、流れるデジタル時計を作成してみました。

ファイル 8-1.png
回路図はこのようになっております。
まず、マイコンは前回同様16F648A、表示器に8X8のLED、ダイナミック点灯をドライブするのに今回は74HC138というデコーダIC(マルツパーツ館にて1個84円で購入)を使ってみました。
ちなみにマルツパーツ館にて会員登録をするとパーツ類のデータシートが自由に閲覧できるのでオススメです。
74HC138は3本の入力に対して8本の出力のうちの一つの出力を制御することができます。
8X8LEDはアノードとカソードが各8本で計16本の入出力ピンが必要なのですが、カソード側の8本に74HC138の出力ピンを割り当てます。
PIC側ではアノードの8本と74HC138側の3本の計11本で、ドットマトリックスLEDの表示をすることが可能になるわけです。


とりあえずブレッドボード上に回路を組んだ状態です。
LEDはユニバーサル基板に半田付けし、リード線を引き出しました。
ソースの公開は次回。

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

ページ移動