2014-04-02 41 views
-5

我有一个8位参数,我需要从这个参数发送4个第一位数字到我的PORTC。如何在不更改PORTC的最后4位的情况下执行此操作?我的第一个主要想法是做参数= PORTC,但是然后我改变了所有的8位而不仅仅是4位。如何使用参数更改4位?

+1

你会通过编辑原始文章(OP)发布一些代码吗? – octopusgrabbus

回答

0

如果由“前四”你的意思是低四位,然后

PORTC = (parameter & 0x0F) 

我们正在做的上面与二进制值0000 1111这意味着执行bitwise AND操作的高4位会被清除,低4位将被保留(如果1 => 1,如果0 => 0)。所以,如果你的8位参数为xxxx yyyy那么以后,这将是0000 yyyy

如果你指的是高四位,而PORTC需要他们在低4

PORTC = (paramter >> 4) 

这意味着我们left shifting二进制字符串xxxx yyyy下降4个地方,所以你会得到0000 xxxx移交后的操作。

但是,有时您需要维护输出端口上的其他位,因此您需要执行bitwise OR操作以保留现有值。

PORTC |= (parameter & 0x0F) 

PORTC |= (paramter >> 4) 

因此,如果我们正在设置的低4位,则这确保我们不会改变任何的高位比特的,当我们在该端口上输出。

0

您需要先仔细查看您的微处理器文档,看看是否有任何方法可以读取IO端口的输出状态。如果没有,并且读取PORTC只是读取引脚的输入状态,那么通常需要维护一个“输出镜像” - 只是输出数据的一个副本。

然后,你必须做这样的事情:

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 
1

你没有给什么PORTC是,这是非常关键的任何信息。但是对于大多数硬件,您必须首先读取整个端口以获取其值,更改低4位并将更改后的字节写回。假设端口是8位宽,并且“first fuor digits”意思是低4位,那么C是:

char val = read_port_c(); 
write_port_c((val & ~0xf) | my_4_bit_value); 
+0

您需要val & 0xf0; – nos

+0

@nos正如我所说的,他没有说出“前四位数字”是什么。如果他的意思是位0-3,那么我的代码是正确的。如果他的意思是比特4-7,那么你就是。 OP将不得不弄清楚。 – Gene

+0

@Gene否,nos是正确的,你的描述与你的代码冲突。如果你想保留高位,那么mask必须是'0xF0'。 – user694733