【发布时间】:2013-04-20 19:53:42
【问题描述】:
这是我在这里的第一篇文章,所以请原谅我做错了什么:) 这是我的情况。我正在使用 MPLAB 和 HI-Tech C 编译器为 PIC16F876 编写一个简单的数据传输操作。
我有一个名为 data 的字符,我想访问 data 中的位并将它们发送到 portB0,从 MSB 开始。
在汇编中我会简单地做:
PORTB,0 = data,7 // 获取 MSB 并将其放在端口 B0 上,然后我将对所有位执行此操作。
但是在 C 中这似乎更复杂。我做了一些研究,发现了一个有效的功能:
getBit(char data, int bitNumber)
{
return (data & (1 << bitNumber-1)) != 0;
}
那我就用:
PORTBbits.RB0 = getBit(data,7);
这没关系,但是很乱而且似乎需要更长的时间,我不知道为什么我需要一个额外的功能......所以我的问题是:没有简单的方法来访问寄存器中的位吗?喜欢:
PORTBbits.RB0 = data,7
我不明白为什么编译器无论如何都不会将其转换为汇编??!!!!
提前致谢。 问候,蒂姆。
【问题讨论】:
-
你可以在结构体中使用位域。但这可能会更糟。
-
您好,感谢您的快速回复,Elazar,我确实尝试过,但是看到我想要的,最后,为数据发送编写一个循环这行不通,因为我不能循环一个名字。 Amigable:我看过那些(和其他)主题,我读到的那些似乎是针对 C 语言的。此外,问题的一部分是为什么没有一个简单的解决方案,因为该语言基于 ASM。
-
大多数 C 编译器都允许您使用内联汇编。对于您的多位操作,您可能需要重复移位,并从 MSB 或 LSB 获取输出(取决于您想要的顺序)。