我有一个非常基本的问题。但是,无论我尝试过什么,我都无法成功实现这一点。
我有一个移位寄存器(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 都会亮起,就好像我已经加载0b11111111
到ucRegister
变量中一样。
但是,以下一个效果很好:
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;
,但无论我怎么看,它对我来说都很好。我的代码有什么问题?
任何帮助将不胜感激。