プロが教えるわが家の防犯対策術!

PICのプログラムをアセンブラで組んでいるのですが、
どうにもシンプルな書き方ができなそうなのでお知恵をお貸しください。

例えば、
ポートAが入力、それ以外のポートは出力になっているとします。
・ポートAの0番のオンオフを、ポートBの2番へコピー出力。
・ポートAの1-3番のオンオフを、ポートCの4-6番へコピー出力。

という感じで、Aのオンオフ状況を、各出力ポートにコピーするということをしたいです。
どのようにしたらスマートに書けるでしょうか?

ちなみに各出力ポートに関して、コピーする前に一旦全てオフにする、
というようなことはできません。

A 回答 (2件)

一例ですが


BTFSC PORTA,0 ; PORTA_BIT0=0 SKIP
BSF PORTB,2 ; PORTB_BIT2=1 SET
BTFSS PORTA,0 ; PORTA_BIT0=1 SKIP
BCF PORTB,2 ; PORTB_BIT2=0 CLEAR

PORTAのリードが 1回目 2回目 変わらないことが前提ですが

複数のビットをコピーするのなら、マクロを組むか、レジスタにコピーして論理演算で合成してから出力します

BIT_COPY MACRO PORT_X,BIT_X,PORT_Y,BIT_Y
BTFSC PORT_X,BIT_X
BSF PORT_Y,BIT_Y
BTFSS PORT_X,BIT_X
BCF PORT_Y,BIT_Y
ENDM

BIT_COPY PORTA,1,PORTC,4
BIT_COPY PORTA,2,PORTC,5
BIT_COPY PORTA,3,PORTC,6
    • good
    • 0
この回答へのお礼

一番上の書き方は私が考えたのと大体同じ感じでしょうか。
やはりアセンブラだと冗長になりがちなのはしょうがないのかもしれません。

マクロを組めるのは知りませんでした。
これは便利ですね。
後々にも使える場面が出てくると思います。

ありがとうございました。

お礼日時:2014/02/21 09:33

シンプルかどうかは置いておいて


B/Cポートデータが読み込みできないということであれば
事前に書くポートへの出力でーや用のメモリを確保して
そのデータの大してAポートのデータを反映して
それぞれのポートに出力するのが常套手段となります

そういった事を聞いてるんじゃないのかな?
(正直何を質問したいのかよくわからん)

この回答への補足

ご返信ありがとうございます。
質問としては、どうも自分の思いつく方法だと書き方が冗長になってしまうので
普通はこういう場合にどうやって書くものなのかと思い質問させていただきました。

とりあえず思いついた方法というのは以下のような感じなのですが、
もう少しまとめて書いたりできないものでしょうか。。。

MOVFPORTA,0;
MOVWFMEM;PORTAの内容を保存

BTFSCMEM,0
BSFPORTB,2
BTFSCMEM,1
BSFPORTC,4
BTFSCMEM,2
BSFPORTC,5
BTFSCMEM,3
BSFPORTC,6

BTFSSMEM,0
BCFPORTB,2
BTFSSMEM,1
BCFPORTC,4
BTFSSMEM,2
BCFPORTC,5
BTFSSMEM,3
BCFPORTC,6

補足日時:2014/02/20 10:55
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!