Внутреннее ОЗУ данных предназначено для временного хранения информации, используемой в процессе выполнения программы, и занимает 128 младших байтов, с адресами от 000h до 07Fh для микроконтроллеров 8051, 8031, КР1816ВЕ31, КР1816ВЕ51, КР1816ВЕ751 КР1830ВЕ31, КР1830ВЕ51, КР1830ВЕ751 или 256 8-разрядных ячеек с адресами от 000h до 0FFh для всех остальных микроконтроллеров семейства.
Регистры специальных функций занимают адреса внутренней памяти данных с 080h no 0FFh. Так как адреса регистров специальных функций совпадают со старшими адресами внутреннего ОЗУ данных, то имеются особенности их использования.
Система команд микроконтроллера позволяет обращаться к ячейкам внутренней памяти данных при помощи прямой и косвенно-регистровой адресации. Обращение к ячейкам памяти с адресами 0-127 (0-7Fh) происходит с использованием любого из этих видов адресации и будет производить выборку одной и той же ячейки памяти. При обращении к ячейкам ОЗУ с адресами 128 (080h)-256 (0FFh) следует воспользоваться косвенно-регистровой адресацией. Учитывая, что работа со стеком ведется при помощи косвенной адресации, а сам стек растет вверх, имеет смысл размещать в этой области памяти стек. Само понятие стека и особенности его использования будут рассмотрены позднее. Если же требуется обратиться к регистрам специальных функций, то нужно использовать прямую адресацию. Например:
MOV A, 80h ;Скопировать сигналы с внешних выводов порта Р0 в аккумулятор
MOV R0, #80h ;Скопировать в аккумулятор содержимое
MOV A, @R0 ;ячейки внутреннего ОЗУ с адресом 80h
Регистры общего назначения позволяют писать самые эффективные программы. У микроконтроллеров семейства MCS-51 для программирования доступны восемь регистров. Более того, в этом семействе микроконтроллеров есть четыре набора (банка) регистров с именами RB0-RB3. Для сравнения такие мощные процессоры, как «электроника-79» и SPARC, обладают всего двумя наборами регистров. Банк регистров состоит из восьми 8-разрядных регистров с именами R0, R1…, R7.
Несколько банков регистров служат для организации независимой работы нескольких параллельно выполняемых программных потоков.
Переключение банков регистров производится при помощи двух особых битов, входящих в состав регистра слова состояния программы PSW (биты RS0 и RS1). Если организация нескольких параллельных потоков обработки данных не нужна, то можно пользоваться только нулевым банком регистров, включающимся автоматически после подачи питания и сброса микроконтроллера, остальные ячейки памяти использовать как обычное ОЗУ.
Все четыре банка регистров объединены с 32 младшими байтами внутреннего ОЗУ данных (см. рис. 6.12). Так как физически регистры и ячейки внутреннего ОЗУ объединены, то команды программы могут обращаться к регистрам, используя или их имена R0-R7 (регистровая адресация):
MOV A, R0 ;Скопировать содержимое регистра R0 в аккумулятор
MOV R7, А ;Скопировать содержимое регистра R7 в аккумулятор
или их адрес во внутренней памяти данных (прямая байтовая адресация):
MOV А, 0 ;Скопировать содержимое нулевой ячейки ОЗУ в аккумулятор
MOV 7, А ;Скопировать содержимое аккумулятора в седьмую ячейку ОЗУ
Следующие после банков регистров 16 ячеек внутреннего ОЗУ данных (адреса 20H-2FH) образуют область памяти, к которой возможна как байтовая, так и битовая адресация. В этих ячейках располагаются 128 программных флагов (битовых ячеек памяти). Обращение к отдельным битам этих ячеек возможно по их битовым адресам. Например, команды:
SETB 15 ;Запомнить во флаге 15 логическую единицу
JB 15, Metka ;Если во флаге 15 записана логическая единица, то перейти по адресу Metka
обращаются к флагу 15, расположенному в старшем бите байтовой ячейки памяти 21h. Использование однобитовых ячеек памяти позволяет сократить необходимый для работы программы объем памяти данных, т. к. для хранения битовых переменных выделяется один бит в памяти данных, а не машинное слово, как это делается в универсальных микропроцессорах (компьютерах).
В битовой области сосредоточено только 128 флагов. Битовая адресация возможна также в области регистров специальных функций (см. табл. 6.4). Наиболее яркий пример использования битовой адресации в данной области — это обращение к отдельным выводам параллельных портов:
CPL 92 ;Проинвертировать второй бит порта Р1