GPIO值为Byte

时间:2015-05-19 14:33:06

标签: byte microcontroller gpio

我想制作一个简单的转换器。 这在理论上很简单,但我无法弄清楚如何实现它。 所以,这就是我想做的事情: 首先,我将从微控制器读取我的GPIO值,数量为8。 现在,我有8个字节的GPIO值,从GPIO 1到GPIO 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

不幸的是,它没有用。 我是以错误的方式做到的吗? 任何建议将不胜感激。

1 个答案:

答案 0 :(得分: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;,您将b0定义为类型unsigned 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