首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PIC C18:从字节读取位

PIC C18:从字节读取位
EN

Stack Overflow用户
提问于 2012-02-06 05:28:36
回答 2查看 3K关注 0票数 2

我有一个非常基本的问题。然而,无论我怎么尝试,我都不能成功地实现这一点。

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

代码语言:javascript
复制
// 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的输出引脚,以查看其状态。我有一个声明为unsigned char的8位变量。我想把这个变量的位发送到移位寄存器。移位寄存器具有内部触发器,其输出命名为Q0-Q7。第一个已发送位加载到Q0中,当您发送第二个位时,前一个Q0将转移到Q1,而新发送的位将转移到Q0,当您发送后续位时,这一过程也会继续进行。发送完成后,变量的LSB应该在移位寄存器的Q0上,MSB在Q7上。

我的代码是这样的(语言是C18):

代码语言:javascript
复制
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变量中一样。

然而,下面的方法运行得很好:

代码语言:javascript
复制
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;行上,但无论我怎么看它,对我来说它看起来都是完全正常的。我的代码出了什么问题?

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-07 01:59:01

您的代码看起来应该可以工作。我这样写是为了更具可读性和效率(假设你的系统有一个桶式移位器):

代码语言:javascript
复制
for (i=7; i>=0; i--)
{
    SCLCD_CLOCK = 0;
    SCLCD_DATA = ((ucRegister >> i) & 1);
    SCLCD_CLOCK = 1;
}

对于没有桶形移位器的系统,代码的一个变体

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-02-07 16:10:17

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9153190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档