2014-04-02 40 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