8051ポートのいくつかのビットを一度に変更する簡単な方法があるかどうかを調べようとしています。一度にいくつかのビットを変更します - 8051ポート
私はジレンマをより具体的なスタイルで再説明します。
私のアプリケーションでは、2つの機能のためにポート2が分割されています。 FAとFBと呼んでみましょう。
FAは、下位3ビットの出力値に依存し、FBは残りの5ビットに依存しますが、I/Oにすることができます。
FBの1ビットはクロックを制御する出力ビットなので、FAを変更するときはFBの部分を変更しません。その逆も同様です。コマンドの
次の種類は私のために動作しません:そのようなコマンドはおそらく間違って一度に一つの機能をトリガー両方の機能の値が上書きされますので、
mov P2,#07h
mov P2,#80h
です。
私は、次のようなもので逃げることができ:私はこれらのコマンドは、残りのビットに影響を与えることなく、個々のビットを一つずつ設定することができますが、私はより多くを設定してみたいのですが知っているので
setb P2.7
setb P2.6
clr P2.5
clr P2.4
setb P2.3
setb P2.2
clr P2.1
clr P2.0
一度に1ビット。
私はMOVがポートピンの論理演算と異なっていることをインターネットに伝えているので、ここで推測してみようと思います:
FBについてすべての論理ハイを出力したいとFAのために、その最低ビット= 1を除くすべての論理ローを出力したいとします。私は一度に一つの関数で操作したい。
私はそれが一度にすべてを設定しますので、これは動作しません知っている:
mov P2, #0F9h
を何とか、私はポートでロジックを使用して動作するかもしれないと思うが、私は私の考えが正しいかどうかを知りたいです。以下の2つのケースでは、P2がmovコマンドを介して#0A1hに設定された値を持ち、P2のピンがすべてグランドに接続されているとします。
は
anl P2,#F8h ;value of P2 = #0A1h AND #F8h = #0A0h
orl P2,#F9h ;value of P2 = #0A0h OR #F9h = #0F9h
anl P2,#F0h ;value of P2 = #0F9h AND #F0h = #0F0h
?:この正しいか値P2があれば生じるであろうthatsのために、私は#00Hで方程式を開始した2番目の例では、この以上?:正しい
anl P2,#F8h ;value of P2 = #00h AND #F8h = #00h
orl P2,#F9h ;value of P2 = #00h OR #F9h = #0F9h
anl P2,#F0h ;value of P2 = #00h AND #F0h = #00h
であるI MOV A、P2を使用してAの値を求めていましたが、その値がanlおよびorl計算で使用されるかどうかはわかりません。
全体的には、私の質問は、残りのビットを邪魔することなくポートの特定のビットだけを変更するのにanlとorlを使用できますか?または私はsetbとclrのようなビット操作コマンドを使用して立ち往生ですか?
R7の上位ニブルにカスタム値を入れ、ポート2の下位ニブルを変更しないままポート2の実際の出力の上位ニブルにしたい場合は、このコーディング方法を使用する方が良いでしょう。MOV R7、#70h MOV A、P2 ANL A、#0Fh ORL A、R7 MOV P2、A'を含む。正しい軌道にいるのですか? – Mike