我想制作一个简单的转换器。 这在理论上很简单,但我无法弄清楚如何实现它。 所以,这就是我想做的事情: 首先,我将从微控制器读取我的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
不幸的是,它没有用。 我是以错误的方式做到的吗? 任何建议将不胜感激。
答案 0 :(得分:0)
实现这一目标的一个好方法是使用struct
和union
的组合。使用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
的大小相同。现在data
和raw
将使用相同的内存,但您可以通过任一变量访问内存。这样,您可以将原始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