Цитата(prottoss @ Jul 18 2008, 21:02)

Можно, но я пытаюсь обсудить то, что написано в заголовке темы. Другие варианты в данном случе не приемлемы.
Вот так у меня организован опрос блока джамперов для AVR на ассемблере. Может пригодится...
Код
[font="Courier"]; PORT D
;
; bModeB1 ------0 -2- 0---+
; |
; 3 1 |
; |
; bModeB2 ------0 -4- 0---+
; |
; 5 1 |
; |
; bModeB3 ------0 -6- 0---+
; _|_
;
; Выбор времени работы клапана
; Возможные значения: 10, 20, 30, 40, 50 или 60 секунд.
;
; bModeB1, bModeB2 и bModeB3 подтянуты к напряжению питания при помощи внутренних резисторов МК.
; Перемычка может занять одно из 7-ми положений.
; Если bModeB1, bModeB2 и bModeB3 не замкнуты на землю и не замкнуты между собой - выбран режим № 1
; Если bModeB1 замкнут перемычкой на "землю" - выбран режим № 2
; Если bModeB2 замкнут перемычкой на "землю" - выбран режим № 4
; Если bModeB3 замкнут перемычкой на "землю" - выбран режим № 6
; Если bModeB2 замкнут перемычкой с bModeB1 - выбран режим № 3
; Если bModeB2 замкнут перемычкой с bModeB3 - выбран режим № 5
;
;.def ModeB = R20 ; Режим работы B (10, 20, 30, 40, 50 или 60 секунд)
;
GetTimeB:
;---------------------------------------;
_TestBM2: ; Тестирование линии B1 - режим № 2
sbic PinD, bModeB1 ; Пропустить следующую команду, если bModeB1 = 0
rjmp _TestBM4 ; Иначе перейти к тестированию линии B2 - режим № 4
ldi Temp, 20 ; Выбран режим № 2 - 20 секунд
rjmp _GetTimeB ; Выход
_TestBM4: ; Тестирование линии B2 - режим № 4
sbic PinD, bModeB2 ; Пропустить следующую команду, если bModeB2 = 0
rjmp _TestBM6 ; Иначе перейти к тестированию линии B3 - режим № 6
ldi Temp, 40 ; Выбран режим № 4 - 40 секунд
rjmp _GetTimeB ; Выход
_TestBM6: ; Тестирование линии B3 - режим № 6
sbic PinD, bModeB3 ; Пропустить следующую команду, если bModeB3 = 0
rjmp GetExTimeB ; Иначе тестируем линии B2 & B1 - режим № 3
ldi Temp, 60 ; Выбран режим № 6 - 60 секунд
rjmp _GetTimeB ; Выход
;---------------------------------------;
GetExTimeB: ; *** ВХОД В РАСШИРЕННЫЙ РЕЖИМ ***
cbi PortD, bModeB2; Установить логический 0 на выходе bModeB2
sbi DDRD, bModeB2 ; Установить bModeB2 как выход
rjmp PC+1 ; Подождать установки уровня
;-------------------------------;
_TestBM3: ; Тестирование линии B2 & B1 - режим № 3
sbic PinD, bModeB1 ; Пропустить, если bModeB1 = 0 - режим № 3
rjmp _TestBM5 ; Иначе тестируем линии B2 & B3 - режим № 6
ldi Temp, 30 ; Выбран режим № 3 - 30 секунд
rjmp _GetExTimeB ; Выход
_TestBM5: ; Тестирование линий B2 & B3 - режим № 5
sbic PinD, bModeB3 ; Пропустить, если bModeB3 = 0 - режим № 5
rjmp _TestBM1 ; Иначе тестируем линии B1 & B2 & B2 - режим № 1
ldi Temp, 50 ; Выбран режим № 5 - 50 секунд
rjmp _GetExTimeB ; Выход
_TestBM1: ; Тестирование линий B1 & B2 & B3 - режим № 1
ldi Temp, 10 ; Выбран режим № 1 - 10 секунд
;-------------------------------;
_GetExTimeB: ; *** ВЫХОД ИЗ РАСШИРЕННОГО РЕЖИМА ***
cbi DDRD, bModeB2 ; Установить bModeB2 как вход
sbi PortD, bModeB2; Установить логический 1 (подтягивающий резистор) для bModeB2
;---------------------------------------;
_GetTimeB:
ret
;[/font]