Мы не знаем типы используемых переменных.Код может выглядеть примерно так:
#include <assert.h>
// Indexas valid are from 0 to 8, some 9
#define IDX_MAX 9
typedef /* insert the type of SELx_GPIO_Port here */ gpio_port_type;
static gpio_port_type get_gpio_port_from_idx(size_t idx) {
const gpio_port_type ports[] = {
SEL0_GPIO_Port,
SEL1_GPIO_Port,
SEL2_GPIO_Port,
SEL3_GPIO_Port,
SEL4_GPIO_Port,
SEL5_GPIO_Port,
SEL6_GPIO_Port,
SEL7_GPIO_Port,
SEL8_GPIO_Port,
};
static_assert(IDX_MAX == sizeof(ports)/sizeof(*ports));
assert(idx < sizeof(ports)/sizeof(*ports));
return ports[idx];
}
typedef /* insert the type of SELx_Pin here */ pin_type ;
static pin_type get_sel_pin_from_idx(size_t idx) {
const pin_type pins[] = {
SEL0_Pin,
SEL1_Pin,
SEL2_Pin,
SEL3_Pin,
SEL4_Pin,
SEL5_Pin,
SEL6_Pin,
SEL7_Pin,
SEL8_Pin,
};
static_assert(IDX_MAX == sizeof(pins)/sizeof(*pins));
assert(idx < sizeof(pins)/sizeof(*pins));
return pins[idx];
}
void set_out(int out) {
for (size_t i = 0; i < IDX_MAX; ++i) {
(
(out & (1 << i)) ? GPIO_SetBits : GPIO_ResetBits
)(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
}
}
Первые две функции отображают статический индекс в диапазоне от 0 до 8 на переменные SELx_GPIO_Port и SELx_Pin соответственно.После этого функция set_out
проверяет каждый бит во входной переменной int out
и вызывает GPIO_SetBits
или GPIO_ResetBits
в зависимости от того, установлен бит или не установлен.Я использовал троичный оператор, если функция имела бы другой прототип или была макросом, вы могли бы просто:
void set_out(int out) {
for (size_t i = 0; i < IDX_MAX; ++i) {
if (out & (1 << i)) {
GPIO_SetBits(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
} else {
GPIO_ResetBits(get_gpio_port_from_idx(i), get_gpio_pin_from_idx(i));
}
}
}