// EEPROM_1.C SourceBoost C, PIC16F886, ICD2
//
// Reads preprogrammed data at EEPROM location 0x00 and displays.
//
// Writes values to all 256 bytes of high enfurance data EEPROM.
//
// Reads it back and displays on serial LCD.
//
// copyright, Peter H Anderson, July 19, '09


#include <system.h>
#include <stdio.h>
#include <icd2.h>
#include <string.h>

#pragma DATA 0x2007, 0x28e4
#pragma DATA 0x2008, 0x3eff
#pragma CLOCK_FREQ 4000000

#define byte unsigned char

#define FALSE 0
#define TRUE !0

byte read_eeprom(byte adr);
void write_eeprom(byte adr, byte dat);

void asynch_setup(void);
void print_str(char *s);


void main()
{
   byte n, d;
   char s[25];

   osccon = 0x61;
   anselh = 0x00;

   asynch_setup();

   delay_ms(25);
   strcpy(s, "?f"); // clear LCD
   print_str(s);

   d = read_eeprom(0x00);  // read and display location 0x00
   sprintf(s, "%u", d);
   print_str(s);
   delay_s(3);

   for (n=0; n<0xff; n++)
   {
      d = 0xff - n;
      write_eeprom(n, d);
   }

   for (n=0; n<0xff; n++)
   {
      d = read_eeprom(n);
      strcpy(s, "?x00?y1?l  "); // col 00, row 1, clear line, some spaces
      print_str(s);
      sprintf(s, "%u", d);
      print_str(s);
      delay_ms(250);
   }

   while(1)
   {
   }
}



byte read_eeprom(byte adr)
{
   eeadr = adr;
   eecon1.EEPGD = 0;
   eecon1.RD = 1;
   return(eedata);
}


void write_eeprom(byte adr, byte dat)
{
   byte gie_status;

   eeadr = adr;
   eedata = dat;

   eecon1.EEPGD = 0;
   eecon1.WREN = 1;

   gie_status = intcon.GIE; // save GIE status
   while(intcon.GIE)
   {
      intcon.GIE = 0;      // turn off ints
   }

   eecon2 = 0x55; // password
   eecon2 = 0xaa;

   eecon1.WR = 1;
   delay_ms(50);
   intcon.GIE = gie_status;
   eecon1.WREN = 0;

}

void asynch_setup(void)
{   // for UART, see Manual pages beginning at page 151
    trisc.7 = 1;
    trisc.6 = 1;    // TX
    rcsta.SPEN = 1; // enable serial port
    txsta.TXEN = 1; // enable transmitter
    txsta.SYNC = 0; // asynchronous
    txsta.BRGH = 1;

    spbrg = 25; // 9600 baud at 4.0 MHz
}

void print_str(char *s)
{
    while(*s != '\0')
    {
        txreg = *s;
        while(txsta.TRMT == 0)
        {
        }
        ++s;
    }
}

#pragma DATA 0x2100, 0x55