До конца не разобрал код. Меня смутило то что в счетчике учитывается изменение сигнала
т.е. счетчик покажет 10 уже после 5 импульсов, вот это и смутило. Теперь после Ваших недоумений, еще раз пересмотрел код и понял что вот это OUTi= ~OUTi; будет менять выход на 10 импульсе в обратное состояние. Разница в моем и вашем коде в том, что у Вас он сделан рациональнее, а я не усмотрел алгоритма. Вот и все.
Код
void main(void)
{
// Инициализация
xi= INi; ci=0; OUTi= 0;
//...................
for(;;)
{
// Делитель на 10
if(xi != INi)
{
xi= INi;
if((++ci) == 10) { ci= 0; OUTi= ~OUTi; }
}
//................
}
}