Ecco il nuovo codice:
- Codice: Seleziona tutto
unsigned char map[8]; // array dichiarato come variabile globale che contiene lo stato dei led
E questi sono i nuovi metodi commentati!
- Codice: Seleziona tutto
/*
* Divido il cubo in 4 piani orizzontali per z che va da 0 a 3
* Ogni piano contiene 16 led, rappresentabili con 16 bit, 2 char
* z quindi seleziona la coppia di char dell'array per ogni piano
* z = 0, char di indice 0 e char di indice 1
* z = 1, char di indice 2 e char di indice 3
* in definitiva gli indici sono (z * 2) e (z * 2 + 1)
* Ogni piano lo divido in 2 semipiani, uno associato al char
* di indice più basso, uno a quello di indice più alto.
* Su questo piano considero le coordinate x e y cha vanno da 0 a 3
* Decido che se y < 2 (quindi per y == 0 e y == 1) memorizzo nel
* char di indice minore, se y >= 2 nel char di indice maggiore
* Ogni semipiano quindi ha 2 file di 4 led. Se y è dispari
* memorizzo nei 4 bit più significativi del char, se pari in quelli
* meno significativi.
*/
/* Questa funzione, in funzione delle coordinate x, y, z, restituisce
* l'indice del char da utilizzare
*/
unsigned char getIndex(unsigned char y, unsigned char z) {
if (y < 2) {
return z * 2;
}
return z * 2 + 1;
}
/*
* Questa funzione restituisce il l'indice del bit da modificare
*/
unsigned char getBitIndex(unsigned char x, unsigned char y) {
if (y % 1) {
return x + 4;
}
return x;
}
/*
* Questa funzione restituisce la maschera da applicare al char
* per settare o resettare un bit
*/
unsigned char getMaschera(unsigned char bitIndex, unsigned char stato) {
unsigned char a = 1;
unsigned char b;
for (b = 0; b < bitIndex; b++) { // fino a quando b < bitIndex
a << 1; // sposta tutti i bit a sx di una posizione
}
if (stato) {
return a; // se devo accendere il led restituisco a
// a ha tutti i bit a 0 tranne quello di indice
// bitIndex che è a 1
}
return !a; // altrimenti il suo negato (mette i bit a 1 a 0 e viceversa)
}
/*
* Questa funzione setta o resetta il bit corrispondente al led
* Se stato = 1 --> led acceso, se stato = 0 --> led spento
*/
void cambiaStato(unsigned char x, unsigned char y, unsigned char z, unsigned char stato) {
unsigned char index = getIndex(y, z);
unsigned char bitIndex = getBitIndex(x, y);
unsigned char maschera = getMaschera(bitIndex, stato);
if (stato) {
// Devo mettere a 1 il bit corrispondente
// Eseguo l'OR logico tra la maschera e il byte dell'array
map[index] |= maschera; // equivale a map[index] = map[index] | maschera
} else {
// Devo mettere a 0 il bit corrispondente
// Eseguo l'AND logico tra la maschera e il byte dell'array
map[index] &= maschera; // equivale a map[index] = map[index] & maschera
}
}
Ora dovrebbe essere più semplice! Provali e fammi sapere se compila e se ti è tutto chiaro!
P.S. Ma dei latch per memorizzare lo stato dei led no vero?
O vuoi risparmiare energia???

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)




