Как бы вы использовали оператор switch с комбинацией из 3 бинарных входов? (С) - PullRequest
0 голосов
/ 25 октября 2019

Я кодирую микроконтроллер PIC18F252 на C. Программа должна принимать 3 отдельных входа от датчиков (сначала пройти через АЦП), а затем, в зависимости от комбинации этих 3 входов, будет выбирать выход из оператора switch. Так, например, если каждый датчик выдает 0, я бы хотел выбрать случай «000» и выполнить его инструкции. Если средний датчик выдает 1, я хочу регистр 010 и т. Д.

Я пытался сделать это, используя массивы или строки для хранения 3-значного значения, но я не могу использоватьПереключите оператор правильно, чтобы сравнить ввод с регистром.

Кажется, что оператор if / else был бы более упрощенным способом сделать это, но мне нужно использовать switch.

Так что кто-нибудь может сказать мне, если возможно сравнить массив или строкус делами, или есть ли другой способ сделать это? Единственный другой способ, которым я могу придумать, - это назначить входную комбинацию переменной слова, но для этого потребуется собственный переключатель или оператор if / else.

1 Ответ

2 голосов
/ 25 октября 2019

Если входные значения являются цифровыми значениями (0 или 1), вы можете объединить биты в одно число путем сдвига битов и побитового ИЛИ.

Пример:

int input1 = 0;
int input2 = 1;
int input3 = 1;
int combined;

/* assuming the values can be 0 or 1 only */
combined = input1 | ( input2 << 1 ) | ( input3 << 2 );
/* or with any non-zero value as TRUE */
combined = (input1 ? 1 << 0 : 0) | (input2 ? 1 << 1 : 0) | ( input3 ? 1 << 2 : 0);

switch(combined)
{
case 0x0: // or GCC extension 0xb000
case 0x1: // or GCC extension 0xb001
case 0x2: // or GCC extension 0xb010
case 0x3: // or GCC extension 0xb011
/* ... */
}

...