В.Н.> а в это выражение никак ведь не вписать, что если нажалась кнопка, то выходим вне зависимости от состояния флагов? Пока сделал выход через if и break.
Конечно, вписать — разбей условия выполнения цикла на мелкие — одно (композитное с флагами уже есть). Т.е. выполняем цикл, пока (хотя бы один флаг ноль) и (кнопка не нажата).
code text
do
//
while ( ( Flag_1 == 0 || Flag_2 == 0 || Flag_3 == 0 ) )
&& digitalRead( Pin ) == 0 );
PS Посмотри правила преобразования
де Моргана и делай так:
1. Если тебе легче мыслить в условиях выхода из цикла (т.е. истина для выхода из цикла), то сформулируй их в таком виде, повесь отрицание перед всем выражением[tt] !(твоё выражение)[tt] — заметь скобки. А после, если надо упростить, то используй де Моргана.
Например, у тебя было:
code text
// выйти, когда все флаги 1
Flag_1 == 1 && Flag_2 == 1 && Flag_3 == 1
В соотвествии с правилом 1 получаем для продолжения:
code text
// выйти, когда все флаги 1
!( Flag_1 == 1 && Flag_2 == 1 && Flag_3 == 1 )
Используя де Моргана раскрываем скобки:
code text
// выйти, когда все флаги 1
Flag_1 != 1 || Flag_2 != 1 || Flag_3 != 1
Учитывая, что Flag_N != 1 есть Flag_N == 0 для бинарного случая, получаем решение из сообщения выше. Но это для бинарных случаев. Если у тебя флаги не бинарные (иногда их называют состояния (states)), то там уже начинает работать не совсем булева алгебра, а обычная алгебра работы над множествами, т.е. отрицаение будет дополнение множества (или всё множество без тех элементов, которые мы выкидываем-отрицаем). На самом деле, если присмотреться к булевой алгебре, то там в множестве всегда два элемента, поэтому дополнение одного элемента есть всегда другой элемент.