El programa que proposem escriurà els següents vuit valors a la memòria EEPROM:
LED Valor 76 54 32 10 00 11 00 11 51 10 10 10 10 170 11 11 00 00 240 11 00 11 00 204 01 01 01 01 85 00 00 11 11 15 10 01 10 01 153 01 10 01 10 102
Llavors 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 vuit valors sobre els LED. Després tornarà a començar.
#pragma config FOSC = INTIO67, FCMEN = OFF, IESO = OFF // CONFIG1H #pragma config PWRT = OFF, BOREN = SBORDIS, BORV = 30 // CONFIG2L #pragma config WDTEN = OFF, WDTPS = 32768 // CONFIG2H #pragma config MCLRE = OFF, LPT1OSC = OFF, PBADEN = ON, CCP2MX = PORTC // CONFIG3H #pragma config STVREN = ON, LVP = OFF, XINST = OFF // CONFIG4L #pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF // CONFIG5L #pragma config CPB = OFF, CPD = OFF // CONFIG5H #pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF // CONFIG6L #pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF // CONFIG6H #pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF // CONFIG7L #pragma config EBTRB = OFF // CONFIG7H #include "p18f45k20.h" // Carrega el fitxer d'adreces i paràmetres del PIC 18F45K20 #include <xc.h> // Carrega el fitxer de funcions
unsigned char Posicio; // Variable de 8 bits per a l'adreça
// 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 escriu_EEPROM(unsigned char adre, unsigned char dada); // Escriu el valor donat a l'adreça EEPROM indicada
void main (void)
{
TRISD = 0b00000000; // El port D és de sortida
ANSEL = 0; // Desactiva totes les entrades analògiques
ANSELH = 0;
INTCON2bits.RBPU = 0; // Habilita el control de resistències de pull-up al port B
WPUBbits.WPUB0 = 1; // Activa la resistència de pull-up a RB0
TRISBbits.TRISB0 = 1; // RB0 és entrada
// Configuració d'interrupció a INT0 (RB0)
INTCON2bits.INTEDG0 = 0; // Interrupció quan es desactiva (quan es prem el polsador)
// INT0 sempre és de prioritat alta, no cal definir-ho
INTCONbits.INT0IF = 0; // Inicialitzem amb el bit de control desactivat
INTCONbits.INT0IE = 1; // Habilitem la interrupció IN0
RCONbits.IPEN = 0; // Només un nivell d'interrupció
escriu_EEPROM(0, 51); // Escriu el primer valor
escriu_EEPROM(1, 170); // i el segon...
escriu_EEPROM(2, 240);
escriu_EEPROM(3, 204);
escriu_EEPROM(4, 85);
escriu_EEPROM(5, 15);
escriu_EEPROM(6, 153);
escriu_EEPROM(7, 102); // Escriu el vuitè valor
Posicio = 0; // Comencem a la posició 0
LATD = 1; // Inicialment només el LED 0
INTCONbits.PEIE = 1; // Permet les interrupcions de perifèrics
INTCONbits.GIE = 1; // Permet les interrupcions globalment
while (1) // Bucle infinit sense fer res
;
}
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
EECON1bits.CFGS = 0; // Seleccionem EEPROM i no configuracions
EEADR = adre; // Adreça que volem llegir
EECON1bits.RD = 1; // Activa la lectura
return EEDATA; // Llegeix i retorna el resultat
}
void escriu_EEPROM(unsigned char adre, unsigned char dada)
{ // Escriu el valor donat a l'adreça EEPROM indicada
EECON1bits.EEPGD = 0; // Seleccionem EEPROM i no memòria de programa
EECON1bits.CFGS = 0; // Seleccionem EEPROM i no configuracions
EEDATA = dada; // Valor que volem escriure
EEADR = adre; // Adreça que volem escriure
EECON1bits.WREN = 1; // Habilita l'escriptura
INTCONbits.GIE = 0; // Desactiva interrupcions
EECON2 = 0x55; // Cal escriure uns valors predeterminats (55h i AAh)
EECON2 = 0xAA; // a EECON2 per activar el procés d'escriptura
EECON1bits.WR = 1; // Activa l'escriptura
INTCONbits.GIE = 1; // Reactivem interrupcions
while (EECON1bits.WR == 1) // Esperem a que l'escriptura acabi
;
EECON1bits.WREN = 0; // Deshabilitem l'escriptura
}
void interrupt polsador(void) // funció d'interrupcions
{
if (INTCONbits.INT0IF) // Comprovem que hi ha interrupció per INT0
{
_delay(20000); // Retard per evitar rebots
INTCONbits.INT0IF = 0; // Desactivem el bit que indica la interrupció
if (PORTBbits.RB0 == 0) // Si el polsador encara està premut
{
LATD = llegir_EEPROM(Posicio++); // llegeix EEPROM, ho posa als LED i incrementa
if (Posicio == 8)
Posicio = 0; // Quan haguem fet els 8, tornem a començar
}
}
}

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