А ось і сам код:
LIST
p=16F628
#include
"P16F628.INC"
;
__CONFIG 3F61h
radix DEC
w
equ 0
f
equ 1
Sample
equ
2Dh
; Эту переменную мы будем сохранять
Counter
equ
2Dh
; Счетчик
RAMaddr
equ
0A0h ;
Банк 1
org
0
;*********************************************************************************
;
Пример программы последовательного
сохранения значения заданной ячейки памяти
во
;
временную память и последующий перенос
(по команде) этих данных во Flash память
;*********************************************************************************
goto
Test
;********************************************************************************
;
тестовая процедура. Она просто гененрирует
последовательность от 1 до 256
;
в тестовой ячейке памяти
;********************************************************************************
Test
;-------------------------------;
Первичная подготовка
bcf
STATUS,RP0 ; Банк 0
bcf
STATUS,RP1 ; Банк 0
clrf
INTCON
; Запрет всех прерываний
;-------------------------------;
готовим переменные
clrf
Sample
; Сбрасываем в ноль переменную Sample
movlw
10h
movwf
Counter
;
;-------------------------------;
Главный цикл
call
SampInit
bcf
STATUS,RP0 ; Банк 0
Cykle
call
SampToRAM ; Вызываем процедуру SampToRAM
bcf
STATUS,RP0 ; Банк 0
incfsz
Sample,1
bsf
STATUS,RP0 ; Банк 1
;if RAMaddr=0EFh
movlw
0EFh
xorwf
RAMaddr,W
bcf
STATUS,RP0 ; Банк 0
btfsc
STATUS,Z
goto
$+2
goto
Cykle
call
RAMToFlash ; Вызываем процедуру RAMToFlash
goto
$
; Зависаем
;********************************************************************************
;
Подготовка к записи
;********************************************************************************
SampInit
bsf
STATUS,RP0 ; Банк 1
bcf
STATUS,IRP ; Косвенная адресация. Банк 0
или 1.
movlw
0A9h
movwf
RAMaddr
movwf
FSR
SampNext
movlw
0FFh
movwf
INDF
incfsz
FSR,1
;if FSR=0EFh
movlw
0EFh
xorwf
FSR,W
btfsc
STATUS,Z
return
goto
SampNext
;********************************************************************************
;
Сохраняем переменную Sample в ОЗУ. Используем
косвенную адресацию.
;********************************************************************************
SampToRAM
bsf
STATUS,RP0 ; Банк 1
;if RAMaddr=0EFh
movlw
0EFh
xorwf
RAMaddr,W
btfsc
STATUS,Z
return
movf
RAMaddr,w
movwf
FSR
bcf
STATUS,RP0 ; Банк 0
movf
Sample,w
bsf
STATUS,RP0 ; Банк 1
movwf
INDF
incfsz
RAMaddr,1
return
;********************************************************************************
;
Сохраняем значения из ОЗУ во ППЗУ
;********************************************************************************
RAMToFlash
bsf
STATUS,RP0 ; Банк 1
bcf
STATUS,IRP
movlw
0A9h
movwf
FSR
clrf
EEADR
; Адрес ячейки для записи
RAMToFlashNext
movf
INDF,w
movwf
EEDATA
; Байт для записи
bsf
EECON1,WREN ;
Разрешить запись
;
bcf
INTCON,GIE ; Запретить прерывания
movlw
55h
;
movwf
EECON2
; запись 55h
movlw
0AAh
;
movwf
EECON2
; Запись ААh
bsf
EECON1,WR ;
Установить бит WR для
; начала записи
W_1
btfsc
EECON1, WR
; Ждем окончания записи
goto
W_1
bcf
EECON1, WREN
; Запретить запись
;
bsf
INTCON,GIE ; разрешить прерывания
incfsz
EEADR,1
nop
incfsz
FSR,1
;if RAMaddr=0EFh
movlw
0EFh
xorwf
FSR,W
btfsc
STATUS,Z
return
goto
RAMToFlashNext
END
05.01.2009
(SKOldVersion)12-2023