CASI MEJOR LO HARÉ CON ENTEROS.
Aqui os pongo las rutinas de escritura y lectura en la EEPROM.
Querría saber si alguin me podia ayudar algún menú en C, que sea sencillo para controlar todo esto desde un teclado matricial.
Simplemente tendría que pulsar por ejemplo el 1 del teclado y poder leer el dato que haya en la direción 0x00 de mi EEPROM,.
Con el 2, poder acceder a la EEPROM y sacar el dato contenido en la dirección 0x02.
Por ejemplo con el 3, poder escribir un dato en la posición 0x03 de la EEPROM.
Rutinas de la EEPROM.De lectura y escritura:
//***********************************************************************************
// F_eeprom.C
//Funciones de manejo de la EEPROM I2C ATMEL 24C04
//***********************************************************************************
#include <F_eeprom.h>
#include <stdio.h>
#include <reg51.h>
#include <ctype.h>
#include <sfr.h>
#include <absacc.h>
#include <lcd.h>
#include <i2c.h>
void int_e2prom(unsigned int numero,unsigned int adr);
unsigned int e2prom_int(unsigned int adr);
unsigned int rd_int_lcd(unsigned int adr,char x_lcd,char y_lcd );
//************************************************************
//FUNCION: void int_e2prom(unsigned int numero,unsigned int adr)
// RECIBE: unsigned int a escribir a partir de la dirección adr
// DEVUELVE: NADA
//
// Escritura de un int en la EEPROM
//************************************************************
void int_e2prom(unsigned int numero,unsigned int adr){
cs=0;
byte_e2prom((unsigned char)numero,adr+1); //Almacena en Big Endiand
numero>>=8; //1º MSB y luego LSB
byte_e2prom((unsigned char)numero,adr);
cs=1;
}
//************************************************************
//FUNCION: unsigned int e2prom_int(unsigned int adr)
// RECIBE: dirección adr donde se encuentra el int a leer
// DEVUELVE: unsigned int leído en la dirección adr
//
// Lectura de un int en la EEPROM
//************************************************************
unsigned int e2prom_int(unsigned int adr){
unsigned int numero;
unsigned char banco=0;
unsigned int adr1;
cs=0;
adr1=adr;
if(adr1>0xff) // Comprueba si la dirección pertenece al banco 0
{ // (adr<=256) o al banco 1 (adr>255)
adr1-=0x100;
banco=2;
}
STOP; // Macro de inicializacion o fin de comunicacion i2C
START; // Macro de comienzo de comunicacion i2C
w_ee(0xa0+banco); // Direccionamiento para escritura
w_ee((unsigned char)adr1); // Direccion incial de memoria
REPOSO; // Macro de reposo lineas SCL y SDA del i2C
START;
w_ee(0xa1+banco); // Direccionamiento para lectura
( * (char *) &numero )=r_ee();
SI_ACK;
( * ((char *) &numero + 1 ))=r_ee();
NO_ACK;
STOP;
REPOSO;
CS=1;
return(numero);
}
//************************************************************
//FUNCION: unsigned int rd_int_lcd(unsigned int adr,char x_lcd,char y_lcd )
// RECIBE: dirección adr donde se encuentra el int y coord del lcd
// DEVUELVE: int leído en la dirección adr
//
// Rutina para leer de la E2PROM un int
// presenta el dato en en LCD (x,y)
//*********************************************************
unsigned int rd_int_lcd(unsigned int adr,char x_lcd,char y_lcd )
{
char bufhex [6];
unsigned char i,n;
unsigned int muestra;
muestra=e2prom_int(adr);
n=sprintf(bufhex,"%u",muestra);
lcd_gotoxy(x_lcd,y_lcd);
for (i=0;i<4;i++)
{
if (i<n) lcd_write_DR(bufhex
);
else lcd_str(" "
lcd_delay(100);
}
return(muestra);
}
Muchas gracias por vuestra aportación. EStoy con el agua al cuello y lo necesito terminar para antes del viernes, Socorro!!!!!!!!No me da tiempooooooooo!!