2

我有一个非常基本的问题。但是,无论我尝试过什么,我都无法成功实现这一点。

我有一个移位寄存器(74LS164)连接到 PIC18F2550,硬件配置如下:

// 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,当您发送第二个位时,前一个 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;
    }
}

上面的代码没有按我的意愿运行。当我运行它时,所有的 LED 都会亮起,就好像我已经加载0b11111111ucRegister变量中一样。

但是,以下一个效果很好:

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;
    }

如果我的第一个或第二个示例有效,那么听起来编译器没有处理常量值或在原始代码中正确比较。

于 2012-02-06T17:59:01.390 回答
0

可能只是一个错字,但您的参数是 unRegister 而不是 ucRegister。ucRegister 是否有可能是 0b11111111 的全局变量?

于 2012-02-07T08:10:16.567 回答