Un altro possibile metodo per controllare a bit (byte) una porta od una variabile con il C18 Microchip (funziona in genere con qualsiasi micro)
Codice:
//define C18 p18f2320.h
//---------------------------------------
extern volatile near unsigned char PORTB;
extern volatile near union
{
struct
{
unsigned RB0:1;
unsigned RB1:1;
unsigned RB2:1;
unsigned RB3:1;
unsigned RB4:1;
unsigned RB5:1;
unsigned RB6:1;
unsigned RB7:1;
};
struct
{
unsigned AN4:1;
unsigned AN5:1;
unsigned :1;
unsigned CCP1:1;
unsigned AN6:1;
unsigned PGM:1;
unsigned PGC:1;
unsigned PGD:1;
};
struct
{
unsigned INT0:1;
unsigned INT1:1;
unsigned INT2:1;
unsigned :1;
unsigned KBI0:1;
unsigned KBI1:1;
unsigned KBI2:1;
unsigned KBI3:1;
};
struct
{
unsigned :1;
unsigned CK:1;
unsigned P1B:1;
unsigned P1A:1;
unsigned DT:1;
unsigned :1;
unsigned P1C:1;
unsigned P1D:1;
};
struct
{
unsigned :4;
unsigned RX:1;
unsigned :1;
unsigned T1OSO:1;
unsigned T1OSI:1;
};
struct
{
unsigned :6;
unsigned T13CKI:1;
};
} PORTBbits;
//------------------------------------------------------------
// Define personalizzato
#define OUTEVA PORTBbits.RB0 // Uscita Comando Iniettore A
#define OUTEVB PORTBbits.RB1 // Uscita Comando Iniettore B
#define OUTEVC PORTBbits.RB2 // Uscita Comando Iniettore C
#define OUTEVD PORTBbits.RB3 // Uscita Comando Iniettore D
//------------------------------------------------------------
// Program sample
void SetEvOn(void)
{
switch (InjRot)
{
case 0: if(InjReg.BONEVA) OUTEVA = 1;
if(InjReg.BONEVB) OUTEVB = 1;
if(InjReg.BONEVC) OUTEVC = 1;
if(InjReg.BONEVD) OUTEVD = 1;
break;
omissis -------------
}
//------------------------------------------------------------ Con alcuni PIC inoltre se si vuole invertire lo stato di una uscita è meglio leggere il registro LATCHx e scrivere in PORTx