Char variable = 0x00;
es un registro de proposito general en el que le podes asignar otros valores, ejemplo podrias hacer en el programa
variable = 0x20;
En cambio el
#define variable 0x00
No es un registro, es solamente una directiva para el compilador. Vos no podrias asignarle un valor a "variable", en realidad no es una variable es una "constante" y el compilador lo reemplaza directamente antes de compilar
Si tene un programa asi:
char x = 0x70 + variable
El compilador lo veria como:
char x = 0x70 + 0x00
Esto es util cuando tenes en varios lugares un mismo valor y si tenes que realizar un cambio seria imposible acordarse todos los lugares donde esta ese valor, entonces definis una constante y usas esa constante en todo el programa, si tenes que cambiarlo solo modificas el #define, por convencion todo lo que se usa con el #define va escrito en mayuscula. Tambien es util para nombrar cosas que seria muy dificil acordarse del valor de cada una ej:
Rutina de inicializacion de un LCD, que funciona para tres tipos.. en la funcion vos escribis initLCD ( LCD_1LINEA ) y funciona
#define LCD_1LINEA 0x03
#define LCD_2LINEAS 0x04
#define LCD_4LINEAS 0x05
switch(aca el char que trae la funcion)
case LCD_1LINEA:
bla bla bla
case LCD_2LINEAS:
bla bla bla
.........
Y no tenes que acordarte... que 0x03 era una el de LCD_1LINEA