....
gracias por responderme, podrías enseñarme a entender...
#byte porta = getenv("SFR:PORTA")
#byte portc = getenv("SFR:PORTC") devolverían la dirección correspondiente a los puertos?
Correcto, es cómodo si se trata de una rutina que vas a compilar para diferentes micros.
struct {int8 l:6 , h:2 ;} valor ; creo 2 variables tipo int "l" y otra "h"
No exactamente, la variable "valor" está formada por valor.l (los bits 0..5) y valor.h (los bits 6..7)
Por ejemplo haciendo valor = 0x85
en valor.l vas a leer 0x05 ;
y en valor.h vas a leer 0x02 ;
Ojo, de esta manera la usé en el ejemplo, pero struct es mucho mas potente.
#define output_AC(x) {porta=x ; \ como se leería de acá hacia abajo?
portc&=3 ; \ aqui seria hacer and (&)con puerto c para que no modifique los otros bits del puerto?
portc|=x.h ;}
Es un macro con argumentos (puede tener mas de uno), lo que hace es reemplazar el texto donde aparezca
x.
La barra invertida (
\) indica que el macro sigue en la línea siguiente.
Ahora veo que me olvidé una negación (
~)

, porque la idea es modificar C0 y C1 sin alterar el resto. Eso debió ser:
#define output_AC(x) {porta=x ; \
portc&=~3 ; \
portc|=x.h ;}
Que es lo mismo que escribir
#define output_AC(x) {porta=x ; portc&=~3 ; portc|=x.h ;}
Finalmente , output_AC(valor) ;
Se expande como
porta=valor ;
portc&=~3 ;
portc|=valor.h ;
"valor" y "x" son variables? de ser así hay que declararlas como int globales?
Para el macro "valor" es un texto que debe reemplazar donde le aparezca "x" .
Lo que hace el macro es insertar un texto dentro del fuente, obviamente con funciones que alegran la vida.