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 отчасти похожей на класс языка Си++, который содержит в себе как члены-данные, так и члены-функции (подпрограммы).