非常に初歩的な質問があります。しかし、何を試しても、これをうまく実装できませんでした。
次のハードウェア構成で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;
思いますが、どれだけ見ても、私には完全に問題ないように見えます。私のコードの何が問題になっていますか?
どんな助けでもありがたいです。