目次PIC回路集サインボード 2ソフトウェア


サインボード 2 ソフトウェア
データ設定




この処理はメイン処理に組み込んで使用します。
機能
    表示用のスクリーン・ワーク・エリアに1画面分のデータを設定します。
    この処理だけではLEDへの制御は行われません。
    他の表示効果処理と組み合わせて使用します。


ソースリスト

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
;**********  Data-1 Set to work screen area  ************
        cblock         h'40'
        data1_lp
        data1_index
        data1_data
        endc

data1
        movlw   d'16'           ;Set loop count
        movwf   data1_lp        ;Save loop count
        movlw   d'15'           ;Set row index
        movwf   data1_index     ;Save row index
data1_set_w_lp
        call    data1_read      ;Data read
        movwf   data1_data      ;Save data
        movlw   scrnwhd         ;Screen work head adr
        addwf   data1_index,w   ;Head + Index
        movwf   fsr             ;Set table address
        movf    data1_data,w    ;Read data
        movwf   indf            ;Write data
        decf    data1_index,f   ;Index - 1
        decfsz  data1_lp,f      ;Loop end ?
        goto    data1_set_w_lp  ;No. Next data
        return

data1_read
        movlw   high(datat1)    ;Read data higher adr
        movwf   pclath          ;Set PCLATH(for recover)
        movlw   low(datat1)     ;Read data lower adr 
        addwf   data1_index,w   ;DATA1 HA + Index
        btfsc   status,c        ;Carry OFF ?
        incf    pclath,f        ;Carry ON -> PCLATH + 1
        movwf   pcl             ;Jump to DATA
datat1  retlw   b'00110110'     ;Most left row data
        retlw   b'01100011'     ;Lower <-----> Upper
        retlw   b'01001001'     ;'0' is ON (Lighting-up)
        retlw   b'00011100'     ;'1' is OFF (Going-out)
        retlw   b'01001001'
        retlw   b'01100011'
        retlw   b'00110110'
        retlw   b'00011100'
        retlw   b'00011100'
        retlw   b'00110110'
        retlw   b'01100011'
        retlw   b'01001001'
        retlw   b'00011100'
        retlw   b'01001001'
        retlw   b'01100011'
        retlw   b'00110110'     ;Most right row data



解説
    2行目から6行目でワークエリアの自動割付を行っています。

    サインボードではEEPROMに表示するデータを記憶させました。その場合、64バイトのデータしか記憶させることができません。プログラムメモリは1Kワードの容量がありますので、多くのデータを記憶させることができます。ただし、プログラムを含めてですから、全てをデータの記憶には使えません。

    プログラムメモリは1ワードが14ビットで構成されているので、そのままでは8ビットのデータを記憶させることができません。そこで、RETLW命令を使用して8ビットのデータを扱っています。
    RETLWはサブルーチンから戻るときに使用する命令で、戻るときに命令で指定した8ビットのデータをWレジスタに格納して戻ります。ですから、サブルーチンから戻ったときにWレジスタを読めばデータを取り出すことができます。

    今回のルーチンではDATA1_READがデータ読み出し用のサブルーチンです。この処理ではデータテーブル(DATA1)の先頭アドレスにインデックスを加算してジャンプさせています。
    プログラムメモリのアドレスはSFRのPCLATH(上位5ビット用)およびPCL(下位8ビット用)により管理されています。
    PCLは8ビットなので0から255(FFh)までのアドレスしか管理できません。256以上のアドレスではPCLATHが設定されます。データテーブルがアドレス255以内であればPCLATHを意識する必要はないのですが、実際はそうではないのでジャンプ先のアドレスを算出するときにはPCLにインデックスを加算した後、桁上げをチェックし、桁上げがあればPCLATHを1つ加算します。算出したアドレスへのジャンプはPCLを書き換えることにより行います。

    PCLATHを扱うときに注意することは設定した値はプログラムの実行アドレスが255以内になっても変わらないことです。例えば、DATA1の先頭アドレスが250で末尾アドレスが265であったとします。末尾のデータにジャンプする計算で250(FAh)+15(Fh)=265(109h)を行うとPCLは8ビットなので09hになります。桁上げが発生しているのでPCLATHに1を加算します。処理が進んでプログラムの実行アドレスが255以内になったとしてもPCLATHの値は1のままです。再度、データ設定サブルーチンに来たときにも1のままで、そのまま処理すると算出アドレスが違ってしまいます。そこで、データ読み出しサブルーチン(DATA1_READ)の先頭で再度データテーブルの先頭アドレスの上位ビットをPCLATHに設定しています。

    データテーブルの構成は先頭が表示部では最左端になり、末尾が最右端になります。また、ビット0が最上端、ビット6が最下端です。設定データは'0'が点灯を示し、'1'が消灯を示します。ビット7は使っていません。(周囲LEDの回転方向指定用で、データテーブルの値は使っていません。)

    データを何種類も作る場合にはこのサブルーチンの名称(DATA1)を各サブルーチン毎に変えて作成します。ラベルが重複しないように気を付ける必要があります。リストの赤字の数字を変更します。メモリを節約するためにはデータテーブルをテーブル指定インデックスで切り替えられるようなルーチンにしても良いと思います。

    31行目と32行目は以下のように一行で書くこともできます。アッセンブル結果は同じです。(2ワードの命令が作成されます)
        addcf   pclath,f        ;PCLATH + Carry

上記のリストの表示パターンは以下のようになります。