Косвенно-регистровая адресация по сумме базового и индексного регистров (содержимое аккумулятора А) упрощает просмотр таблиц, записанных в памяти программ. Любой байт из таблицы может быть выбран по адресу, определяемому суммой содержимого DPTR или PC и содержимого A, например:
83 MOVC A,@A+PC ;В первом операнде использована неявная адресация, а во втором - косвенно-регистровая
93 MOVC A,@A+DPTR ;B первом операнде использована неявная адресация, а во втором - косвенно-регистровая
Непосредственная адресация позволяет выбрать из адресного пространства памяти программ константы, явно указанные в команде, например:
7414 MOV A, #14h ;B первом операнде использована неявная адресация, а во втором - непосредственная
902048 MOV DPTR, #2048h ;B первом операнде использована неявная адресация, а во втором - непосредственная
Полный список команд микроконтроллеров семейства MCS-51, упорядоченный по коду команды, приведен в приложении, табл. ПЗ.
Устройство параллельных портов микроконтроллеров MCS-51
Порты ввода-вывода Р0, P1, P2, РЗ являются квазидвунаправленными и обеспечивают обмен информацией между микроконтроллером и внешними устройствами, образуя 32 линии ввода-вывода. Каждый из портов содержит 8-разрядный регистр, имеющий байтовую и битовую адресацию для установки (запись логической 1) или сброса (запись логического 0) разрядов этого регистра с помощью программного обеспечения микроконтроллера. Выходы этих регистров соединены с внешними выводами микросхемы. Все разряды параллельных портов устроены одинаково.
Упрощенная схема одного разряда параллельного порта микроконтроллера показана на рис. 6.2. Отличаются только выводы порта Р0, у которых отсутствуют внутренние генераторы тока в верхней части схемы.

Рис. 6.2. Упрощенная схема одного бита параллельного порта
Один разряд регистра-защелки порта представляет собой D-триггер, запись входных данных в который происходит по высокому уровню синхросигнала. На рис. 6.2 этот сигнал назван "запись в защелку". Сигнал с инвертирующего выхода триггера умощняется при помощи МОП-транзистора и поступает на внешний вывод микросхемы.

Рис. 6.3.Схема подключения светодиодных индикаторов к параллельному порту
Естественно, что внутреннее устройство порта намного сложнее приведенного на рис. 6.2. Упрощение сделано для облегчения понимания работы параллельных портов микроконтроллера. Желающие более подробно познакомиться с внутренним устройством параллельных портов микроконтроллера могут обратиться к техническому описанию конкретной микросхемы.
Внутренняя схема порта построена таким образом, чтобы максимально упростить подключение внешних устройств к микроконтроллеру. Например, умощняющий внешний транзистор может быть подключен непосредственно базой к выводу микроконтроллера без дополнительного токоограничивающего резистора, как показано на рис. 6.3. Это становится возможным благодаря внутреннему генератору тока.
Значение сигнала непосредственно с внешнего вывода порта считывается по сигналу "чтение вывода". Однако при выполнении операций с отдельными битами требуется считывать содержимое внутреннего регистра-защелки порта. Если база биполярного транзистора непосредственно подключена к выводу порта, то считывание значения логической 1 с вывода порта становится невозможным. Дело в том, что напряжение на р-n-переходе база-эмиттер транзистора не может превысить ~0,7 В (для кремниевого транзистора). Такое напряжение однозначно будет воспринято цифровой схемой как логический ноль, поэтому при выполнении операций над отдельными битами параллельного порта считывание производится непосредственно с выхода регистра-защелки порта. При этом выход Q D-триггера подключается к внутренней шине (считывается) по сигналу "чтение защелки".
Чтение внешних выводов порта РЗ осуществляется командами:
MOV А, РЗ ;Скопировать состояние выводов порта РЗ в аккумулятор
JB P3.4, Metka ;Если на выводе 4 порта РЗ логическая 1, то перейти на метку Metka
Чтение регистра-защелки осуществляется командами чтение-чтение-модификация-запись. Например:
CPL Р3. 1 ;Проинвертировать сигнал на выводе 1 порта РЗ
ORL Р2, #56h ;Установить единичный сигнал на выводах 1, 2, 4 и 6 порта Р2
ANL Р3, #03h ;Установить нулевой сигнал на выводах 0 и 1 порта РЗ
SETB Р3. 1 ;Установить высокий потенциал на выводе 1 порта РЗ
Порты микросхемы служат для управления внешними устройствами, подключенными к микроконтроллеру. Схема подключения простейших внешних устройств приведена на рис. 6.3. Он иллюстрирует особенности подключения светодиодных индикаторов к параллельным портам микроконтроллера MCS-51.
Присутствие в схеме порта выходного мощного транзистора позволяет подключать к выводам порта светодиодные индикаторы непосредственно, без усилителя мощности. Однако при этом необходимо следить за максимальной допустимой мощностью, рассеиваемой на микросхеме и отдельных выводах порта. Эквивалентная схема, на которой показан путь протекания выходного тока порта, приведена на рис. 6.4. Как видно из приведенной схемы именно выходной ток порта I0 используется для зажигания светодиода.

Рис. 6.4.Эквивалентная схема подключения светодиодного индикатора к параллельному порту
Для умощнения выводов порта можно применить транзисторный ключ, показанный также на рис. 6.3. Эта же схема используется при низковольтном питании микроконтроллера. Напряжения 3,3 В недостаточно для получения стабильного и большого тока через светодиод. Обратите внимание, что база транзистора подключена непосредственно к выводу порта. Это стало возможным только благодаря использованию в схеме порта генератора тока в верхнем плече выходного каскада.
Если выходного тока порта достаточно для открывания транзисторного ключа, то резистор R2 не используется. Этот резистор подключают для увеличения тока базы транзисторного ключа. На максимальное значение этого тока накладываются те же ограничения, что и для непосредственного подключения светодиодного индикатора к выводам порта. Резистор R3 рассчитывается исходя из допустимого тока через светодиод VD2. При возможности выбора напряжения питания для светодиодов лучше выбрать более высокое напряжение. Это позволит обеспечить более равномерное свечение светодиодов, т. к. разброс параметров светодиодов будет оказывать меньшее влияние на разброс значений токов, протекающих через них.
Микроконтроллеры предназначены для управления внешними устройствами. Однако изменять напряжения на выводах параллельного порта микроконтроллера можно только при помощи программы, записанной в память программ. Какие напряжения необходимо подавать на выходы микросхемы, зависит от схемы подключения индикатора. В приведенной на рис. 6.3 схеме для зажигания светодиода VD1 в разряд 6 порта Р0 необходимо записать логический 0. Для зажигания светодиода VD2 необходимо в разряд 7 порта Р2 записать логическую единицу, а для его гашения - логический ноль.
Чтобы изменять потенциалы на выводах микросхемы, можно воспользоваться следующими командами с байтовой адресацией:
1. MOV (пересылка), например:
MOV Р1, #01110011Ь ;Выдать на все восемь выводов Р1 число 01110011
MOV РЗ, А ;Выдать на все восемь выводов РЗ содержимое АСС
2. ANL (логическое "И"), например:
ANL Р1, #11110011b ;выдать низкий потенциал на выводах Р1.2 и Р1.3
3. XRL (исключающее "ИЛИ"), например:
XRL РЗ, #01000100Ь ;инвертировать состояние выводов РЗ.2 и Р3.6
4. ORL (логическое "ИЛИ"), например:
ORL Р1, #00001100b ;выдать высокий потенциал на выводах Р1.2 и Р1.3
Эти команды изменяют потенциал сразу на нескольких выводах порта.
Для изменения потенциалов только на одном выводе микросхемы можно воспользоваться следующими командами с битовой адресацией:
1. MOV (пересылка), например:
MOV P1.2, С ;выдать содержимое бита переноса через вывод 2 порта Р2
2. CPL (инверсия), например:
CPL Р1.2 ; проинвертировать 2-й бит порта Р2
3. SETB (установить бит), например:
SETB Р2.3 ; выдать высокий потенциал на вывод 3 порта Р2
4. CLR (сбросить бит), например:
CLR Р2. 3 ; выдать низкий потенциал на вывод 3 порта Р2