2017-10-13 7 views
0

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のようなビット操作コマンドを使用して立ち往生ですか?

答えて

1

まず、次の点を追加します。 SETBおよびCLR命令を含むアプローチは、実行するためにはより多くのマシンサイクルを必要とし、場合によっては実行不能(すなわち、クロック生成、同期問題)する可能性がある。

8051ポートは、現代のMCUに比べてかなり原始的です。 'ポート'にはピン状態を格納するラッチがあり、そのラッチは出力を調整しようとします。これは必ずしもポートが所望の状態にあることを意味するものではない。例えば、外部でローに駆動されると、ラッチはハイになる可能性がありますが、ポートはローになります。これはポートを入力として設定する方法です。

データをポートに移動すると、ラッチに書き込みます。ポートからレジスタに移動すると、ラッチの状態に関係なく実際の状態が読み込まれます。リード・モディファイ・ライト・オペレーションは、特にラッチを読んで、所望の動作を実行し、ラッチに書き戻すので、例外である。したがって、「これは正しいですか?:」というシナリオは正しいものです。

代わりに、MOV A、P2を実行してから、P2を実行すると、#F8h「これはもっと正しいのですか?」が正しいでしょう。

この結果、論理演算を使用して、この問題で指定されたケースのポートを変更することができます。

+0

R7の上位ニブルにカスタム値を入れ、ポート2の下位ニブルを変更しないままポート2の実際の出力の上位ニブルにしたい場合は、このコーディング方法を使用する方が良いでしょう。MOV R7、#70h MOV A、P2 ANL A、#0Fh ORL A、R7 MOV P2、A'を含む。正しい軌道にいるのですか? – Mike

関連する問題