PIC16F84電子遊戯(24)
最終更新日:2001年5月16日
マトリックス96(1ページ) (2ページ)へ

マトリックス96を作ろう
5月の連休に大阪の日本橋に買い物に行かれる方に多少の部品収集を頼んでおりました。なんとジャンクショップの「デジット」さんで、ドットマトリックスLEDを安価で入手出来ましたので、今回のマトリックス64をマトリックス96にバージョンアップしてしまいましょう。8*8では流れる表示が見にくい(?)と思いますので、8*12にして見易くなると思います。
まずは入手したLEDを見て下さい。
いかがでしょうか。多分パチンコに使われていたLEDモジュールだと思います。
これは8*6のドットマトリックスLEDを3個並べたものですので、それを分解して、そのうちの二つを使用します。
(8*6ドットマトリックスLED)
端子は14本出ており、次のような接続となっておりました。
インターネットで色々とメーカーを調べましたが、結局はわかりませんでした。
(ドットマトリックスLEDの端子接続、正面から見た配置です)
今回はこのドットマトリックスLEDを二つ使って8*12にしましょう。
その名も「マトリックス96」です。表示部は前回の64より小さくなっていますが、見やすいと思います。
では回路図を見て下さい。ソフト作成を重視しますので、ハードはさらりといきましょう。
(マトリックス96の回路図)
回路のポイントを説明します。
12列部分の駆動はPICだけではポートが不足しますので、HC154を接続して拡張しています。一応スイッチをひとつ付けました。表示切替などに使用する予定です。
回路は少しややこしいですが、結局はLEDを点灯させるだけですから、簡単です。
ではハード部分の写真を見て下さい。
いつものように穴開き基板をスペーサーで挟んだ構造としています。
今回も部品を効率良く配置しましょう。写真からもわかるように、空きスペースは全くありませんね。(毎回この基板に載せられるだけの部品を使うというところがセンスですね。なんのこっちゃ?)
マトリックス96の基本仕様
ハードが準備出来ましたので、この製作の基本仕様を考えましょう。
1)96個のLEDに動く図形・文字を表示します。(表示内容は順次考えましょう。)
2)SW1で表示内容を変更可能とします。
以上を基本的なマトリックス96の仕様としました。ソフト作成途中で都合が悪くなれば随時仕様修正することにします。
マトリックス96のポート割付
回路図に従ってマイコンのポートを割り付けましょう。
ポート名 入出力 機能
RA0 OUT 74HC154駆動(A)
RA1 OUT 74HC154駆動(B)
RA2 OUT 74HC154駆動(C)
RA3 OUT 74HC154駆動(D)
RA4 IN SW1
RB0 OUT LED駆動(0)
RB1 OUT LED駆動(1)
RB2 OUT LED駆動(2)
RB3 OUT LED駆動(3)
RB4 OUT LED駆動(4)
RB5 OUT LED駆動(5)
RB5 OUT LED駆動(6)
RB7 OUT LED駆動(7)
(マトリックス96のポート設定)
マトリックス96のポートの方向設定
ではソフト上でのポートの方向をレジスタに設定します。入力は「1」、出力は「0」です。
--- --- --- PA4 PA3 PA2 PA1 PA0
--- --- ---

1

0

0

0

0

(TRISA)
PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0

0

0

0

0

0

0

0

0

(TRISB)
マトリックス96のタイマー割り込みの設定
今回のタイマー割り込みはLEDの表示内容をチェンジするための基本クロックに使用します。今回は文字が流れていく効果を考えていますので、基本クロックをとりあえず0.1秒とします。1秒間に10ライン分表示を移動(流す)ことにします。そこでタイマー割り込みの基本となるプリスケーラ値を128分周にします。
発振子が4MHz時基本クロックは1usecなので、128usecごとにタイマーカウンタがアップします。その他の設定はテストボードの時と同じにします。(詳しくはテストボードのページを参照して下さい。)
ではレジスタにデータを設定しましょう。
RBPU INTEDG TOCS TOSE PSA PS2-0

1

0

0

0

0

1

1

0

(OPTION_REG)
さて0.1秒のタイマー割り込みを作る方法を考えましょう。まず128usecのタイマーカウントアップを使用して20msecごとにタイマー割り込みを掛けるようにします。
128usec x 156= 19.968msec
128usecを156カウントして約20msecにします。
次にこのタイマー割り込みを5回カウントして0.1秒にします。
19.968msec x 5 = 99.84msec
このタイミングで表示パターンを切り換えることにします。
次に定数を設定します。まず20msecの割り込みを掛けるためにタイマーカウンタに設定する初期値です。タイマー割り込みはタイマーカウンタがオーバーフローするごとに掛かります。従って初期値を255-156 = 99= 63HにすればOKです。
tm0_setdata
63H
(tm0_setdata)
次に0.1秒を刻むための初期値データです。05Hです。
cnt_setdata
05H
(cnt_setdata)
このタイマー割り込み処理で使用する作業RAMを設定します。
0.1秒のカウントのために、20mscの割り込みを何回カウントしたかのRAMが必要になります。これはcnt_setdataの初期値から減算してカウントします。ここのRAMが「0」になれば0.1秒経ったことになります。
count_data
0.1秒カウントまでの残り

(count_data)

マトリックス96のポート初期設定
マイコンが動作してからのポートの初期状態を設定します。
PORTAは74HC154を駆動するのでPORTA全体をLに設定します。
PORTBはLEDの点灯に使用するため、最初は消灯ということでHに設定します。
PORTA PORTB
00H 0FFH
(ポート初期設定)
マトリックス96のLED表示
LEDの表示は列ごとに専用のRAMを用意してそれを順次表示しています。
表示内容を変えたいときは、別のルーチンでそのRAMの内容を変えているだけです。
led_data0 1列目の表示データ
led_data1 2列目の表示データ
led_data2 3列目の表示データ
led_data3 4列目の表示データ
led_data4 5列目の表示データ
led_data5 6列目の表示データ
led_data6 7列目の表示データ
led_data7 8列目の表示データ
led_data8 9列目の表示データ
led_data9 10列目の表示データ
led_data10 11列目の表示データ
led_data11 12列目の表示データ
PORTAに[00]出力 Y0選択 PORTBに[led_data0]出力 時間待ち
PORTAに[01]出力 Y1選択 PORTBに[led_data1]出力 時間待ち
PORTAに[02]出力 Y2選択 PORTBに[led_data2]出力 時間待ち
PORTAに[03]出力 Y3選択 PORTBに[led_data3]出力 時間待ち
PORTAに[04]出力 Y4選択 PORTBに[led_data4]出力 時間待ち
PORTAに[05]出力 Y5選択 PORTBに[led_data5]出力 時間待ち
PORTAに[06]出力 Y6選択 PORTBに[led_data6]出力 時間待ち
PORTAに[07]出力 Y7選択 PORTBに[led_data7]出力 時間待ち
PORTAに[08]出力 Y8選択 PORTBに[led_data8]出力 時間待ち
PORTAに[09]出力 Y9選択 PORTBに[led_data9]出力 時間待ち
PORTAに[0A]出力 Y10選択 PORTBに[led_data10]出力 時間待ち
PORTAに[0B]出力 Y11選択 PORTBに[led_data11]出力 時間待ち
さて、今回はここまでです。
前回のマトリックス64より表示は小さくなりましたが、見やすなると思います。
また横に長くなったので、文字を流しても見栄えが良いと思います。
次回はいよいよLED表示に文字を流してみましょう。
今後も益々面白くなる「PIC16F84電子遊戯」をよろしくお願いいたします。

不明点などあればメールお願いいたします。nonchansoft@nifty.com