Пояснение относительно таблицы переходов и состояний ДКА. А то "некоторые" ошибочно сравнили её с таблицей названий пунктов менюшки из ЧМИ

Это, как у нас говорят, "две большие разницы".
Так вот. Прямоугольная двухмерная таблица переходов и состояний конечного автомата:
Код: Выделить всё
const uint8_t fsm_table[][8] = {
/* s | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 */
/* s0*/{0, 1, 2, 0, 3, 0, 0, 0},
/* s1*/{4, 1, 1, 1, 1, 1, 1, 1},
/* s2*/{5, 2, 2, 2, 2, 2, 2, 2},
/* s3*/{6, 3, 3, 3, 3, 3, 3, 3},
/* s4*/{4, 7, 2, 4, 3, 4, 4, 4},
/* s5*/{5, 1, 7, 5, 3, 5, 5, 5},
/* s6*/{6, 1, 2, 6, 7, 6, 6, 6},
/* s7*/{0, 7, 7, 7, 7, 7, 7, 7} };
В таблице вертикальные столбцы означают все варианты входных значений КА, называемые "входной алфавит КА". Строки по горизонтали представляют номера всех возможных состояний КА, в которых он может находиться. В ячейках таблицы помещены номера состояния, в которое перейдет КА из текущего состояния (по строке) в зависимости от входного значения (по столбцу).
Пусть начальное состояние КА равно 0, активна строчка s0. На вход КА поступает входное значение, например, 2. На пересечении строки 0 и столбца 2 записано 2. Значит, следующее состояние КА будет = 2 и активная строчка переключится на строку s2. Это реализуется вот таким кодом:
Код: Выделить всё
uint8_t fsm_s = 0; // переменная текущего номера состояния КА
/* переход на новое состояние через входное значение */
fsm_s = fsm_table[fsm_s][input_value];
то есть, новое состояние КА в переменной fsm_s будет запомнено. И в следующем цикле активной строчкой будет уже s2. Пусть на вход поступит значение, например 0. По таблице на пересечении столбца 0 и строки s2 находится следующее состояние 5, в которое КА перейдет, и активной станет строка s5. Ну и так далее.
Теперь надо связать эти состояния со значениями на выходе. Это называется "выходной алфавит КА". Каждому состоянию s присваивается некое число, которое нужно получить на выходе, в рассматриваемом случае - номер режима работы.
Код: Выделить всё
/* таблица выходного алфавита КА */
const int8_t fsm_out[] =
/* s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 */
{-1, 1, 2, 3, -1, -1, -1, 0};
ну и соответственно, из таблицы значения извлекаются так:
Ну вот и всё!

Программно очень даже незамудренно делается. Основная сложность, это составить таблицу состояний и переходов. Помочь в этом может составление графа переходов (ранее показывал) - кружочками обозначаются состояния КА, а стрелочки между ними показывают возможные переходы при каждом входном значении (показываются над стрелочками). Вот так:
Да, это далеко не новый алгоритм, он стар, как и сама математика. Глупо предъявлять претензии например теореме Пифагора за то, что она очень старая. Так же и здесь. Тем более, что запись КА на языке математических множеств - охренеть какая сумасшедше-выглядящая. Ну да, это ж высшая математика. Скажите спасибо, что еще не тензоры, хехе.
Так что, показанная табличка не имеет никакого отношения к таблицам с названиями пунктов меню, показанным тут ранее нашим "главным учителем".