Sam Linder [SamL at IN-INC.COM] says:
The following routines work for the 16F874/16F877 - not sure about the 16F871.
// **************************************************
// Function Name: Read8BitDataFromEEprom
//
// Description: Read characterization data out of on-board EEPROM
//
// Inputs:
// eeaddress: 8-bit EEPROM address to read
//
// Outputs:
// 8-bit data stored at EEPROM address
//
unsigned char
Read8BitDataFromEEprom(unsigned char eeaddress)
{
eeaddress &= 0x7F;
eeadr = eeaddress;
eepgd = 0;
rd = 1;
return(eedata);
} // end of Read8BitDataFromEEprom()
// **************************************************
// Function Name: Write8BitDataToEEprom
//
// Description: write 8-bit characterization data to on-board EEPROM
//
// Inputs:
// data_address: 8-bit EEPROM address
// datavalue: 8-bit data
//
// Outputs: none
//
void
Write8BitDataToEEprom(unsigned char data_address, unsigned char datavalue)
{
data_address &= 0x7F;
eeadr = data_address; // establish address to write to
eedata = datavalue; // get data to write
eepgd = 0; // set for access to data memory
wren = 1; // set eeprom write enable bit
//gie = 0;
#asm
retry:
bcf INTCON,GIE // disable interrupts for write sequence
btfsc INTCON,GIE // make sure bit cleared
goto retry // (int could have occurred 1/2way thru
instruction)
#endasm
eecon2 = 0x55; // required
eecon2 = 0xAA; // write
wr = 1; // sequence
gie = 1; // ok to re-enable interrupts
do { // wait for write to complete
; // nothing
} while(wr);
wren = 0; // clear eeprom write enable bit
eeif = 0; // clear write complete interrupt flag
} // end of Write8BitDataToEEprom()
Questions: