En este ejercicio realizaremos la lectura y escritura de una EEPROM mediante un módulo SPI y programando un PIC18f4550. La EEprom que utilizaremos es 25LC020. 
Lo primero es realizar el código del programa para poder escribir y leer en la memoria EEPROM.
///////////////////////////////////////////////////////////////////////////////////////////////////
//   AUTOR: Clara Alonso Fernández                      Mayo/2011
//////////////////////////////////////////////////////////////////////////////////////////////////
//   PROGRAMA:Escritura y Lectura de una EEPROM con un SPI    VERSIÓN:    1.0
//   DISPOSITIVO: PIC 18F4550                COMPILADOR: PCWHC Compiler v4,093
//   Entorno IDE:                            SIMULADOR:  Proteus 7.6 sp0
//   TARJETA DE APLICACIÓN: Virtual                  DEBUGGER:
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
//Ejercicio; Escribir en una EEPROM con un 18F4550 mediante el bus SPI
///////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// CABECERA //////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
#include <18F4550.h>       //PIC que se va a utilizar.
#fuses INTHS//oscilador interno        //Configuración de los fusibles.
#use delay(internal=8Mhz)    //Configuración de la velocidad del oscilador.
#include <LCD_flexible.c>    //Librería del LCD.
/////////////////////////////////////////////////////////////////////////////////////////////////
// VARIABLES GLOBALES ///////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////
int a;
int p;
//////////////////////////////////////////////////////////////////////////////////////////////
// FUNCIONES ////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
escribir()
{
   output_bit(pin_a0,1);                      //Habilita la salida CS.
   spi_write(0x06);                            //Con esta instrucción habilitamos la escritura en la EEPROM.
   spi_write(0x02);                           //Dirección para configurar que vamos a escribir.
   spi_write(0x00);                           //Dirección de la memoria.       
   lcd_putc("ESCITURA: ");
   lcd_gotoxy(1,0);
   for(a=0;a<5;a++)
      {                                            //Configuración para escribir datos desde 0x00 hasta 0x07.
         spi_write(a);                        //Escribe en el SPI el valor de los datos.
         printf(lcd_putc,"%u",a);        //Muestra en el LCD el valor de los datos.
         delay_ms(500);                   //Retardo de 500 mseg.
      }
}
leer()
{
   output_high(pin_a0);                 //Deshabilita la salida CS.
   delay_ms(1000);                      //Retardo de 1 seg.
   lcd_putc("\f");                          //Muestra en la segunda fila del LCD la palabra LECTURA.
   delay_ms(300);
   lcd_putc("LECTURA: ");
   lcd_gotoxy(1,0);
   output_low(PIN_A0);                //Volvemos ha habilitar la salida CS.
   spi_read(0x03);                      //Configurar la operación de escritura.
   spi_read(0x00);                      //Dirección de lectura.
   for(p=0;p<5;p++)
      {
      a=(spi_read(p));                 //Lee de la direccion 0×00 hasta la 0×09.
      printf(lcd_putc,"%u",a);       //Lo muestra en el LCD.
      delay_ms(500);                  //Retardo de 500 mseg.
      }                                   
      output_high(PIN_A0);         //Volvemos a deshabilitar la salida CS.
}
///////////////////////////////////////////////////////////////////////////////
// PRINCIPAL //////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void main()
{
   lcd_init();                         //Inicializa el LCD.
   setup_spi(spi_MASTER | spi_L_to_H | spi_clk_div_16);
   //ESCRITURA EN EEPROM
   output_bit(pin_A0,1);        //Se vuelve ha habilitar CS.
   spi_write(0x06);               //Se habilitar la escritura.
   spi_write(0x02);               //Direcccion para configurar que vamos a escribir.
   spi_write(0x00);               //Direccion de la memoria donde se guarda.       
   delay_ms(300);               //Retardo de 300 mseg.
   escribir();                       //Función de escritura.
   leer();                            //Función de lectura.
   }
Después haremos el esquemático en el PROTEUS para poder simular su funcionamiento y realizar luego el diseño de la placa en el otro entorno de proteus, el ARES.
La siguiente imagen muestra la ventana donde se ve si la EEPROM tiene contenido escrito:
Una vez terminado el esquemático pasamos a realizar el diseño en ARE:
Con la siguiere imagen nos podemos hacer una idea bastante aproximada de cómo quedaría la placa en la realidad: