Код
void ram_eeprom(void data*,void xdata*,unsigned char);
void eeprom_ram(void xdata*,void data*,unsigned char);
unsigned int xdata KeyClock_ee;
.
.
.
ram_eeprom(&KeyClock,&KeyClock_ee,sizeof(KeyClock));
.
.
.
eeprom_ram(&KeyClock_ee,&KeyClock,sizeof(KeyClock));
Это основная программа на С.
А это функции на ассемблере:
NAME EEPROM_MODULE
EEPROM_MODULE SEGMENT CODE
PUBLIC _eeprom_ram,_ram_eeprom
sfr EECON = 0x96; Memory Control Register
rseg eeprom_module
;---------------------------------------------------------------
;Перенос данных из EEPROM в ОЗУ
;В R0 адрес в ОЗУ, куда переносим
;В DPTR адрес в EEPROM, откуда берем
;В R3 сколько байт
;---------------------------------------------------------------
_eeprom_ram:
mov dph,r6;откуда из EEPROM
mov dpl,r7
mov a,r5;куда в RAM
mov r0,a
orl EECON,#00001000b;включаем EEPROM
rd_eeprom:
movx a,@dptr
mov @r0,a
inc dptr
inc r0
djnz r3,rd_eeprom
anl EECON,#11110111b;выключаем EEPROM
ret
;--------------------------------------
;Перенос данных из ОЗУ в EEPROM
;В R0 адрес в ОЗУ, откуда берем
;В DPTR адрес в EEPROM, куда переносим
;В R3 сколько байт
;--------------------------------------
_ram_eeprom:
mov a,r7;откуда из RAM
mov r0,a
mov dph,r4;куда в EEPROM
mov dpl,r5
orl EECON,#00011000b;включаем EEPROM, разрешаем запись
ram_ee:
mov a,EECON
jnb acc.1,ram_ee;ждем готовности EEPROM (RDY/BSY=1)
mov a,@r0
movx @dptr,a
inc dptr
inc r0
wwr2:
mov a,EECON
jnb acc.1,wwr2;ждем готовности EEPROM (RDY/BSY=1)
djnz r3,ram_ee
anl EECON,#11100111b;выключаем EEPROM, запрещаем запись
ret
END
Писал в Keil.