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