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

マトリックス240のLEDデータ出力
今までは列ごとのLEDデータをRAMから順番に読み出し、出力するプログラムを書いていましたが、30列にもなるとプログラムの容量が心配です。
今回はINDFレジスタによる間接アドレッシングを利用してコンパクトなプログラムにしてみます。まず出力すべきLEDのデータは led_data0 から led_data29 に書き込まれています。これを順に出力する必要があります。
実際のRAMアドレスは20Hから3DHまでです。出力と同時に列番号を出力しなければならないのでこれが 00Hから1DHまでです。
先立って列番号が入るRAMを定義します。
retu_ichi
ポートAに出力する列番号
RAMアドレスをFSRレジスタに入れて、RAMのデータはINDFレジスタを経由してを読み出します。
列番号(retu_ichi)とFSRレジスタを順次変化させれば、順番にLEDのデータを出力することが出来ます。
プログラム自体はPICの判断命令の特性を考慮して上位側から下位側へアドレスを変化させています。(詳しくは下記ソースを見て下さいね。)
		movlw	1dh
		movwf	retu_ichi
		movlw	0x3d
		movwf	FSR

disp_loop		movf	retu_ichi,0
		movwf	PORTA
		movf	INDF,0
		movwf	PORTB
		call	wait_1
		decf	FSR,1
		decfsz	retu_ichi,1
		goto	disp_loop
			
		movf	retu_ichi,0
		movwf	PORTA
		movf	INDF,0
		movwf	PORTB
		call	wait_1
マトリックス240の流れる表示
今回のマトリックスは8*30ですので、文字を表示させると、次のようになります。
上の図を見て下さい。上側の図が最初に文字を表示する状態です。4文字目の途中までが必要ですので、少なくとも文字列の4文字目まで読み出しておくことが必要です。
さてそれがスクロールしていくとどうなるのでしょうか。右側の図は1文字目が消えかかっているときの状態です。1文字目が残っているのに5文字目が現れてきます。
ということで、今回は最初に5文字目まで読み出しておけば、1文字目が消えるまで、新しい文字を読み出さなくても済みます。
ということで、今回は表示させたい文字列からまず5文字読み出しておく部分を考えます。
moji1 読み出した1文字目
moji2 読み出した2文字目
moji3 読み出した3文字目
moji4 読み出した4文字目
moji5 読み出した5文字目
count_sub2 taihi2
文字列ポインタ 退避用
文字列ポインタ(count_sub2)はLEDの一番左側に表示される文字列のポインタです。
実際にはこのポインタの指す文字から5文字分を読み出してmoji1,moji2,moji3,moji4,moji5に書き込みます。退避用(taihi2)はWレジスタを一時記憶するのに使用します。
マトリックス240の文字列からの読み出し
moji_set_sub2	movwf	taihi2
		call	moji_set0
		movwf	moji1
		movf	taihi2,0
		addlw	1
		call	moji_set0
		movwf	moji2
		movf	taihi2,0
		addlw	2
		call	moji_set0
		movwf	moji3
		movf	taihi2,0
		addlw	3
		call	moji_set0
		movwf	moji4
		movf	taihi2,0
		addlw	4
		call	moji_set0
		movwf	moji5
		return
このルーチンに来る前に予め文字列ポインタ(count_sub2)の値をWレジスタに入れておき、そこから5文字読み出します。
読み出す部分(上記ではmoji_set0)は前回のマトリックス64のときと全く同じです。
Wレジスタを1カウントづつ多く足しながら5回読み出しているだけですね。
マトリックス240のスクロール
最初に文字を表示するときは、1文字目から3文字目、4文字目の64列分の合計30列分のデータを表示RAM(led_data0からled_data29)に書き込みます。
一方タイマー割り込みは0.1秒ごとにかかるようにしてあるので、この割り込みごとに1列づつ左にスクロールして、新たに一番右側の列に新しいデータを書き込みます。
これを8回繰り返せば1文字分が左に消えるので、文字列ポインタ(count_sub2)をひとつインクリメントして新たなデータを書き込みます。
そこで必要になるのが今どの列を表示しているかのポインタです。
retu_pointa
列ポインタ
この列ポインタ(retu_pointa)の内容によって、新たに右側に表示するデータが何文字目の何列目かがわかります。列ポインタ(retu_pointa)はPICの処理がしやすいようにビットシフトさせながら使用します。
一度表示したデータは29列分は左にスクロールさせて、新たに1列分だけ書き込みます。
retu_pointaのビット位置 新たに書き込むデータの位置
0 1文字目、2文字目、3文字目、4文字目の1〜6列目
1 4文字目の7列目
2 4文字目の8列目
3 5文字目の1列目
4 5文字目の2列目
5 5文字目の3列目
6 5文字目の4列目
7 5文字目の5列目
説明がわかりにくい方は、あとでソースをしげしげと眺めて下さい。
マトリックス240の文字列定義
今回も文字列はある範囲内で皆さんの自由に定義していただいてかまいません。
そのときひとつだけ注意していただきたいことがあります。
文字列の最後には文字列の最後を認識する00Hを書き込む必要があります。
その00Hの前には必ず、最初の4文字を繰り返して定義して下さい。
今回は動作スタートしてすぐに表示が見えているといやらしいので、最初の4文字目までは空白の表示にしました。
moji_set0		movwf	taihi
		movlw	low(moji00)
		addwf	taihi,1
		movlw	high(moji00)
		movwf	PCLATH
		addcf	PCLATH,1
		movf	taihi,0
		movwf	PCL
moji00		retlw	moji_sp
		retlw	moji_sp
		retlw	moji_sp
		retlw	moji_sp
		retlw	moji_W
		retlw	moji_E
		retlw	moji_L
		retlw	moji_C
		retlw	moji_O
		retlw	moji_M
		retlw	moji_E
		retlw	moji_sp
		retlw	moji_T
		retlw	moji_O
		retlw	moji_sp
		retlw	moji_O
		retlw	moji_U
		retlw	moji_R
		retlw	moji_sp
		retlw	moji_H
		retlw	moji_O
		retlw	moji_U
		retlw	moji_S
		retlw	moji_E
		retlw	moji_mk
		retlw	moji_sp
		retlw	moji_sp
		retlw	moji_sp
		retlw	moji_sp
		retlw	00h
最初の4文字まで繰り返すと、スクロールしたときスムーズに表示されます。
といっても空白では判らない?
マトリックス240の全ソースリスト公開
今回のマトリックス240のソースです。皆さんで自由に改造してみて下さい。
長くなるので、別ページにしました。
ソースリストはこちらへ
マトリックス240の全HEXコード
HEXコードです。テキストエディタにコピー&ペーストしてファイルすればPICに書き込めるデータに出来ます。
:020000001428C2
:080008008C0003088D000B11B0
:1000100063308100950B0F2805309500FF200D08F7
:1000200083008C0E0C0E0900372300308500FF3052
:100030008600FA201208132132203D230530950056
:100040001D3096003D3084001608850000088600AB
:1000500032238403960B24281608850000088600A6
:10006000322320281118412891189C281119A12801
:100070009119A628111AAB28911AB028111BB5287E
:10008000BA2818084E21A00018089321A1001808CA
:10009000D821A20018081D22A30018086222A4007B
:1000A0001808A722A5001808EC22A600180831237A
:1000B000A70019084E21A80019089321A9001908C2
:1000C000D821AA0019081D22AB0019086222AC0031
:1000D0001908A722AD001908EC22AE001908312337
:1000E000AF001A084E21B0001A089321B1001A0877
:1000F000D821B2001A081D22B3001A086222B400E7
:100100001A08A722B5001A08EC22B6001A083123F3
:10011000B7001B084E21B8001B089321B9001B082B
:10012000D821BA001B081D22BB001B086222BC009C
:100130001B08A722BD000800BF201B08EC22BD0041
:100140000800BF201B083123BD000800BF201C0889
:100150004E21BD000800BF201C089321BD000800EF
:10016000BF201C08D821BD000800BF201C081D228C
:10017000BD000800BF201C086222BD000800210845
:10018000A0002208A1002308A2002408A30025083B
:10019000A4002608A5002708A6002808A70029080B
:1001A000A8002A08A9002B08AA002C08AB002D08DB
:1001B000AC002E08AD002F08AE003008AF003108AB
:1001C000B0003208B1003308B2003408B30035087B
:1001D000B4003608B5003708B6003808B70039084B
:1001E000B8003A08B9003B08BA003C08BB003D081B
:1001F000BC00080000309200013091000800911FFF
:100200000F2901309100920A120813211C08031DC6
:100210000D29FA2012081321112932200800910D0E
:100220001110322008009D00272198001D08013E72
:10023000272199001D08023E27219A001D08033E30
:1002400027219B001D08043E27219C0008009300E5
:100250003030930701308A0003188A0A130882009D
:100260001B341B341B341B34173405340C34033457
:100270000F340D3405341B3414340F341B340F3455
:10028000153412341B3408340F3415341334053448
:100290001C341B341B341B341B3400349300573084
:1002A000930701308A0003188A0A13088200FF347A
:1002B000C0340034813400340034003481340034DC
:1002C000FF34F93400340034003400348134003415
:1002D000813400349D347F3401341F3401343C3484
:1002E0000F347C34FF34FC348734FF349C3499342D
:1002F000E334093481341F3499348D348134FF342C
:10030000E734E734E734BD34E7349934FF349F34BD
:10031000E7343C34EF34C734F734EF34E7349934FE
:10032000FF341C341F3493009C30930701308A0043
:1003300003188A0A13088200FF3480340034003422
:10034000003400340034003400347E34F834003497
:1003500000340034003400340034003400340C34F1
:100360007F34003407340034183407347834FF34D1
:10037000FC340334BE341834183483340834003465
:100380001F34003404340034FF34CF34E734E7340E
:100390009934E7349934F7341F34C3343C34CF34C0
:1003A000C734F334C734C3340034F93458345F34B9
:1003B0009300E130930701308A0003188A0A13087A
:1003C0008200FF34333466343C347E346634673420
:1003D0003C34E7340034FC34C334FE349F34C73437
:1003E0003C3467347E34673406340034FC34C13422
:1003F000F8348134E0347034FF34E33401340034B1
:1004000078347E343B346E3466347F3466346634FC
:100410007E349934C7340034E734C33424349934F7
:10042000C3347F34813418348134C7348134833405
:1004300081340034F0341134813493002630930732
:1004400002308A0003188A0A13088200FF3433340A
:1004500066347E347E34663467346634E734003480
:100460007E348134FE34C734E3347E3467347234EE
:10047000613466340034FE34F034C134C334E034C3
:100480004234FF34833480340034723466340034B0
:100490006E34663470346634663466349934E334CA
:1004A0000034E734003424349934C334723499343A
:1004B0009934013401348034013400349934F034F7
:1004C000C734003493006B30930702308A0003185E
:1004D0008A0A13088200FF34333466347E343C3495
:1004E000663467346634E7347E347C341834FE3442
:1004F0009F34F1343C3467347834603460347F3472
:10050000FC34C134F834813407340E34FF340734FA
:100510000134FE346634663400346C34663460343E
:10052000663466347E34FF34F334E734E734C3345E
:10053000E7349934E73462341834813481348334B5
:100540008134C73481340034F93488343C34930026
:10055000B030930702308A0003188A0A1308820019
:10056000FF34803400341834003466346734203467
:100570000034FF3400343C34FE34003400340034A2
:1005800007340034043430347F340034073400340A
:1005900018340F341E34FF340F340334FF34063460
:1005A0000034FB34603420340F3400340034003421
:1005B000FF34F334E734E7349934E7349934FF34C3
:1005C0000F343C34C334CF34C734F334C734C3346A
:1005D0000034FF341A3418349300F5309307023096
:1005E0008A0003188A0A13088200FF34C034993441
:1005F000993481347E347F3431340034FF34013413
:100600007E34FE340034003481348F3481348E34AF
:10061000B934FF3401341F3401343C34FF343E34E8
:10062000FF341F348734FF348E349934FB347134F3
:10063000B1341F34993481348134FF34E734FF34CA
:10064000E734BD34FF349934FF349F343C34E7340D
:10065000EF34EF34F734C734E7349934FF343834A7
:100660009934FF34FF309000900B342B0800831630
:100670008501000086018312080083168630810000
:0C0680008312633081008B168B1708007A
:02400E00F13F80
:00000001FF
(matrix7.hex)
マトリックス240の完成
どうでしょうか。これだけ文字が一度に見れれば感動モンですね。
さて今回はこれだけでは終わりません。以前予告したように、これだけ「いいもの」が出来たのですから、これを実用的(?)に使用しようと考えました。
文字の内容からわかると思いますが、この「マトリックス240」を玄関に設置してしまおう、というわけです。
玄関のドアを開けて入って来られたお客さんに流れるメッセージを鑑賞(?)していただきましょう。
いかがでしたか、これからも益々面白くなる「PIC16F84電子遊戯」をよろしくです。

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