我有一个非常基本的问题。然而,无论我怎么尝试,我都不能成功地实现这一点。
我有一个移位寄存器(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.TRISB6LED连接到74LS164的输出引脚,以查看其状态。我有一个声明为unsigned char的8位变量。我想把这个变量的位发送到移位寄存器。移位寄存器具有内部触发器,其输出命名为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;行上,但无论我怎么看它,对我来说它看起来都是完全正常的。我的代码出了什么问题?
任何帮助都将不胜感激。
发布于 2012-02-07 01:59:01
您的代码看起来应该可以工作。我这样写是为了更具可读性和效率(假设你的系统有一个桶式移位器):
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-07 16:10:17
可能只是一个打字错误,但您的参数是unRegister而不是ucRegister。有没有可能ucRegister是一个全局变量,是0b11111111?
https://stackoverflow.com/questions/9153190
复制相似问题