2

これは私の最初の投稿ですので、私が間違ったことを許してください:) これが私の状況です。MPLAB と HI-Tech C コンパイラを使用して、PIC16F876 の簡単なデータ転送操作を作成しています。

データと呼ばれる文字があります。データのビットにアクセスし、MSB から始めてポート B0 に送信したいと考えていました。

アセンブリでは、次のようにします。

PORTB,0 = data,7 // MSB を取得してポート B0 に配置するには、すべてのビットに対してこれを行います。

ただし、C では、これはより複雑なようです。私はいくつかの調査を行い、機能する機能を見つけました:

getBit(char data, int bitNumber)
{
     return (data & (1 << bitNumber-1)) != 0;
}

それから私はただ使用します:

PORTBbits.RB0 = getBit(data,7);

これは問題ありませんが、面倒で時間がかかるようです。追加の関数が必要な理由がわかりません...私の質問は、レジスタのビットにアクセスする簡単な方法はありませんか? お気に入り:

PORTBbits.RB0 = data,7

とにかくコンパイラがそれをアセンブリに変換するので、なぜそこにないのか理解できませんか??!!!!

前もって感謝します。よろしく、ティム。

4

4 に答える 4

12

探しているものを達成する別の方法は、次のようなものです。

PORTBbits.RB0 = (data >> 7) & 1;

またはより一般的に:

#define BIT(x,n) (((x) >> (n)) & 1)
PORTBbits.RB0 = BIT(data, 7);
于 2013-04-26T15:24:21.250 に答える
3

このような関数を使用する場合、スタックに 2 つの値をプッシュし、ジャンプを実行し、操作を実行し、スタックをポップして値を返すことを意味することに注意してください。

コードをインライン化するMACROを介して回避できます

#define GETBIT(x,n) ((x >> (n-1)) & 1)

オプション #2 は、マゾヒズムに屈し、サイクルを節約するために叫ぶ場合のインライン ASM の使用です。〜笑顔〜

于 2013-04-26T15:21:26.307 に答える
2

ビットのみが必要な場合は、 で入手できます( data & (1 << (bitNumber-1)) ) != 0。または、マクロを定義して読みやすくすることもできます。

#define getBit(x,y) ((x) & (1 << ((y)-1))) != 0

そしてそれをgetBit(data,bitNumber)

マクロは関数のオーバーヘッドを取り除きます。しかし、希望どおりにビット値を与える演算子はありません。

于 2013-04-26T15:23:04.943 に答える
0

一部の (ほとんどの?) マイクロには、ピン用に複数のレジスタがあります。何をしようとしているのかわかっている場合は、(たとえば) SET または CLEAR ピン レジスタに書き込むと、読み取り-変更-書き込み/マスキングのカーファッフル全体が保存されます。

ご存知かもしれませんが、わかりやすくするために、SET/CLEAR レジスタは、書き込まれたビットが 1 の場合にのみピンを設定またはクリアすることによって機能し、0 が書き込まれた場合、ピンの状態は変更されません。つまり、ハードウェアが作業を行っていることを意味します。あなた。ポートのピン 3 を設定するには、port_SET レジスタに 0x04 を書き込むだけです。クリアするには、port_CLEAR レジスタに 0x04 を書き込みます。

これらを常に使用できるとは限りませんが、可能であれば多くの CPU サイクルを削減できます。

于 2013-05-02T09:22:59.327 に答える