; **********************
; * ФУНКЦИЯ: Инкрементирует 3-байтное значение одометра *
; * РЕСУРСЫ: Подпрограммы EE_GET и EE_PUT *
; * ВХОД: Текущее значение в EEPROM по адресам 10:11:12h *
; * ВЫХОД: Измененное значение в EEPROM по тем же адресам, *
; * ВЫХОД: а также находится в регистрах LSB: NSB: MSB *
; **********************
EXTRA_MILE
bsf STATUS,RP0; Переключаемся в 1-й банк
movlw h’10’; Адрес старшего байта показаний одометра
movwf EEADR; Копируем в регистр адреса EEPROM
call EE_GET; Читаем байт из EEPROM
movwf MSB; и кладем его в регистр MSB
bsf STATUS,RP0; Снова в 1-й банк
incf EEADR,f; Адрес среднего байта показаний одометра
call EE_GET; Читаем байт из EEPROM
movwf NSB; и кладем его в регистр NSB
bsf STATUS,RP0; Снова в 1-й банк
incf EEADR,f; Адрес младшего байта показаний одометра
call EE_GET; Читаем байт из EEPROM
movwf LSB; и кладем его в регистр LSB
; Теперь инкрементируем 3-байтное значение
incf LSB, f; Прибавляем 1
btfss STATUS,Z; Равно нулю?
goto PUT_BACK; ЕСЛИ нет, ТО продолжаем
incfsz NSB, f; Инкрементируем средний байт
goto PUT_BACK; ЕСЛИ не ноль, ТО продолжаем
incf MSB, f
; Помещаем обновленное значение одометра обратно в EEPROM
PUT_BACK movf LSB,w; Берем новое значение младшего байта
bsf STATUS,RP0; Переключаемся в 1-й банк
movwf EEDATA; Кладем его в регистр данных EEPROM
call EE_PUT; Пишем в EEPROM по адресу h’12’
movf NSB,w; Берем новое значение среднего байта
bsf STATUS,RP0; Снова в 1-й банк
movwf EEDATA; Кладем его в регистр данных EEPROM
decf EEADR,f; Адресуем средний байт
call EE_PUT; Пишем в EEPROM по адресу h’11’
movf MSB,w; Берем новое значение младшего байта
bsf STATUS,RP0; Снова в 1-й банк
movwf EEDATA; Кладем его в регистр данных EEPROM
decf EEADR,f; Адресуем старший байт
call EE_PUT; Пишем в EEPROM по адресу h’10’
return
После считывания и копирования 3-байтного значения показаний одометра в память оно инкрементируется точно так же, как и в Программе 12.19 (стр. 442). Обновленное значение затем повторно заносится в EEPROM в обратном порядке, при этом значение регистра EEADR декрементируется. Подпрограмма EE_PUT проверяет завершение цикла записи перед выходом, поэтому в вызывающей программе эту проверку можно не выполнять.
Помимо изменения содержимого EEPROM из программы, ее можно инициализировать при программировании микроконтроллера (при занесении кода программы в память программ), как показано на Рис. 10.6,
org h’2100’; Адресное пространство модуля EEPROM
SINE de 0, h’2С’, h’57’, h’7F’, h’A4’, h’C4’
de h’DD’, h’F0’, h’FB’, h’FF’