У вас не совсем верный алгоритм. Счет числа от 0 до 99 и управление дин. индикацией в общем случае это асинхронные процессы. Точнее даже тут три асинхронных процесса:
- счет,
- вывод на индикацию,
- динамическая индикация.
Синхронизируются асинхронные процессы обычно с помощью буферов.
Считать вы можете с любой требуемой вам скоростью.
Выводить число на индикацию чаще 3 раз в секунду не имеет смысла, т.к. во-первых у человеческого глаза инерционность порядка 0,1с. Во-вторых, мозг человека информацию меняющуюся чаще 3 раз в сек просто не успевает адекватно обрабатывать.
А вот динамическую индикацию нужно обрабатывать не реже 25-30 раз в секунду, чтобы за счет инерционности зрения не видеть мерцания индикаторов.
Так что вам нужно реализовать как минимум два конечных автомата.
Один из них будет переключать символы (катоды в вашем случае) индикатора (через порт D) и выводить из своего собственного буфера значение для соответствующего индикатора в порт C. Эту процедуру рекомендую вызывать из регулярного прерывания, например, от правильным образом настроенного таймера.
Второй КА это просто функция, которая подготавливает данные для отображения на 7-сегментном индикаторе. Проще всего реализовать перевод символов/чисел в значение для индикатора на основе таблицы.
Вместо использования функции __delay_cycles() рекомендую в использовать функцию __delay_ms(), если такая есть. Хотя я лично предпочитаю использовать некое подобие RTC в виде простого счетчика миллисекунд. В том же прерывании от таймера, в котором "крутится" динамическая индикация, я инкрементирую 16-ти или 32-х разрядную переменную. Причем инкремент не на 1, а на число соответствующее периоду таймера в мс. Допустим у меня таймер работает с частотой перезагрузки 100 раз в сек. Следовательно я инкрементирую каждый раз счетчик мс на 10. Чтобы в основном цикле организовать задержку для вывода на индикацию в 0,3 сек достаточно вызвать delay_ms(300). Сама функция delay_ms совершенно простая. Типа такой.
Код
extern volatile unsigned int TimeCntrMS;
void delay_ms(unsigned int value)
{ unsigned int tmp=TimeCntrMS; //запомним текущее значение счетчика мс
while((TimeCntrMS-tmp)<value); //ждем пока счетчик мс не превысит свое запомненное состояние (tmp) плюс значение задержки (value)
}