Цитата(vmp @ Aug 9 2007, 10:13)

Если на разных портах - то никак. В MCS-51 для этого адресного пространства косвенная адресация не предусмотрена.
Можно, если программа выполняется из внешней памяти и есть внешний RAM.
В этом случае можно в Run-Time (на лету) формировать требуемый опкод. Для этого надо знать только то, что:
Адреса битов формируются прозрачно
битовое адресное пространсто покрывает от 0 до 255.
Биты SFR регистров соответвуют адресу регистра + номер бита.
Например если адрес порта P1 == 90h в адресном пространстве SFR,
то адреса битов этого порта будут соответственно:
P1.0 -> 90h
P1.1 -> 91h
..
P1.7 -> 97h
Команды обращения к битам состоят из опкода и адреса бита.
Например MOV P1.1, C --> 0x92 0x91 (где - 0x92 - опкод, 0x91 - адрес бита).
SETB P1.1 --> 0xD2 0x91 (где 0xD2 - опкод, 0x91 - адрес бита)
CLR P1.1 --> 0xC2 0x91 (где 0xC2 - опкод, 0x91 - адрес бита).
Исходя из этого в ОЗУ формируем пару функций
SETB 0xXX.X
RET
(0xD2 0xXX 0x22)
и
CLR 0xXX.X
RET
(0xC2 0xXX 0x22)
В Run-Time достаточно подменять 0xXX на адрес нужного бита, и получится косвенная адресация битов.
Цитата(gena1959 @ Aug 9 2007, 09:38)

Есть некоторое количество выводов контроллера, к которым подключены DS1820. Функция, которая измеряет температу, не успевает формировать временные интервалы необходимой длительности, если из нее вызывать другую, которая выбирает нужный вывод.
А если создать несколько функций
к примеру таких:
Код
void SetP1_1(void)
{
P1^1 = 1;
}
void SetP1_2(void)
{
P1^2 = 1;
}
и т.д.
И передавать адрес функции.