Lo probe y esto me funciono a la perfeccion:
hey there
here is how to do it in XC8
union
{
unsigned char _OUTPUTS_LEDS;
struct
{
unsigned LED_RC0 : 1;
unsigned LED_RC1 : 1;
unsigned LED_RC2 : 1;
unsigned LED_RC3 : 1;
unsigned LED_RC4 : 1;
unsigned LED_RC5 : 1;
} OUTPUTS_LEDS;
} PORTC_LEDS;
and then in your main loop, to control the whole Byte
PORTC_LEDS . _OUTPUTS_LEDS = 0xF0;
and to control evrey bit
PORTC_LEDS . OUTPUTS_LEDS . LED_RC0 = 0x01;
PORTC_LEDS . OUTPUTS_LEDS . LED_RC5 = 0x00;
Tambien lo hice funcionar de esta manera (pongo el codigo completo):
#include <16f628a.h>
#reserve 0x20:0x23
#FUSES NOWDT //No Watch Dog Timer
#FUSES INTRC_IO //Internal RC Osc, no CLKOUT
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOBROWNOUT //No brownout reset
#FUSES MCLR //Master Clear pin enabled
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES RESERVED //Used to set the reserved FUSE bits
#use delay(clock=4000000)
#byte VAR=0x20
#bit VAR_B0=VAR.0
#bit VAR_B1=VAR.1
#bit VAR_B2=VAR.2
De esta manera manejo los bits de la variable VAR, previamente declarados y reservando espacio en memoria con la directiva
#reserve.
Lo bueno de la primer opcion (la de rotting79) es que ocupa en memoria solo lo necesario, pero si tenemos muchas variables se hace medio tedioso hacer ese codigo por CADA variable.
La segunda opcion es mas practica y simple que la primera, pero por cada variable seguimos usando como minimo 1 byte (cuando quizas con 3 bits nos sobre).
Lo que no se es cual de las dos consume menos recursos del micro y, por ende, es mas optima. Ustedes que opinan?