• ベストアンサー

アセンブラによる16f84のプログラミング

次の3つのプログラムを作成したいのですが、どうにも分からないので皆さんの知恵を分けていただきたく思います。 (1)PORTAの下位4ビットをPORTBの上位4ビットに転送するプログラム (2)PORTAのビット0、ビット1に入力された値の論理積をPORTBのビット0に出力するプログラム (3)PORTAのビット0、ビット1の内容が両方1になるまで待ち続け、両方1になったらPORTBにB'10010110'を出力するプログラム この三つです。このうちの一つでも二つでも結構ですので、分かる方お教え願います。

質問者が選んだベストアンサー

  • ベストアンサー
  • kabasan
  • ベストアンサー率44% (264/588)
回答No.2

(1)その他のピンに影響を与えないようなコードならこうなります。 SWAPF PORTA,W ;PORTAの上位4ビットと下位4ビットを入れ替え IORLW H'0F' ;いらない下位4ビットをクリア MOVWF RAM1 ;RAM1に保存 ; *** 割り込みを使っているならココで割り込み禁止する *** MOVLW H'F0' ;PORTBを読み込み、同時に下位4ビットクリア IORWF PORTB,W IORWF RAM1,PORTB ;PORTAから取り込んだデータと合成して出力 ; *** 割り込みを使っているならココで割り込み許可する *** 割り込み禁止をかけるのはPORTBを読み込んで書き戻すまでの間に割り込み処理に入ってPOTRBが書き換えられる可能性があるからです。割り込みを使用していてもそんなコードが無いなら禁止する必要は有りません。 また、冗長で汚いプログラムになりますが、1ビットずつチェックしてBCFとBSFで出力を書き換えるなら割り込みは気にしなくて良くなります。 (2)PORTAがXXXXXX11ならPORTBのビット0をセット、違えばクリア。 COMF PORTA,W ;PORTAを反転して読み込み IORLW B'00000011' ;上位6ビットをクリアして結果が0なら両ビットが1だった(=論理積1) BTFSS STATUS,2 ;論理積=1なら次の命令はスキップ GOTO LABEL1 BSF PORTB,0 ;論理積=1なのでPORTBのビット0をセット GOTO LABEL2 LABEL1 BCF PORTB,0 ;論理積=0なのでPORTBのビット0をクリア LABEL2 (3)条件部分は(2)と同じなので、PORTBへの出力処理が違うだけ LABEL1 COMF PORTA,W ;PORTAを反転して読み込み IORLW B'00000011' ;上位6ビットをクリアして結果が0なら両ビットが1だった(=論理積1) BTFSC STATUS,2 ;論理積=1なら次の命令はスキップ GOTO LABEL1 ;論理積=0だったので、何もせず先頭へ戻る MOVLF B'10010110' MOVWF PORTB ;PORTBへ出力 GOTO LABEL1 ;先頭へ戻る こんなところでしょう。 あ~!タブがスペースに変換されるから見づらいだろうなぁ。

ZZR1200
質問者

お礼

御回答ありがとうございます。何か自分の考えていたのと方向から違いました(笑)参考にさせていただきます。

ZZR1200
質問者

補足

あっ、(2)にPORTBのビット0以外のビットはすべて1を出力するものとする。という条件を付け加えると、どこか変わりますか?アホみたいなことかもしれませんが…。

その他の回答 (2)

  • kabasan
  • ベストアンサー率44% (264/588)
回答No.3

>(2)にPORTBのビット0以外のビットはすべて1を出力するものとする。という条件を付け加えると、どこか変わりますか? 私の書いたソースですとPORTBの他のビットは変化しませんが、結果出力時に明示的に1を出力するなら、 ;*** 4行目までは同じ *** MOVLW B'11111111' ;論理積=1なので全ビットをセット GOTO LABEL2 LABEL1 MOVLW B'11111110' ;論理積=0なのでビット0以外のすべてをセット LABEL2 MOVWF PORTB ;データを出力 こうですね。

ZZR1200
質問者

お礼

あっ、なるほど!わかりました。ありがとうございます。

  • paspas
  • ベストアンサー率52% (47/90)
回答No.1

(1)PORT B = (PORT A AND 0FH) OR (PORT B AND 0F0H) (2)PORT A のデータをXに記録し、AND 01H をした結果をX1とします。Xを1ビット右シフト(右ローテート)しAND 01Hします。これをX2とします。 X3 = X1 AND X2 X3の状態によりPORT B bOの出力をBCFまたはBSFで出力すればよいと思います。 (3)(PORT B AND 03H) - 03Hを実行し、ZEROフラグの変化をみてループすればできます。 ご参考になれば幸いです。

ZZR1200
質問者

お礼

ありがとうございます。参考にさせていただきます。

関連するQ&A