2015-05-19 69 views
0

我想做一個簡單的轉換器。 這在理論上很簡單,但我無法弄清楚如何實現它。 所以,這裏是我想做的事: 首先,我會從微控制器讀取我的GPIO值,隨着8 數量現在,我有GPIO值從GPIO 1至8 GPIOGPIO值到字節

但8個字節,我怎麼能把它們轉換成一個字節?

像這樣:11111000(8字節 - 之前),變成11111000/0xFA(1字節 - 之後)? 我嘗試用換擋,這樣的事情:

a = GPIO1, a = a << 7 | 
b = GPIO2, b = b << 6 | 
. 
. 
h = GPIO8 

uint8_t i = a + b + c + d + e + f + g + h 

不幸的是,它不工作。 我做錯了嗎? 任何建議將不勝感激。

+0

請定義'GPIO'。這是有點在你的外設端口,還是8位實體。如果您有8個寬度爲8位的GPIO,您不能將其摺疊爲一個字節而不丟失數據。 – harper

+1

更好地發佈您用來閱讀輸入的代碼,而不是試圖描述它們。 –

回答

0

實現此目的的一個好方法是使用structunion的組合。通過union,您可以通過兩種不同的方式訪問相同的內存。例如:

union gpio_type { 
    uint8_t data; 
    struct raw { 
     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; 
    }; 
}; 

隨着unsigned int b0 :1;的結構裏面,你定義b0unsigned int類型,但只使用1位。如果您對所有8個GPIO位b0 ... b7執行此操作,則您的總大小爲8位,與uint8_t的大小相同。現在,dataraw將使用相同的內存,但可以通過任一變量訪問內存。利用這一點,您可以將原始GPIO值寫入結構的位中,稍後訪問整個數據字節。

例如,讓我們創建創建這個工會和訪問無論是uint8_t數據,或單位的實例:

union gpio_type my_gpio_reg; 
my_gpio_reg.data = 0xA0;  % Set whole reg to 0xA0 
my_gpio_reg.raw.b0 = 1;  % Set the last bit to 1 ==> 0xA1