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

マトリックス64で英文字を表示しよう
まず手始めとして、このマトリックス64で英文字を順次表示するサンプルを作りましょう。
マトリックス64をPCのようなハードとするとその中のソフトは皆さんのお好みで自由に出来るはずです。今回はこのハードを充分楽しむことを目的として、色んなソフトを作ります。その取り掛かりとして英文字を表示してみます。
(Gを表示させました)
英文字はちょっと速いかもしれませんが、0.5秒ごとに切り換わります。
英文字は全部で26文字なので、それを順次カウントする必要があります。
カウンタをふたつ用意して、文字のポインタと繰り返すポインタとして使います。
文字のポインタは繰り返しのポインタとして使用してもいいのですが、判定を簡単にするためにわざとふたつ使います。
count_sub count_sub2
文字ポインタ 繰り返しポインタ
文字ポインタ(count_sub)を0.5秒ごとにインクリメントして、表示する文字のデータの入っているエリアを求めるのに使います。
繰り返しポインタ(count_sub2)は初期値(26=1AH)から0.5秒ごとにデクリメントして、「0」になればA−Zの表示が終了したとして、文字ポインタ(count_sub)と繰り返しポインタ(count_sub2)を初期化します。これによりA−Zの表示が永遠に繰り返されることになります。
マトリックス64の英文字データ参照について
文字ポインタ(count_sub)の値に応じて文字データの入っているエリアからデータを読み出す必要があります。
ミラクルライトでは未だプログラムが未熟(?)だったため、書きなぐり状態でしたが今回はちょっと工夫しました。
PICの解説書には必ず載っていますので、難しいものではありません。
まずはその部分のソースを見て下さい。
データ参照ルーチン
led_data_line0	movwf	taihi
		movlw	low(table0)
		addwf	taihi,1
		movlw	high(table0)
		movwf	PCLATH
		addcf	PCLATH,1
		movf	taihi,0
		movwf	PCL
table0		retlw	03h		;A
		retlw	00h		;B
		retlw	81h		;C
文字ポインタ(count_sub)の値をWレジスタに書き込みこのデータ参照ルーチンを呼ぶと、LEDに表示するデータを読み出してWレジスタに入れて戻ってきます。
実際には8列あるので、1列ごとに8回繰り返してひとつの文字としています。
1)Wレジスタを作業エリア(taihi)に書き込みます。
2)データが列記されている先頭アドレスの下位8bitをWレジスタに読み出します。
3)このWレジスタと作業エリア(taihi)の値を加算して再び作業エリア(taihi)に書き込みます。このとき繰り上がりがあればキャリーフラグが立ちます。
4)データが列記されている先頭アドレスの上位ビットをWレジスタに読み出します。
5)Wレジスタをプログラムカウンタの上位(PCLATH)に書き込みます。
先ほどの繰り上がりのキャリーフラグがあればそれを加算します。
6)先に計算した作業エリア(taihi)の値をプログラムカウンタの下位(PCL)に書き込みます。
この時点で(PCLATH)(PCL)のアドレスに飛ぶことになります。
7)そこにはWレジスタに書き込む値があるのでそのデータをWレジスタに入れて戻ります。
どうですか、理解出来ましたか?最初はアドレスカウンタの下位(PCL)しか気にしていなかったのですが、上位も気にしてきちんと演算しないと上手く行かないことがわかりました。
皆さんが応用されるときは、そのまま使ってください。(私もPICの解説書に載っているのをそのまま使っています。)
マトリックス64のSW1の操作仕様
今回の英文字表示についてデジカメで写真を撮ろうとしたとき、表示が流れてうまく撮れませんでした。そこでSW1で表示を止められるようにしています。
ほとんど実用的ではありませんが、ソースの勉強には良いので説明します。
auto_mode
7 6 5 4 3 2 1 0
-- -- -- -- -- -- -- auto/stop select
まずAUTO/STOP切り換え用のRAMを用意します。
これをSW1が押されたときに変更して英文字が順次表示したり止まったりします。
SW1のキースキャン
sw1_key			btfsc	PORTA,3
		goto	next_key
		call	wait_1
		btfsc	PORTA,3
		goto	next_key
					;sw1 on
		btfsc	auto_mode,0
		goto	sw1_key2
		bsf	auto_mode,0	;mode auto
		goto	sw1_end
sw1_key2		bcf	auto_mode,0	;mode stop
		
sw1_end		btfss	PORTA,3
		goto	sw1_end
next_key
1)SW1の入力ポートが「0」でないときは次の処理(next_key)へ飛びます。
2)「0」のときは一定時間待ちます。
3)再びSW1の入力ポートを調べて「0」でないときは次の処理(next_key)へ飛びます。
4)AUTO/STOP切り換えRAM(auto_mode,0)を調べてビットを反転します。
5)SW1が離されるまで待ちます。
マトリックス64(英文字表示仕様)の全ソースリスト公開
とりあえず英文字表示仕様のソースです。皆さんでどんどん改造してみて下さい。
;**********************************************************************
;    Filename:      matrix2.asm                                       *
;    Date:          2001/4/25                                        *
;    File Version:                                                    *
;**********************************************************************

        list      p=16F84             ; list directive to define processor
        #include <p16F84.inc>         ; processor specific variable definitions

        __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;***** VARIABLE DEFINITIONS
w_temp         EQU     0x0C        ; variable used for context saving 
status_temp        EQU     0x0D        ; variable used for context saving

wait_data               EQU     0x10            ;wait data
count_sub               EQU     0x11            ;count sub data
count_sub2      EQU     0x12            ;count sub2 data

taihi           EQU     0x13            ;taihi data
auto_mode               EQU     0x14            ;auto mode ram
                                        ;auto_mode,0  auto/stop select

count_data      EQU     0x15            ;0.5sec keisoku count ram

led_data0               EQU     0x20            ;LED DATA(0)
led_data1               EQU     0x21            ;LED DATA(1)
led_data2               EQU     0x22            ;LED DATA(2)
led_data3               EQU     0x23            ;LED DATA(3)
led_data4               EQU     0x24            ;LED DATA(4)
led_data5               EQU     0x25            ;LED DATA(5)
led_data6               EQU     0x26            ;LED DATA(6)
led_data7               EQU     0x27            ;LED DATA(7)

tm0_setdata     EQU     63h             ;255-156=99=63H  156*128=19.968msec
cnt_setdata     EQU     19h             ;19.968*25=0.4992sec

;**********************************************************************
                ORG     0x000             ; processor reset vector
                goto    main              ; go to beginning of program

;----------------------------------------------------------------------------------
                ORG     0x004             ; interrupt vector location
                movwf   w_temp            ; save off current W register contents
                movf    STATUS,w          ; move status register into W register
                movwf   status_temp       ; save off contents of STATUS register

                ;---------------------------------      
                bcf     INTCON,T0IF
                movlw   tm0_setdata
                movwf   TMR0

                decfsz  count_data,1
                goto    int_end
time_up         movlw   cnt_setdata             
                movwf   count_data
                ;--------------------------------
                btfss   auto_mode,0
                goto    int_end
                incf    count_sub,1
                decfsz  count_sub2,1
                goto    int_next2
                call    count_init
                ;--------------------------------
int_next2               call    led_set_sub

int_end
                ;----------------------------------
                movf    status_temp,w     ; retrieve copy of STATUS register
                movwf   STATUS            ; restore pre-isr STATUS register contents
                swapf   w_temp,f
                swapf   w_temp,w          ; restore pre-isr W register contents
                retfie                    ; return from interrupt
;---------------------------------------------------------------------------------------
main
                call    port_set
                movlw   00h             ;port initial set
                movwf   PORTA
                movlw   0ffh
                movwf   PORTB

                call    count_init
                call    led_set_sub

                movlw   01h
                movwf   auto_mode

                call    timer0_set
                movlw   cnt_setdata
                movwf   count_data

main_loop
;-------------------------------------- key scan
sw1_key         btfsc   PORTA,3
                goto    next_key
                call    wait_1
                btfsc   PORTA,3
                goto    next_key
                                        ;sw1 on
                btfsc   auto_mode,0
                goto    sw1_key2
                bsf     auto_mode,0     ;mode auto
                goto    sw1_end
sw1_key2                bcf     auto_mode,0     ;mode stop
                
sw1_end         btfss   PORTA,3
                goto    sw1_end
next_key
;-------------------------------------- led disp
                movlw   00h
                movwf   PORTA
                movf    led_data0,0
                movwf   PORTB
                call    wait_1

                movlw   01h
                movwf   PORTA
                movf    led_data1,0
                movwf   PORTB
                call    wait_1

                movlw   02h
                movwf   PORTA
                movf    led_data2,0
                movwf   PORTB
                call    wait_1

                movlw   03h
                movwf   PORTA
                movf    led_data3,0
                movwf   PORTB
                call    wait_1

                movlw   04h
                movwf   PORTA
                movf    led_data4,0
                movwf   PORTB
                call    wait_1

                movlw   05h
                movwf   PORTA
                movf    led_data5,0
                movwf   PORTB
                call    wait_1

                movlw   06h
                movwf   PORTA
                movf    led_data6,0
                movwf   PORTB
                call    wait_1

                movlw   07h
                movwf   PORTA
                movf    led_data7,0
                movwf   PORTB
                call    wait_1
;---------------------------------------
main_next
                goto    main_loop
;-------------------------------------------------------------------------------
led_set_sub     movf    count_sub,0
                call    led_data_line0
                movwf   led_data0
                movf    count_sub,0
                call    led_data_line1
                movwf   led_data1
                movf    count_sub,0
                call    led_data_line2
                movwf   led_data2
                movf    count_sub,0
                call    led_data_line3
                movwf   led_data3
                movf    count_sub,0
                call    led_data_line4
                movwf   led_data4
                movf    count_sub,0
                call    led_data_line5
                movwf   led_data5
                movf    count_sub,0
                call    led_data_line6
                movwf   led_data6
                movf    count_sub,0
                call    led_data_line7
                movwf   led_data7
                return
;-------------------------------------------------------------------------------
count_init      movlw   00h
                movwf   count_sub
                movlw   1ah             ;count su
                movwf   count_sub2
                return          
;-------------------------------------------------------------------------------
led_data_line0  movwf   taihi
                movlw   low(table0)
                addwf   taihi,1
                movlw   high(table0)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table0          retlw   03h             ;A
                retlw   00h             ;B
                retlw   81h             ;C
                retlw   00h             ;D
                retlw   00h             ;E
                retlw   00h             ;F
                retlw   81h             ;G
                retlw   00h             ;H
                retlw   0ffh            ;I
                retlw   9fh             ;J
                retlw   00h             ;K
                retlw   00h             ;L
                retlw   00h             ;M
                retlw   00h             ;N
                retlw   81h             ;O
                retlw   00h             ;P
                retlw   81h             ;Q
                retlw   00h             ;R
                retlw   0b9h            ;S
                retlw   0feh            ;T
                retlw   80h             ;U
                retlw   0f8h            ;V
                retlw   80h             ;W
                retlw   3ch             ;X
                retlw   0f8             ;Y
                retlw   3eh             ;Z
;-------------------------------------------------------------------------------
led_data_line1  movwf   taihi
                movlw   low(table1)
                addwf   taihi,1
                movlw   high(table1)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table1          retlw   01h             ;A
                retlw   00h             ;B
                retlw   00h             ;C
                retlw   00h             ;D
                retlw   00h             ;E
                retlw   00h             ;F
                retlw   00h             ;G
                retlw   00h             ;H
                retlw   0ffh            ;I
                retlw   1fh             ;J
                retlw   00h             ;K
                retlw   00h             ;L
                retlw   00h             ;M
                retlw   00h             ;N
                retlw   00h             ;O
                retlw   00h             ;P
                retlw   00h             ;Q
                retlw   00h             ;R
                retlw   30h             ;S
                retlw   0feh            ;T
                retlw   00h             ;U
                retlw   0e0h            ;V
                retlw   00h             ;W
                retlw   18h             ;X
                retlw   0f0h            ;Y
                retlw   1eh             ;Z
;-------------------------------------------------------------------------------
led_data_line2  movwf   taihi
                movlw   low(table2)
                addwf   taihi,1
                movlw   high(table2)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table2          retlw   0cch            ;A
                retlw   66h             ;B
                retlw   3ch             ;C
                retlw   7eh             ;D
                retlw   66h             ;E
                retlw   0e6h            ;F
                retlw   3ch             ;G
                retlw   0e7h            ;H
                retlw   7eh             ;I
                retlw   3fh             ;J
                retlw   0e7h            ;K
                retlw   7fh             ;L
                retlw   0f9h            ;M
                retlw   0f1h            ;N
                retlw   3ch             ;O
                retlw   0e6h            ;P
                retlw   3ch             ;Q
                retlw   0e6h            ;R
                retlw   60h             ;S
                retlw   0feh            ;T
                retlw   3fh             ;U
                retlw   83h             ;V
                retlw   1fh             ;W
                retlw   81h             ;X
                retlw   0e3h            ;Y
                retlw   0eh             ;Z
;-------------------------------------------------------------------------------
led_data_line3  movwf   taihi
                movlw   low(table3)
                addwf   taihi,1
                movlw   high(table3)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table3          retlw   0cch            ;A
                retlw   66h             ;B
                retlw   7eh             ;C
                retlw   7eh             ;D
                retlw   66h             ;E
                retlw   0e6h            ;F
                retlw   7eh             ;G
                retlw   0e7h            ;H
                retlw   00h             ;I
                retlw   7fh             ;J
                retlw   0c3h            ;K
                retlw   7fh             ;L
                retlw   0e3h            ;M
                retlw   0e3h            ;N
                retlw   7eh             ;O
                retlw   0e6h            ;P
                retlw   7eh             ;Q
                retlw   0c6h            ;R
                retlw   66h             ;S
                retlw   00h             ;T
                retlw   7fh             ;U
                retlw   0fh             ;V
                retlw   83h             ;W
                retlw   0c3h            ;X
                retlw   07h             ;Y
                retlw   46h             ;Z
;-------------------------------------------------------------------------------
led_data_line4  movwf   taihi
                movlw   low(table4)
                addwf   taihi,1
                movlw   high(table4)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table4          retlw   0cch            ;A
                retlw   66h             ;B
                retlw   7eh             ;C
                retlw   7eh             ;D
                retlw   66h             ;E
                retlw   0e6h            ;F
                retlw   66h             ;G
                retlw   0e7h            ;H
                retlw   00h             ;I
                retlw   7eh             ;J
                retlw   81h             ;K
                retlw   7fh             ;L
                retlw   0e3h            ;M
                retlw   0c7h            ;N
                retlw   7eh             ;O
                retlw   0e6h            ;P
                retlw   4eh             ;Q
                retlw   86h             ;R
                retlw   66h             ;S
                retlw   00h             ;T
                retlw   7fh             ;U
                retlw   0fh             ;V
                retlw   83h             ;W
                retlw   0c3h            ;X
                retlw   07h             ;Y
                retlw   62h             ;Z
;-------------------------------------------------------------------------------
led_data_line5  movwf   taihi
                movlw   low(table5)
                addwf   taihi,1
                movlw   high(table5)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table5          retlw   0cch            ;A
                retlw   00h             ;B
                retlw   3ch             ;C
                retlw   3ch             ;D
                retlw   66h             ;E
                retlw   0e6h            ;F
                retlw   24h             ;G
                retlw   0e7h            ;H
                retlw   7eh             ;I
                retlw   3eh             ;J
                retlw   18h             ;K
                retlw   7fh             ;L
                retlw   0f9h            ;M
                retlw   8fh             ;N
                retlw   3ch             ;O
                retlw   0e6h            ;P
                retlw   1ch             ;Q
                retlw   06h             ;R
                retlw   06h             ;S
                retlw   0feh            ;T
                retlw   3fh             ;U
                retlw   83h             ;V
                retlw   1fh             ;W
                retlw   81h             ;X
                retlw   0e3h            ;Y
                retlw   70h             ;Z
;-------------------------------------------------------------------------------
led_data_line6  movwf   taihi
                movlw   low(table6)
                addwf   taihi,1
                movlw   high(table6)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table6          retlw   01h             ;A
                retlw   00h             ;B
                retlw   18h             ;C
                retlw   00h             ;D
                retlw   66h             ;E
                retlw   0e6h            ;F
                retlw   04h             ;G
                retlw   00h             ;H
                retlw   0ffh            ;I
                retlw   00h             ;J
                retlw   3ch             ;K
                retlw   7fh             ;L
                retlw   00h             ;M
                retlw   00h             ;N
                retlw   00h             ;O
                retlw   0e0h            ;P
                retlw   00h             ;Q
                retlw   20h             ;R
                retlw   0ch             ;S
                retlw   0feh            ;T
                retlw   00h             ;U
                retlw   0e0h            ;V
                retlw   00h             ;W
                retlw   18h             ;X
                retlw   0f0h            ;Y
                retlw   78h             ;Z
;-------------------------------------------------------------------------------
led_data_line7  movwf   taihi
                movlw   low(table7)
                addwf   taihi,1
                movlw   high(table7)
                movwf   PCLATH
                addcf   PCLATH,1
                movf    taihi,0
                movwf   PCL
table7          retlw   03h             ;A
                retlw   99h             ;B
                retlw   99h             ;C
                retlw   81h             ;D
                retlw   7eh             ;E
                retlw   0feh            ;F
                retlw   8dh             ;G
                retlw   00h             ;H
                retlw   0ffh            ;I
                retlw   80h             ;J
                retlw   7eh             ;K
                retlw   7fh             ;L
                retlw   00h             ;M
                retlw   00h             ;N
                retlw   81h             ;O
                retlw   0f1h            ;P
                retlw   81h             ;Q
                retlw   71h             ;R
                retlw   9dh             ;S
                retlw   0feh            ;T
                retlw   80h             ;U
                retlw   0f8h            ;V
                retlw   80h             ;W
                retlw   3ch             ;X
                retlw   0f8h            ;Y
                retlw   7ch             ;Z

;-------------------------------------------------------------------------------
wait_1          
                movlw   0ffh
                movwf   wait_data
wait_2
                decfsz  wait_data,1
                goto    wait_2
                return
;-------------------------------------------------------------------------------
port_set                                ;RA0,RA1,RA2,RA4(OUT)
                                        ;RA3(IN)
                                        ;RB0,RB1,RB2,RB3,RB4,RB5,RB6,RB7(OUT)
                bsf     STATUS,RP0
                clrf    TRISA
                bsf     TRISA,3
                nop
                clrf    TRISB
                bcf     STATUS,RP0
                return
;-------------------------------------------------------------------------------
timer0_set
                bsf     STATUS,RP0
                movlw   086h            ;(1)PORTB NOT PULLUP
                                        ;(0)INTEDG
                                        ;(0)TOCS
                                        ;(0)TOSE
                                        ;(0)PSA
                                        ;(110)1/128
                movwf   OPTION_REG
                bcf     STATUS,RP0
                
                movlw   tm0_setdata
                movwf   TMR0
                bsf     INTCON,T0IE
                bsf     INTCON,GIE
                return
;-----------------------------------------------------------------------------
                END                     ; directive 'end of program'
マトリックス64(英文字表示仕様)の全HEXコード
HEXコードです。メモ帳などのテキストエディタにコピー&ペーストしてファイルすればPICに書き込めるデータに出来ます。
:020000001A28BC
:080008008C0003088D000B11B0
:1000100063308100950B152819309500141C1528A4
:10002000910A920B142874205B200D0883008C0E1B
:100030000C0E0900962100308500FF3086007420E8
:100040005B20013094009D211930950085193228DC
:1000500091218519322814182F28141430281410CF
:10006000851D302800308500200886009121013050
:100070008500210886009121023085002208860033
:1000800091210330850023088600912104308500EA
:1000900024088600912105308500250886009121DD
:1000A0000630850026088600912107308500270844
:1000B00086009121262811087920A00011089C2093
:1000C000A1001108BF20A2001108E220A30011081E
:1000D0000521A40011082821A50011084B21A60024
:1000E00011086E21A7000800003091001A3092001C
:1000F000080093008230930700308A0003188A0AB0
:100100001308820003340034813400340034003496
:1001100081340034FF349F34003400340034003420
:100120008134003481340034B934FE348034F834FE
:1001300080343C34F8343E349300A53093070030CB
:100140008A0003188A0A130882000134003400343C
:1001500000340034003400340034FF341F340034E1
:1001600000340034003400340034003400343034BF
:10017000FE340034E03400341834F0341E3493007C
:10018000C830930700308A0003188A0A13088200D7
:10019000CC3466343C347E346634E6343C34E73464
:1001A0007E343F34E7347F34F934F1343C34E63480
:1001B0003C34E6346034FE343F3483341F348134BD
:1001C000E3340E349300EB30930700308A000318B9
:1001D0008A0A13088200CC3466347E347E34663456
:1001E000E6347E34E73400347F34C3347F34E33480
:1001F000E3347E34E6347E34C634663400347F34EF
:100200000F348334C3340734463493000E309307DD
:1002100001308A0003188A0A13088200CC3466343D
:100220007E347E346634E6346634E73400347E341B
:1002300081347F34E334C7347E34E6344E3486343C
:10024000663400347F340F348334C334073462346B
:1002500093003130930701308A0003188A0A13088B
:100260008200CC3400343C343C346634E6342434EC
:10027000E7347E343E3418347F34F9348F343C34E0
:10028000E6341C3406340634FE343F3483341F34E1
:100290008134E334703493005430930701308A0082
:1002A00003188A0A13088200013400341834003419
:1002B0006634E63404340034FF3400343C347F3494
:1002C000003400340034E034003420340C34FE3484
:1002D0000034E03400341834F0347834930077304C
:1002E000930701308A0003188A0A13088200033436
:1002F0009934993481347E34FE348D340034FF34A3
:1003000080347E347F34003400348134F1348134DD
:1003100071349D34FE348034F83480343C34F83405
:100320007C34FF309000900B9329080083168501E0
:10033000851500008601831208008316863081002F
:0C0340008312633081008B168B170800BD
:02400E00F13F80
:00000001FF
(matrix2.hex)
マトリックス64(英文字表示仕様)の各処理概要
割り込み処理
STATUSレジスタ退避
カウント処理
LED処理
STATUSレジスタ復帰
メイン処理
初期設定
SW1処理
LED処理
マトリックス64(英文字表示仕様)の完成
どうですか、並べて見ると圧巻ですね。文字が大きいのでかなり遠くからみてみ良く見えます。今は個別文字しか表示出来ないので今度は文字が流れるようなものに改造する予定です。
これからも益々面白くなる「PIC16F84電子遊戯」をよろしくお願いします。

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