F_CPU
просто позволяет макросу _delay_ms()
вычислять, сколько циклов занимает каждая секунда. Вам это нужно, потому что макросы задержки очень просты и не знают, какой прескалер установлен в момент их вызова во время выполнения.
Так что, если вы собираетесь менять прескалер на лету, вы можете сделать две разные функции задержки, чтобы вы могли ясно показать в своем коде, что происходит.
Это может выглядеть как ...
#define F_CPU 1000000 // We start with 8x prescaler on 8Mhz clock
#define delay_ms_1Mhz(x) (_delay_ms(x)) // Delay when prescaller set to 8x
#define delay_ms_8Mhz(x) (_delay_ms(x*8)) // Delay when prescaller set to 1x so we need to burn 8x as many cycles
... и затем решите, какой вызов вызывать, в зависимости от того, какой прескалер установлен в данный момент в вашем коде.