2

非常に初歩的な質問があります。しかし、何を試しても、これをうまく実装できませんでした。

次のハードウェア構成でPIC18F2550に接続されたシフトレジスタ(74LS164 )があります。

// Data pin
#define SCLCD_DATA          LATBbits.LATB7
#define SCLCD_DATA_TRIS     TRISBbits.TRISB7

// Clock pin
#define SCLCD_CLOCK         LATBbits.LATB6
#define SCLCD_CLOCK_TRIS    TRISBbits.TRISB6

LEDは74LS164の出力ピンに接続され、そのステータスを表示します。として宣言された8ビット変数がありますunsigned char。この変数のビットをシフトレジスタに送信したいと思います。シフトレジスタには、出力の名前がQ0〜Q7の内部フリップフロップがあります。最初に送信されたビットはQ0にロードされ、2番目のビットを送信すると、前のQ0がQ1にシフトし、新しく送信されたビットがQ0に到達します。これは、後続のビットを送信するときに続きます。送信が完了すると、変数のLSBはシフトレジスタのQ0にあると想定され、MSBはQ7にあります。

私のコードは次のようなものです(言語はC18です):

void SCLCD_SendSerialBits(unsigned char unRegister)
{
    // ucRegister is always passed as 0b10101010 for test
    for (i=0; i<8; i++)
    {
        SCLCD_CLOCK = 0;
        SCLCD_DATA = ((ucRegister & 0b10000000) == 0b10000000) ? 1 : 0;
        ucRegister = ucRegister << 1;
        SCLCD_CLOCK = 1;
    }
}

上記のコードは、私が望むように実行されません。実行すると、変数にロード0b11111111したかのように、すべてのLEDが点灯します。ucRegister

ただし、次の1つは非常にうまく機能します。

void SCLCD_SendSerialBits(void)
{
    SCLCD_CLOCK = 0;    SCLCD_DATA = 1;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 0;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 1;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 0;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 1;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 0;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 1;     SCLCD_CLOCK = 1;
    SCLCD_CLOCK = 0;    SCLCD_DATA = 0;     SCLCD_CLOCK = 1;
}

私のコードの何が問題になっていますか?エラーはライン上にある可能性が最も高いとSCLCD_DATA = ((ucRegister & 0b10000000) == 0b10000000) ? 1 : 0;思いますが、どれだけ見ても、私には完全に問題ないように見えます。私のコードの何が問題になっていますか?

どんな助けでもありがたいです。

4

2 に答える 2

2

コードは機能するはずです。私はそれをより読みやすく効率的にするためにこのように書きます(あなたのシステムがバレルシフタを持っていると仮定して):

for (i=7; i>=0; i--)
{
    SCLCD_CLOCK = 0;
    SCLCD_DATA = ((ucRegister >> i) & 1);
    SCLCD_CLOCK = 1;
}

バレルシフタのないシステムの場合、コードのバリエーション

unsigned char ucMask = 0x80;

    for (i=0; i<8; i++)
    {
        SCLCD_CLOCK = 0;
        SCLCD_DATA = (ucRegister & ucMask) ? 1:0;
        ucMask >>= 1;
        SCLCD_CLOCK = 1;
    }

私の最初または2番目の例が機能する場合は、コンパイラが定数値を処理していないか、元のコードで正しく比較していないようです。

于 2012-02-06T17:59:01.390 に答える
0

タイプミスの可能性がありますが、パラメータはucRegisterではなくunRegisterです。ucRegisterが0b11111111であるグローバルである可能性はありますか?

于 2012-02-07T08:10:16.567 に答える