En aquest exemple comptarem cada cop que es prem el polsador però el valor que mostrarem als LED no serà el de la variable Posicio (que seria en binari natural) sinó binari Gray. El codi binari Gray es caracteritza pel fet que entre dos nombres consecutius sempre només canvia un bit i els altres romanen igual. En canvi en binari natural (el que hem vist a format de les dades) hi ha posicions en les que només en canvia un i altres en les que canvien tots. La següent taula ens mostra els dos codis per a nombres de quatre bits:
| Valor decimal |
Binari natural |
Binari Gray |
Valor decimal |
Binari natural |
Binari Gray |
|
| 0 | 0000 | 0000 | 8 | 1000 | 1100 | |
| 1 | 0001 | 0001 | 9 | 1001 | 1101 | |
| 2 | 0010 | 0011 | 10 | 1010 | 1111 | |
| 3 | 0011 | 0010 | 11 | 1011 | 1110 | |
| 4 | 0100 | 0110 | 12 | 1100 | 1010 | |
| 5 | 0101 | 0111 | 13 | 1101 | 1011 | |
| 6 | 0110 | 0101 | 14 | 1110 | 1001 | |
| 7 | 0111 | 0100 | 15 | 1111 | 1000 |
Guardarem els 16 codis Gray a la memòria EEPROM. El programa esperarà que premem el polsador. Quan el premem llegirà un valor de l'EEPROM i el copiarà sobre els LED. Si tornem a prémer el polsador en llegirà un altre i així fins que hagi copiat els 16 valors sobre els LED. Després tornarà a començar.
#pragma config FOSC = INTRCIO, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config CPD = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF #include <xc.h> // Carrega el fitxer de funcions necessari per al compilador XC8 #define Polsador RA3 // Li assigna un nom a l'adreça del polsador
unsigned char Posicio; // Variable de 8 bits per a l'adreça // Dades per a l'EEPROM // Cal posar 8 valors a cada línia __EEPROM_DATA(0x00, 0x01, 0x03, 0x02, 0x06, 0x07, 0x05, 0x04); __EEPROM_DATA(0x0C, 0x0D, 0x0F, 0x0E, 0x0A, 0x0B, 0x09, 0x08);
// Definició de les funcions que farem servir unsigned char llegir_EEPROM(unsigned char adre); // Llegeix el contingut de l'EEPROM // a la posició indicada per l'adreça
void main (void){
TRISC = 0b00000000; // Posa el port C com a sortida
TRISA = 0b00001000; // Posa RA3 com a entrada
Posicio = 0; // Comencem a la posició 0
while (1) { // Bucle infinit
while(Polsador == 1) // Esperem a que el polsador es premi
; // No fem res
PORTC = llegir_EEPROM(Posicio++); // llegeix EEPROM, ho posa als LED i incrementa
if (Posicio == 16)
Posicio = 0; // Quan haguem fet els 16, tornem a començar
while(Polsador == 0) // Esperem a que el polsador es deixi anar
; // No fem res
_delay(20000); // Retard per evitar rebots
}
}
unsigned char llegir_EEPROM(unsigned char adre) {
// Llegeix el contingut de l'EEPROM
// a la posició indicada per l'adreça
EECON1bits.EEPGD = 0; // Seleccionem EEPROM i no memòria de programa
EEADR = adre; // Adreça que volem llegir
EECON1bits.RD = 1; // Activa la lectura
return EEDATA; // Llegeix i retorna el resultat
}

Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.