GPIO 值到字节

GPIO value to Byte

我想做一个简单的转换器。 理论上很简单,但我不知道如何实现它。 所以,这就是我想做的: 首先,我将从微控制器读取我的 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

不幸的是,它不起作用。 我做错了吗? 任何建议将不胜感激。

实现此目的的一个好方法是结合使用 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