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

マトリックス64の電光掲示板
前回はただ単に英文字を表示しただけですが、今回は意志を入れて、電光掲示板なるものにしてみましょう。
といっても文字は流れません。一文字づつ表示します。応用としては車の後部座席からテールに向かって表示させれば、後ろの車にうけること間違いなし(?)です。
ということで、今回は次の文字を表示させてみました。
(表示文字サンプル)
一応SWの操作で4種類の表示を切り換えることにします。
サンプルの表示文字は適当に決めていますので、皆さんで自由に改造して下さい。
上図のように文字数は任意ですので、皆さんの好きな文字を表示させましょう。
といっても長すぎるのも考えものです。(その辺はわきまえてください。長すぎると誤動作します。何文字で誤動作するかはわかりますね。)
原理は前回と同じです。表示したい文字のデータを順次表示エリアに送り込んでいるだけです。その送り込む文字のデータを順次文字列のデータから読み出しているだけです。
count_sub count_sub2
文字ポインタ 文字列ポインタ
今回はポインタを二つ使います。ひとつは文字ポインタ(count_sub)で実際に表示する文字のデータを選ぶためのものです。もうひとつは文字列ポインタ(count_sub2)で、順次表示したい文字列から一文字を取り出すためのポインタです。
前回は文字ポインタ(count_sub)をインクリメントしながら表示していましたが、今回はその文字ポインタに意志のある文字を順次入れながら表示します。
マトリックス64の文字列からの読み出し
文字列からの読み出しは前回の文字データ読み出しと同様の方法で行います。
ソースを見ていただければ、簡単ですね。
文字列からの読み出し
moji_set0		movwf	taihi
		movlw	low(moji0)
		addwf	taihi,1
		movlw	high(moji0)
		movwf	PCLATH
		addcf	PCLATH,1
		movf	taihi,0
		movwf	PCL
moji0		retlw	moji_I
		retlw	moji_love
		retlw	moji_Y
		retlw	moji_O
		retlw	moji_U
		retlw	moji_mk
		retlw	moji_sp
		retlw	00h
このルーチンに来る前に予め文字列ポインタ(count_sub2)の値をWレジスタに入れておきます。その内容に従って1文字づつ読み出します。
文字列の一番最後をエンドマーク(00h)にすることによって、文字列の最後を認識させます。つまりエンドマークが出るまで順次表示すれば良いので、文字列長さを気にする必要が無いのです。(これにより皆さんの自由な表現が可能になります。)
マトリックス64の文字列の切り換え
今回は4種類の文字列をSW1で切り換えます。切り換えのRAMを用意しますが、いつもの恒例としてPICが判断しやすいようにビット単位の判断で使用します。
moji_mode
7 6 5 4 3 2 1 0
-- -- -- -- 文字列(4)選択 文字列(3)選択 文字列(2)選択 文字列(1)選択
SW1の切り換え操作
sw1_key			btfsc	PORTA,3
		goto	next_key
		call	wait_1
		btfsc	PORTA,3
		goto	next_key
					;sw1 on
		call	moji_shift
		call	count_init
		movf	count_sub2,0
		call	moji_set
		movwf	count_sub
		
sw1_end		btfss	PORTA,3
		goto	sw1_end
next_key
1)SW1の入力ポートが「0」でないときは次の処理へ飛びます。
2)「0」のときは一定時間待ちます。(チャタリング防止のため)
3)再びSW1の入力ポートを調べて「0」でないときは次の処理へ飛びます。
4)文字列を切り換える処理(moji_shift)をします。
5)文字列ポインタを初期化処理(count_init)します。
6)文字列ポインタから読み出される文字を文字ポインタにセットします。
7)SW1が離されるまで待ちます。
上記のようにSW1を押したら文字列を切り換える処理をします。
文字列を切り換える処理の内容は次の通りです。
moji_shift	btfss	moji_mode,3
		goto	moji_shift2
		movlw	01h
		movwf	moji_mode
		return
moji_shift2	rlf	moji_mode,1
		bcf	moji_mode,0
		return		
ソースを見ればわかると思いますが、moji_modeの中に立っているビットを左にシフトしているだけです。4種類しか切り換えないので、3bit目が「1」のときは0bit目に戻します。
マトリックス64の文字列エンドマークの判定処理
文字列の最後を認識させるために、エンドマークとして00hを指定していますが、この「00h」の判定がなかなか曲者ですので少し説明します。
文字列ポインタを進めて表示文字をセットする処理
		incf	count_sub2,1	

int_next3		movf	count_sub2,0
		call	moji_set
		movwf	count_sub
		movf	count_sub,0
		skpz
		goto	int_next2
		call	count_init
		goto	int_next3
		;--------------------------------
int_next2		call	led_set_sub
0.5秒の割り込みごとに文字列ポインタをひとつ進めて1文字づつ表示RAMに設定していますが、このとき読み出した文字が「00h」の時は文字列が終わったとみなして文字列ポインタを初期化する必要があります。
文字列から1文字読み出す処理(moji_set)を抜けてきたときWレジスタが「00h」かを判断するとき、そのままではゼロフラグが変化していないので判断出来ません。一度そのまま文字ポインタ(count_sub)に書き込み、そこから再びWレジスタに読み出します。このときはゼロフラグが変化するので判断出来ることになります。
マトリックス64(電光掲示板)の全ソースリスト公開
今回の電光掲示板仕様のソースです。皆さんで自由に改造してみて下さい。
長くなるので別ページにしました。
ソースリストはこちらへ
マトリックス64(電光掲示板)の全HEXコード
HEXコードです。メモ帳などのテキストエディタにコピー&ペーストしてファイルすればPICに書き込めるデータに出来ます。
:020000001D28B9
:080008008C0003088D000B11B0
:1000100063308100950B182819309500920A120858
:10002000852091001108031D17287A200F286120D0
:100030000D0883008C0E0C0E090083220030850011
:10004000FF308600013094007A201208852091004C
:1000500061208A2219309500851938287E22851959
:1000600038287D207A20120885209100851D3628A9
:1000700000308500200886007E220130850021089E
:1000800086007E2202308500220886007E22033010
:100090008500230886007E2204308500240886001F
:1000A0007E2205308500250886007E2206308500E8
:1000B000260886007E2207308500270886007E22DB
:1000C0002C281108E620A00011081921A100110810
:1000D0004C21A20011087F21A3001108B221A40025
:1000E0001108E521A50011081822A60011084B22CD
:1000F000A7000800003092000800941D82280130FB
:1001000094000800940D1410080014188C289418FA
:100110009D281419B328C828930095309307003000
:100120008A0003188A0A1308820009341D3419341E
:100130000F3415341C341B3400349300A63093075D
:1001400000308A0003188A0A130882000E340F3424
:100150000E340334083401340E3413340F340634AF
:1001600014341B3400349300BC30930700308A00F1
:1001700003188A0A1308820027341E341F342034DF
:100180002134223423342434253426341B340034DF
:100190009300D130930700308A0003188A0A1308AD
:1001A00082000F34103405340E341C3401340D3405
:1001B000263428341F342434293410340D341E34AA
:1001C00027342834223425341B3400349300EF3094
:1001D000930700308A0003188A0A1308820000344B
:1001E000033400348134003400340034813400346A
:1001F000FF349F3400340034003400348134003440
:1002000081340034B934FE348034F83480343C34E2
:10021000F8343E34FF343F34E134FF343934993418
:10022000C73490348134F8349934B1348134FF3494
:10023000E73493002230930701308A0003188A0ABA
:1002400013088200003401340034003400340034D8
:10025000003400340034FF341F34003400340034E0
:10026000003400340034003400343034FE340034C0
:10027000E03400341834F0341E34FF343F34C034DA
:10028000FF3418341834C13410340034F8340034D6
:1002900020340034FF34F334930055309307013099
:1002A0008A0003188A0A130882000034CC346634AA
:1002B0003C347E346634E6343C34E7347E343F34B8
:1002C000E7347F34F934F1343C34E6343C34E634FA
:1002D0006034FE343F3483341F348134E3340E34CD
:1002E000FF34CF3480347C341C347E34D8347634BC
:1002F0006634FE34663466343C34FF34F3349300A1
:100300008830930701308A0003188A0A1308820094
:100310000034CC3466347E347E346634E6347E3445
:10032000E73400347F34C3347F34E334E3347E3441
:10033000E6347E34C634663400347F340F3483347C
:10034000C33407344634FF34C334013400344E34EC
:100350006634DE34763466340E34663466346E3495
:100360009934E3349300BB30930701308A000318BB
:100370008A0A130882000034CC3466347E347E341A
:100380006634E6346634E73400347E3481347F34B6
:10039000E334C7347E34E6344E3486346634003475
:1003A0007F340F348334C33407346234FF34E13490
:1003B000013400344E346634003476346634063406
:1003C0006634663476349934C7349300EE3093073C
:1003D00001308A0003188A0A130882000034CC34E2
:1003E00000343C343C346634E6342434E7347E3420
:1003F0003E3418347F34F9348F343C34E6341C34C2
:1004000006340634FE343F3483341F348134E334FD
:100410007034FF34E03480347F346434003400348A
:1004200026346634E234663466343C34FF34CF34E8
:1004300093002130930702308A0003188A0A1308B8
:100440008200003401340034183400346634E63459
:1004500004340034FF3400343C347F34003400343E
:100460000034E034003420340C34FE340034E03402
:1004700000341834F0347834FF34F034C034FF34AE
:1004800060340034DF3406340434F0340034003493
:100490000034FF34CF3493005430930702308A0085
:1004A00003188A0A130882000034033499349934FB
:1004B00081347E34FE348D340034FF3480347E3415
:1004C0007F34003400348134F134813471349D340C
:1004D000FE348034F83480343C34F8347C34FF34D7
:1004E000F834E134FF3471349934DF348E348D3490
:1004F000F834993481348134FF34E734FF3090008C
:10050000900B802A0800831685018515000086015E
:1005100083120800831686308100831263308100C5
:060520008B168B1708008A
:02400E00F13F80
:00000001FF
(matrix4.hex)
マトリックス64(電光掲示板)の完成
どうでしょうか。1文字づつですが、上図のように表示出来ます。
皆さんも好きな文字を表示させてみましょう。
ということで、次回は流れる表示に挑戦します。
これからも益々面白くなる「PIC16F84電子遊戯」をよろしくお願いします。

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