4. Бит RD сразу же автоматически сбрасывается, и искомое 14-битное значение можно обычным образом считать из регистров 2-го банка памяти EEDATH: EEDATA.
Этот алгоритм реализован в подпрограмме FLASH_GET, текст которой приведен в Программе 15.4. При этом предполагается, что при входе в подпрограмму адрес ячейки уже загружен в регистры EEADRH: EEADR.
; *****************
; * ФУНКЦИЯ: Считывает одно слово из FLASH-памяти программ PIC16F877 *
; * ВХОД: Адрес в EEADRH:EEADR *
; * ВЫХОД: Данные в EEDATH:EEDATA. Используется 0-й банк *
; *****************
FLASH_GET
bsf STATUS,RP1; Переключаемся в 3-й банк
bsf STATUS,RP0
movlw b’10000000’; Указываем на память программ,
movwf EECON1; устанавливая EEPGD в EECON1[7]
bsf EECON1,RD; Устанавливаем RD для запуска цикла чтения
nop;
nop;
bcf STATUS,RP1; Возвращаемся в 0-й банк
bcf STATUS,RP0
return
Для примера напишем подпрограмму, которая будет возвращать квадрат целого числа от 0 до 100, загружаемого в регистр EEDATH: EEDATA. Разумеется, эту операцию можно выполнить путем умножения, однако в учебных целях мы реализуем это вычисление при помощи
В Программе 15.5 таблица размещается по адресу h’300’ памяти программ. Директива dw похожа на директиву de, однако каждое из значений, указываемых в этой директиве, является 14-битным. Для удобства мы также воспользовались директивой radix, чтобы указать систему счисления констант. В нашем случае все константы интерпретируются ассемблером как десятичные числа.
Сразу же за таблицей располагается исполняемый код. Это делает Программу 15.5 отчасти похожей на класс языка Си++, который содержит в себе как члены-данные, так и члены-функции (подпрограммы).