EEPROM работает.
Выкладываю черновой вариант , потом сделаю более удобочитаемо...
Запись и чтение - по одному байту
А вот стирание - сразу сектором по 512 байт! Перед удалением надо вычитывать нужное и сохранять на время стирания.
Код:
$regfile = "STC_8H.DAT" ' STC registers list $crystal = 11059200 ' CPU clock frequence $ramsize = 512 $romstart = &H0 ' code starting address Dim Addr_iap As Word , Temp As Byte My_led Alias P1.2 '----------------------------------------- P1ie = &B1111_1111 ' 1: Enable digital pins P1pu = &B0000_0000 ' 1: pull-up resistor P1m0 = &B_1010_0110 : P1m1 = &B_0000_0000 ' output mode P3ie = &B1111_1011 ' 1: Enable digital pins P3pu = &B0000_0000 ' 1: pull-up resistor P3m0 = &B_0000_0000 : P3m1 = &B0000_0000 ' output mode '----------------------------------------- 'UART1 P_sw1 = &H00 'RXD/P3.0, TXD/P3.1 'P_sw1 = &H40 'RXD_2/P3.6, TXD_2/P3.7 'P_sw1 = &H80 'RXD_3/P1.6, TXD_3/P1.7 Sbuf = 0 ' Magic ... Scon = &H52 ' 8-Bits And Variable Baudrate Auxr = &H54 'Timer is 1T mode, use Timer1 as baudrate generator Tmod = 2 'Set timer work mode Sbuf = 0 ' Magic ... Tl1 = &HE8 : Th1 = &HFF 'Initial timer - 115200 / 11059200 'Tl1 = &HE0 : Th1 = &HFE 'Initial timer - 9600 / 11059200 'Tl1 = &HF3 : Th1 = &HFF 'Initial timer - 19200 / 1MHz 'Tl1 = &HF3 : Th1 = &HFF 'Initial timer - 38400 / 2MHz 'Tl1 = &HCC : Th1 = &HFF 'Initial timer - 38400 / 8MHz Et1 = 0 'Disable Timer interrupt Tr1 = 1 'Timer1 start run '----------------------------------------------------------------------------- '( Addr_iap = 0 ' Print "Erase" Gosub Eeprom_erase Addr_iap = 0 : Temp = 11 Print "Write: " ; Temp Gosub Eeprom_write Addr_iap = 1 : Temp = 22 Print "Write: " ; Temp Gosub Eeprom_write ') Print " 0-511" For Addr_iap = 0 To 511 Gosub Eeprom_read Print Addr_iap ; "=" ; Temp Next End '----------------------------------------------------------------------------- '----------------------------------------- Eeprom_read: Iap_contr.7 = 1 ' Включить IAP IAPEN=1; Iap_tps = 12 ' Установим параметр ожидания для 12 МГц; Iap_cmd = 1 ' Команда чтения IAP Iap_addrl = Low(addr_iap) ' Установить нижний адрес IAP Iap_addrh = High(addr_iap) ' Устанавливаем верхний адрес IAP Iap_trig = &H5A : Iap_trig = &HA5 ' Команда триггера (&h5a и &ha5); Temp = Iap_data ' Чтение данных IAP; Gosub Eeprom_iapidle ' Выключаем функцию IAP Return '----------------------------------------- Eeprom_write: Iap_contr.7 = 1 ' Включить IAP IAPEN=1; Iap_tps = 12 ' Установим параметр ожидания 12 МГц; Iap_cmd = 2 ' Команда записи IAP Iap_addrl = Low(addr_iap) ' Установить нижний адрес IAP Iap_addrh = High(addr_iap) ' Устанавливаем верхний адрес IAP Iap_data = Temp ' Запись данных IAP Iap_trig = &H5A : Iap_trig = &HA5 ' Команда триггера (&h5a и &ha5); Gosub Eeprom_iapidle ' Выключаем функцию IAP Return '----------------------------------------- Eeprom_erase: Iap_contr.7 = 1 ' Включить IAP IAPEN=1; Iap_tps = 12 ' Установим параметр ожидания 12 МГц; Iap_cmd = 3 ' Установить команду стирания IAP Iap_addrl = Low(addr_iap) ' Установить нижний адрес IAP Iap_addrh = High(addr_iap) ' Устанавливаем верхний адрес IAP Iap_trig = &H5A : Iap_trig = &HA5 ' Команда триггера (&h5a и &ha5); Gosub Eeprom_iapidle ' Выключаем функцию IAP Return '----------------------------------------- Eeprom_iapidle: nop Iap_contr = 0 'Отключаем Функцию Iap Iap_cmd = 0 'Очистить регистр команд Iap_trig = 0 'Очистить регистр триггера Iap_addrh = &H80 : Iap_addrl = 0 'Установить адрес для области, отличной от IAP Return