95% времени основной цикл занимается тем, что ждет, пока таймер запишет в CalcedWaveLength что-либо ненулевое.

Таймер в CalcedWaveLength записывает посчитанную длительность импульса как только импульс закончится. При этом в качестве единицы измерения используются не микросекунды, а в вызовы таймера. Если на ноге существовала 1 в течении 4х вызовов таймера - в CalcedWaveLength попадет именно 4. И попадет она туда строго после того, как импульс закончится.

Этот веселый цикл for (;CalcedWaveLength==0 со смайликом тупо стоит и ждет пока таймер не запишет CalcedWaveLength. Как только обнаружилось, что в переменной CalcedWaveLength не 0 (таймер записал значение), цикл ожидания завершается и идет программа дальше.

После получения CalcedWaveLength сохраняем ее значение, обнуляем (чтобы не пропустить следующую длительность импульса) и шлем в комп полученные данные.

В новом коде сразу идет анализ полученных данных исходя из известных длительностей.
Код:
	uint8_t cwl=CalcedWaveLength;
	CalcedWaveLength=0;
        if ((cwl>2)&&(cwl<5))
          UART_SendByte('0');
        else
        if ((cwl>=5)&& (cwl<8))
          UART_SendByte('1');
        else
          UART_SendByte('?');