struct PortBreg {
unsigned int B0 :1;
unsigned int B1 :1;
unsigned int B2 :1;
unsigned int B3 :1;
unsigned int B4 :1;
unsigned int B5 :1;
unsigned int B6 :1;
unsigned int B7 :1;
};
#define Breg (*(volatile struct PortBreg *)(0x38)),
如果我想从端口B位B3读取值并将值写入端口B位B2,我可以这样做吗
int i=Breg.B3; //to read
Breg.B2=i; //to write ?
答案 0 :(得分:1)
这可能取决于端口是否可读写,但对于普通变量,此代码有效:将B3复制到B2。请与您的类型保持一致,int i
不是unsigned int i
。另请注意,我按照通常的顺序打印每个成员,但实际端口读取的结构定义可能需要反转,因此B7是第一个。
#include <stdio.h>
struct PortBreg {
unsigned int B0 :1;
unsigned int B1 :1;
unsigned int B2 :1;
unsigned int B3 :1;
unsigned int B4 :1;
unsigned int B5 :1;
unsigned int B6 :1;
unsigned int B7 :1;
};
void show(struct PortBreg Qreg)
// bit order MSB -> LSB
{
printf("%u%u%u%u%u%u%u%u\n",
Qreg.B7, Qreg.B6, Qreg.B5, Qreg.B4, Qreg.B3, Qreg.B2, Qreg.B1, Qreg.B0);
}
int main(void)
{
struct PortBreg Breg = {0, 0, 0, 1,};
unsigned i;
show(Breg);
i = Breg.B3;
Breg.B2 = i;
show(Breg);
return 0;
}
节目输出:
00001000 00001100
答案 1 :(得分:0)
并非总是如此。如果端口是存储器映射的,那么从C读取和写入正确位的简单操作可能足以触发导线上的信号。但你可能不得不做其他事情。通常你必须禁用中断。读取通常也会清除端口,通常你需要测试一下是否有数据,然后读取并清除。
所以你需要看看硬件文档。从根本上说,端口是通过写入位来控制的,就好像它们是普通的存储器一样。