C 如何使用参数更改4位?
我有一个8位参数,我需要将该参数的前4位数字发送到我的端口C。如何在不更改端口C的最后4位的情况下执行此操作?我的第一个原始想法是只做parameter=PORTC,但是我改变了所有的8位,而不仅仅是4位。如果“前四位”是指较低的四位,那么C 如何使用参数更改4位?,c,C,我有一个8位参数,我需要将该参数的前4位数字发送到我的端口C。如何在不更改端口C的最后4位的情况下执行此操作?我的第一个原始想法是只做parameter=PORTC,但是我改变了所有的8位,而不仅仅是4位。如果“前四位”是指较低的四位,那么 PORTC = (parameter & 0x0F) 我们在上面所做的是用二进制值0000 1111执行一个操作,这意味着上面的4位将被清除,下面的4位将被保留(如果1=>1,如果0=>0)。因此,如果您的8位参数是xxxx-yyyy,则在和之后,
PORTC = (parameter & 0x0F)
我们在上面所做的是用二进制值0000 1111
执行一个操作,这意味着上面的4位将被清除,下面的4位将被保留(如果1=>1,如果0=>0)。因此,如果您的8位参数是xxxx-yyyy
,则在和之后,它将是0000-yyy
如果您指的是前四位,而PORTC需要它们位于下四位
PORTC = (paramter >> 4)
这意味着我们是向下4位的二进制字符串xxxx yyy
,因此在移位操作后您将得到0000 xxxx
但是,有时需要在输出端口上维护其他位,因此需要执行操作以保留现有值
PORTC |= (parameter & 0x0F)
或
因此,如果我们设置低4位,那么这可以确保在端口上输出时不会更改任何高4位。您需要首先详细查看微处理器文档,看看是否有任何方法可以读取IO端口的输出状态。如果没有,并且读取端口C只是读取管脚的输入状态,那么您通常需要维护一个“输出镜像”——只是输出数据的一个副本 然后你必须做这样的事情:
static unsigned char outputMirrorC; /
...
...
// Set the bottom four bits of the port
outputMirrorC &= 0xf0; // Just keep the top four bits of the mirror
outputMirrorC |= newData & 0x0f; // Take the bottom four bits from your new data
PORTC = outputMirrorC; // Write the data to the port
您没有提供任何关于什么是PORTC的信息,这是非常关键的。但对于大多数硬件,您必须首先读取整个端口以获取其值,更改低位4位并将更改后的字节写回。假设端口为8位宽,“第一个或第二个数字”实际上是指低4位,C为:
char val = read_port_c();
write_port_c((val & ~0xf) | my_4_bit_value);
你会通过编辑你原来的帖子(OP)来发布一些代码吗?@nos就像我说的,他没有说“前四位数”是什么。如果他的意思是0-3位,那么我的代码是正确的。如果他指的是比特4-7,那么你就是。OP必须弄清楚。@Gene不,nos是对的,您的描述与代码冲突。如果要保留高位,则掩码必须为
0xF0
@nos谢谢。我很抱歉。省略了~
。打字太快了。
char val = read_port_c();
write_port_c((val & ~0xf) | my_4_bit_value);