no caso de constantes cujo valor numerico nao eh importante, a unica forma de garantir que ela vai ter o mesmo valor em todos os sub-sistemas eh usar um unico header com um unico enum definindo elas, daih vc tem uma consistencia que se mantem em todos os outros sub-sistemas a partir desta definicao principal.
jah no caso onde as constantes tem um valor importante, como um endereco de IO, se vc trocar de mcu e o endereco mudar para outro valor, vc tem apenas que mudar o define em um header e automaticamente a alteracao vai se propagar para todos os outros pontos que usam este endereco.
isso permite tambem modularizar suas funcoes: vc cria por exemplo um modulo de controle de LCD e define os pinos em funcao de abstracoes de alto nivel, por exemplo:
#define LCD_RS PTA1
#define LCD_RW PTA2
#define LCD_EN PTA3
se vc mudar de mcu e tiver que mudar de pinos, sua funcao continua perfeita, bastante alterar o define.
assim vc escreve uma vez o codigo e reutiliza eternamente o mesmo codigo!

chipselect escreveu:se quiser enfeitar o código (alguns dizem que é pra deixar mais legível), dá pra fazer assim:
no arquivo header:
#define LOW 0
#define MEDIUM 1
#define HIGH 2
no código ficaria assim
switch (phase) {
case LOW: Lo(); break;
case MEDIUM: Mid(); break;
case HIGH: Hi(); break;
default: Message("Invalid state!");
}
também dá pra fazer assim:
typedef enum {LOW = 0, MEDIUM = 1, HIGH = 2} TPhase;
e no código ficaria praticamente igual, só que a flag phase seria declarada assim:
TPhase phase;
phase = LOW; //ou MEDIUM ou HIGH.
switch(phase)