PIC16F84電子遊戯(21)
最終更新日:2001年4月22日
マトリックス64(1ページ) (2ページ)へ (3ページ)へ

マトリックス64を作ろう
今回はマイコンを使った製作の定番(?)のLED表示装置を作ります。
その名も「マトリックス64」です。8*8のLEDを合計64個並べて、自由に動く図形や文字を表示したいと思います。
まずは回路図を見て下さい。ソフト作成を重視しますので、ハードはさらりといきましょう。
(マトリックス64の回路図)
回路のポイントを説明します。LEDは8個づつ8列の表示を行います。
8列部分の駆動はPICだけではポートが不足しますので、HC138を接続して拡張しています。一応スイッチをひとつ付けました。表示切替などに使用する予定です。
回路は少しややこしいですが、結局はLEDを点灯させるだけですから、簡単です。
ではハード部分の写真を見て下さい。
いつものように穴開き基板をスペーサーで挟んだ構造としています。
今回はLEDを64個並べていますので、面積的にきついです。部品は最適な位置に効率良く配置しましょう。写真からもわかるように、空きスペースは全くありませんね。
マトリックス64の基本仕様
ハードが準備出来ましたので、この製作の基本仕様を考えましょう。
1)64個のLEDに動く図形・文字を表示します。(表示内容は順次考えましょう。)
2)SW1で表示内容を変更可能とします。
以上基本的なマトリックス64の仕様としました。ソフト作成途中で都合が悪くなれば随時仕様修正することにします。
マトリックス64のポート割付
回路図に従ってマイコンのポートを割り付けましょう。
ポート名 入出力 機能
RA0 OUT 74HC138駆動(A)
RA1 OUT 74HC138駆動(B)
RA2 OUT 74HC138駆動(C)
RA3 IN SW1
RA4 OUT N.C.
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)
(マトリックス64のポート設定)
マトリックス64のポートの方向設定
ではソフト上でのポートの方向をレジスタに設定します。入力は「1」、出力は「0」です。
--- --- --- PA4 PA3 PA2 PA1 PA0
--- --- ---

0

1

0

0

0

(TRISA)
PB7 PB6 PB5 PB4 PB3 PB2 PB1 PB0

0

0

0

0

0

0

0

0

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

1

0

0

0

0

1

1

0

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

(count_data)

マトリックス64のポート初期設定
マイコンが動作してからのポートの初期状態を設定します。
PORTAは74HC138を駆動するのでPORTA全体をLに設定します。
PORTBはLEDの点灯に使用するため、最初は消灯ということでHに設定します。
PORTA PORTB
00H 0FFH
(ポート初期設定)
マトリックス64の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列目の表示データ
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]出力 時間待ち
さて、今回はここまでとしておきましょう。
次回はLED表示にテスト文字を表示させるソフトを作って、回路の確認をすることにしましょう。今後も益々面白くなる「PIC16F84電子遊戯」をよろしくお願いいたします。
 

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