Приведенный выше алгоритм реализован в Программе 15.2. Значения байта данных и его адреса заносятся в регистры EEDATA и EEADR вызывающей программой. Возврат из подпрограммы происходит только после завершения цикла записи, который длится около 4 мс. Такое решение гарантирует, что указанные РСН не будут изменены во время цикла, что может привести к неверным результатам.
; ************************
; * ФУНКЦИЯ: Пишет один байт в модуль EEPROM *
; * ВХОД: Байт данных в EEDATA, адрес байта в EEADR *
; * ВЫХОД: Прерывания запрещены в течение 9 маш. циклов *
; * ВЫХОД: Используется 0-й банк памяти *
; ************************
ЕЕ PUT bsf STATUS,RP0; Переключаемся в 1-й банк
bcf STATUS,RP1
bsf EECON1,WREN; Разрешаем запись
bcf INTCON,GIE; Запрещаем все прерывания
movlw h’55’; Загружаем кодовую последовательность
movwf EECON2
movlw h’AA’
movwf EECON2
bsf EECON1,WR; Инициируем цикл записи
bcf EECON1,WREN; Запрещаем дальнейшие операции записи
bsf INTCON,GIE; Разрешаем прерывания
EE_EXIT btfsc EECON1,WR; Проверяем, запись завершена?
goto EE_EXIT; ЕСЛИ нет, ТО проверяем снова
bcf STATUS,RP0; Возвращаемся в 0-й банк
return; и выходим из подпрограммы по окончании цикла записи
Чтобы проиллюстрировать работу с EEPROM, вернемся к Примеру 12.3 (стр. 439), в котором мы сохраняли 3-байтные показания одометра во внешней последовательной EEPROM. Однако на этот раз мы воспользуемся встроенной EEPROM-памятью. Предположим также, что показания одометра хранятся в ячейках EEPROM с адресами h’10’…h’12’.
В новой программе, код которой приведен в Программе 15.3, для чтения и последующей записи 3-байтного значения одометра из/в модуль EEPROM используются подпрограммы EE_GET и EE_PUT. Адрес первого (старшего) байта в начале подпрограммы копируется в регистр EEADR, а по ходу выполнения подпрограммы для указания на требуемые ячейки этот регистр инкрементируется и декрементируется.