Т.к. у нас частота встроенного тактового генератора ~16МГц то создадим константу которая отображает величину задержки равную 1мс(также необходимо учитывать то что на исполнение цикла задеркжи уходит примерно 4 такта):
/* constans */#define DELAY_TICS 16000000 / 1000 / 4Создадим функцию в которой будет осуществлятся программная задержка:
/* delay_ms */void delay_ms(unsigned int timeout) { volatile static unsigned int counter; /* calculate delay */ counter = DELAY_TICS * timeout; /* delay loop */ while (counter--);}Внутри функции осуществляется вычисление задержки и собственно сама задержка. Переменная счетчик объявлена как volatile static unsigned int, это сделанно по причине того что компилятор в режиме оптимизации убирает все функции с нулевым телом, т.к. функция становится нулевой.