En el programa següent (similar al de l'exemple EP) guardem uns valors a la memòria de programa (flash) en el moment de programar (definits com a constants) i després els llegim de la memòria de programa.
Guardarem els 16 codis Gray a la memòria flash. El programa esperarà que premem el polsador. Quan el premem llegirà un valor de la flash 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.
| Valor decimal |
Binari natural |
Binari Gray |
Valor hexadecimal |
Valor decimal |
Binari natural |
Binari Gray |
Valor hexadecimal |
|
| 0 | 0000 | 0000 | 0 | 8 | 1000 | 1100 | C | |
| 1 | 0001 | 0001 | 1 | 9 | 1001 | 1101 | D | |
| 2 | 0010 | 0011 | 3 | 10 | 1010 | 1111 | F | |
| 3 | 0011 | 0010 | 2 | 11 | 1011 | 1110 | E | |
| 4 | 0100 | 0110 | 6 | 12 | 1100 | 1010 | A | |
| 5 | 0101 | 0111 | 7 | 13 | 1101 | 1011 | B | |
| 6 | 0110 | 0101 | 5 | 14 | 1110 | 1001 | 9 | |
| 7 | 0111 | 0100 | 4 | 15 | 1111 | 1000 | 8 |
La memòria de programa és de 14 bits i posarem un byte a cada posició. Hem escrit doncs un nombre hexadecimal format per tres zeros i el valor que hi ha a la taula anterior. El programa és el següent:
#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 #define inici 0x600
unsigned short adressa; // Variable de 16 bits per a l'adreça
unsigned char Posicio; // Variable de 8 bits per a la posició
const unsigned char LlistaMP[16] __at(0x600) = {0x0000, 0x0001, 0x0003, 0x0002, 0x0006, 0x0007, 0x0005, 0x0004,
0x000C, 0x000D, 0x000F, 0x000E, 0x000A, 0x000B, 0x0009, 0x0008};
// Definició de les funcions que farem servir unsigned char llegir_MemProg(unsigned short adre); // Llegeix el contingut de la memòria de programa // 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
adressa = inici + Posicio++; // Calcula l'adreça i incrementa la posició
while(Polsador == 1) // Esperem a que el polsador es premi
; // No fem res
PORTC = llegir_MemProg(adressa); // llegeix memòria de programa i ho posa als LED
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_MemProg(unsigned short adre) {
// Llegeix el contingut de la memòria de programa
// a la posició indicada per l'adreça
EEADRH = adre/256; // Part més significativa de l'adreça que volem llegir
EEADR = (unsigned char) adre%256; // Part menys significativa de l'adreça que volem llegir
EECON1bits.EEPGD = 1; // Seleccionem memòria de programa i no EEPROM
EECON1bits.RD = 1; // Activa la lectura
_delay(5); // Donem temps a fer la lectura
return EEDAT; // Llegeix i retorna el resultat
}
Si després de picar a la icona
fem:

Obtindrem:

és a dir, els valors que hem posat a const unsigned char LlistaMP[16] encara que, si ens fixem bé, amb els primers dos dígits hexadecimals canviats. El motiu del canvi és que a la finestra s'està interpretant el que es llegeix a la memòria de programa com si fossin instruccions. Però no té cap importància perquè els vuit bits que fem servir sí els guarda correctament.

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