Однокристальные микроконтроллеры семейства MCS-51. Команды передачи данных. Пересылка в аккумулятор прямоадресуемого байта, страница 4

Эта программа записывает данные из регистра R3 в ячейку с адресом 10H внешней памяти данных, а затем читает данные из ячейки с адресом 18H ВПД и пересылает их в регистр R6.

Так как в исследуемой программе используется внешняя память данных, то для ее работы требуется загрузить в симулятор файл  ram (без расширения), имеющийся в вашей папке. Этот файл формирует в симуляторе внешнюю память данных размером 1К ячеек. В файле  ram (в формате Intel Hex) содержатся начальный адрес 0000H, конечный – 03FFH и данные для начальной загрузки ячеек ВПД – 00H.

Для загрузки файла ram необходимо выполнить команды из меню команд симулятора:

LOAD  à  DATA

Затем в командной строке необходимо набрать имя файла  ram  и нажать клавишу Enter:

Enter  Filename:  ram

При отладке программы нужно будет следить за правильностью передачи данных между МК и ВПД. Согласно тексту программы задействованы будут ячейки с адресами 0010H и 0018H.

Используем нижнее окно Data Space (область Dump 2) для отображения ячеек ВПД, начиная с адреса 0000H. С этой целью необходимо выполнить команду:

DUMP

Затем в командной строке ввести номер дампа 2:

Select  DUMP : 2

Затем выбрать команду задания типа адресации ячеек дампа:

Absolute

И, наконец, в командной строке набрать начальный адрес области ВПД (дампа 2) в HEX-коде:

Enter Expression in Data Address Space:  X: 0000H

После нажатия клавиши Enter убеждаемся, что нижнее окно получило название External Data Space, т.е. внешняя память данных, а начальный адрес стал 0000H. Во всех ячейках ВПД записаны нули.

Исследуйте работу программы в пошаговом режиме, предварительно задав исходные данные: в регистре R3 число 55H, а в ячейке ВПД с адресом 0018H – число AAH. Наблюдайте за изменением содержимого регистров, ячеек памяти, а также за флагами МК.

3.6. Исследование команд обмена

Запишите в память программ симулятора коды команд:

MOV   A, #0AAH      ; Загрузить в аккумулятор число AAH

MOV   R1, #11H        ; Загрузить в аккумулятор число 11H

MOV   30H, #33H      ; Загрузить в ячейку 30H число 33H

MOV   B, #0BBH       ; Загрузить в регистр B число BBH

XCH    A, R1              ; Обмен аккумулятора с регистром R1

XCH    A, 30H            ; Обмен аккумулятора с ячейкой ПД

XCH    A, B                ; Обмен аккумулятора с регистром B

MOV   R0, #30H        ; Загрузить в R0 адрес ячейки ПД

MOV  @R0, # 33H    ; Загрузить в ячейку ПД число 33H

MOV   A, #55H         ; Загрузить в аккумулятор число 55H

XCHD  A, @R0        ; Обмен младшей тетрады аккумулятора с младшей тетрадой

; ячейки ПД

NOP

Исследуйте работу программы в пошаговом режиме. Наблюдайте за изменением содержания регистров, ячеек памяти, а также флагами МК.

3.7.  Исследование команд чтения из памяти программ

В микроконтроллерах семейства МК51 имеется возможность прочитать данные из памяти программ, в том числе для выборки элемента с порядковым номером из таблицы. Обычно для этих целей используется команда

MOVC  A, @A + DPTR.

Действие этой команды можно описать так: переслать в аккумулятор содержимое ячейки памяти программ, адрес которой вычисляется сложением двухбайтного значения регистра-указателя данных DPTR с однобайтным беззнаковым операндом из аккумулятора. Эту же операцию можно интерпретировать, как чтение элемента с номером, который задан в аккумуляторе, из таблицы с начальным адресом, который хранится в DPTR. 

Рассмотрим применение этой команды на примере вычисления функций с помощью таблиц. Предположим, что нужно иметь программу вычисления квадрата целого десятичного числа X в диапазоне от 0 до 10 включительно. Для вычисления используем подпрограмму SQ, которая выбирает результаты из таблицы SQTAB, размещенной в памяти программ. Текст подпрограммы:

;****************************************************************

; SQ – подпрограмма вычисления квадрата числа

; Входной параметр: регистр R7 – десятичное число в HEX-коде

; Выходной параметр: регистр A – квадрат исходного числа в HEX-коде

;*****************************************************************

SQ:             MOV   A,R7                ; Пересылка исходного числа в аккумулятор

MOV   DPTR, #SQTAB  ; Загрузить в DPTR адрес таблицы SQTAB

MOVC  A, @A+DPTR   ; Пересылка в аккумулятор данных из таблицы