Recientemente utilicé eeprom en el microcontrolador stc. Espero guardar los datos modificados en la eeprom durante el funcionamiento del microcontrolador y llamarlos desde allí la próxima vez que lo encienda.
# include ltintrins.h gt
/*Los siguientes son los registros utilizados para configurar el microcontrolador STC*/
/* La información relacionada comienza en la página 35 del PDF STC89C51RC*/
sfr ISP_DATA = 0xE2
sfr ISP_ADDRH = 0xE3
sfr ISP_ADDRL = 0xE4
sfr ISP _ CMD = 0xE5
sfr ISP _ TRIG = 0xE6
sfr ISP _ CONTR = 0xE7
#Definir uint Entero sin signo
#Definir carácter sin firmar uchar
#Definir ISP_byte_read1//ISP byte leído
#Definir ISP_byte_ program2//Programación directa de ISP
#Definir ISP _ sector _ erase3//borrado del sector ISP
tabla de códigos uchar[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
/************************************ ************** ***********************
*Nombre: Retraso ()
*Función: Retraso, el tiempo de retardo es 10 ms * del.
*Entrada: del
*Salida: Ninguna
********************* * ************************************************* ** /
Retraso no válido_1ms (uint i)
{
uchar x, j;
for(j = 0; j lti; j )
for(x = 0; x lt=148; x );
}
/******* ** ************************************************* * **********
*Nombre: ISP_ERASE()
*Función: Borrar sector EEPROM.
*Entrada: Dirección (la dirección del sector borrado)
*Salida: Ninguna
*********** *** ********************************************** ** *******/
void ISP_ERASE(dirección)
{
ISP_ADDRL = dirección;
ISP_ADDRH = Dirección gt gt8;
ISP_CONTR = 0x 81;
ISP_CMD = ISP_SECTOR_ERASE
ISP_TRIG = 0x46// El manual en PDF dice que escriba 0x46 primero y luego 0xb9 en ISP_TRIG .
ISP _ TRIG = 0xb9
_ nop _()
_ nop _()
}
/************************************************ **********************
*Nombre: ISP_READ()
*Función: Desde la dirección correspondiente de EEPROM Lea el valor.
*Entrada: Dirección (la dirección para leer la EEPROM)
*Salida: Read_Data (el valor leído de la EEPROM)
***** ************************************************** * *******************/
uint ISP_READ(dirección)
{
uchar Leer _ Datos
ISP_ADDRL = Dirección;
ISP_ADDRH = Dirección gt gt8;
EA = 0;
ISP_CONTR = 0x 81; p >
ISP _ CMD = ISP _ BYTE _ READ
ISP _ TRIG = 0x46
ISP _ TRIG = 0xb9
_ nop _()
_ nop _();
Leer _ Datos = ISP _ DATOS
Devolver Leer _ Datos
}
/********************************************* * **********************
*Nombre: ISP_PROGRAM()
*Función: Implementar los bytes de Programación EEPROM.
*Entrada: Dirección es la dirección a programar, Data_temp es el valor a programar.
*Salida: Ninguna
******************************** *******************************************/
void ISP_PROGRAM( dirección, datos_temporales)
{
ISP_DATA = Data_temp
ISP_ADDRL = dirección;
ISP_ADDRH = Dirección gt gt8;
ISP_CONTR = 0x 81;
ISP_CMD = ISP_BYTE_PROGRAM
ISP_TRIG = 0x46
ISP_TRIG = 0xb9
_nop_();
_nop_();
}
/ ************** ************************************* ************* *****
*Nombre: Main()
*Función: Función principal
*Entrada: Ninguna
*Salida : Ninguno
****************************************** ******************************/
void Main()
{
uint I;
uchar LED _ Buffer = 0;
while(1)
p>{
for(I = 0;ilt50;i)
{
LED _ Buffer = ISP _ READ(0x2c 00) ;
P0 = tabla[ LED _ Buffer 10];
P2 = 1;
retraso _ 1 ms(6);
P0 = tabla[LED _ Buffer/10 10]
P2 = 0;
retraso _ 1 ms(6
}
LED_buffer;
ISP_ERASE(0x2c 00); //Nota: todo el sector debe borrarse antes de la programación de bytes.
ISP_PROGRAM(0x2c00, LED_Buffer);
}
}