Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用参数更改4位?_C - Fatal编程技术网

C 如何使用参数更改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,则在和之后,

我有一个8位参数,我需要将该参数的前4位数字发送到我的端口C。如何在不更改端口C的最后4位的情况下执行此操作?我的第一个原始想法是只做parameter=PORTC,但是我改变了所有的8位,而不仅仅是4位。

如果“前四位”是指较低的四位,那么

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);