Нужна помощь программиста.

В тексте программы роутера для управления кабиной XL-29 есть фрагмент считывания состояния кнопок джойстика. Там только 4 кнопки, но сам джойстик имеет 8 кнопок.
Может, кто подсказать, что нужно дописать, чтобы считывалось показание всех 8 кнопок джойстика?
Вот текс программы.

////////// кнопки джойстика /////////

asm
 cli
 mov dx,201h
 in al,dx
 and al,10000b
 shr al,4
 not al
 and al,01b
 mov knopka1,al

 in al,dx
 and al,100000b
 shr al,5
 not al
 and al,01b
 mov knopka2,al

 in al,dx
 and al,1000000b
 shr al,6
 not al
 and al,01b
 mov knopka3,al

 in al,dx
 and al,10000000b
 shr al,7
 not al
 and al,01b
 mov knopka4,al


 mov dx,201h
 mov al,0
 out dx,al

 sti
 end ;

label14.Caption := IntToStr( knopka1) +’ ‘ + IntToStr( knopka2) +’ ‘+ IntToStr( knopka3) +’ ‘ + IntToStr(knopka4 ) ;

Ответов: 7

Попробую посоветовать следующее:
В начале дописать такие же паттерны, но для 1000b, 100b, 10b и 1b в «and al» и, соответственно, в «shr al» у тебя будут уже 3, 2, 1 и 0. Только не забудь, что в конце каждого паттерна регистр al сохраняется в каку-то переменную (knopkaN), которую надо заранее определить. Ну и в label14.Caption сам допишешь?

Просмотр сообщенияLifeBurner (03 June 2010 — 12:56) писал:

Попробую посоветовать следующее:
В начале дописать такие же паттерны, но для 1000b, 100b, 10b и 1b в «and al» и, соответственно, в «shr al» у тебя будут уже 3, 2, 1 и 0.

Спасибо! Но так я уже пробовал. Не работает! Считываются нули.

А считываются с порта (mov dx,201h / in al,dx) или откуда?

Просмотр сообщенияLifeBurner (03 June 2010 — 15:48) писал:

А считываются с порта (mov dx,201h / in al,dx) или откуда?

Ну вот даже еще раз попробовал.
////////// кнопки джойстика /////////
asm
cli
mov dx,201h

in al,dx
and al,10b
shr al,1
not al
and al,01b
mov knopka5,al

in al,dx
and al,100b
shr al,2
not al
and al,01b
mov knopka6,al

in al,dx
and al,1000b
shr al,3
not al
and al,01b
mov knopka7,al

in al,dx
and al,10000b
shr al,4
not al
and al,01b
mov knopka1,al

in al,dx
and al,100000b
shr al,5
not al
and al,01b
mov knopka2,al

in al,dx
and al,1000000b
shr al,6
not al
and al,01b
mov knopka3,al

in al,dx
and al,10000000b
shr al,7
not al
and al,01b
mov knopka4,al

mov dx,201h
mov al,0
out dx,al

sti
end ;

label14.Caption := IntToStr( knopka1) +’ ‘ + IntToStr( knopka2) +’ ‘+ IntToStr( knopka3) +’ ‘ + IntToStr(knopka4 ) +’ ‘ + IntToStr(knopka5 ) +’ ‘ + IntToStr(knopka6 ) +’ ‘ + IntToStr(knopka7 );

knopka1 — knopka4 считываются 1 при нажатии, а knopka5 — knopka7 постоянно нули.

Просмотр сообщенияra3dcs (03 June 2010 — 16:30) писал:

knopka1 — knopka4 считываются 1 при нажатии, а knopka5 — knopka7 постоянно нули.

В восьмибитном порту 201H сидит информация о состоянии только четырёх кнопок (в битах D7-D4), потому что биты D3-D0 заняты координатной информацией. Размещать инфу о состоянии ещё четырёх кнопок там просто негде.

С восьмикнопочным джойстиком никогда не работала, но думаю, что для получения сведений о состоянии остальных 4-х кнопок нужно либо работать с портом 201H как с 16-битным (то есть, юзать команду IN AX,DX), либо лезть в какой-то другой порт, кроме 201H.

Возможны также другие варианты, но лучше вперёд не забегать и проверить это.

Жмите на разные кнопки, а в процедуре обработки прерываний записывайте копию слова, считанного из порта 201H в регистр AX, прямо в память. И посмотрите отладчиком, в каких битах что сидит. Тогда станет ясно, как запрограммировать съём состояния дополнительных четырёх кнопок.

Старшие кнопки подключены вместо потенциометров? При такой схеме возможно считать их состояние, только резисторы подтягивающие к 5в нужны — есть ли такое?

и ещё если читать слишком часто, то вот эта конструкция:

out dx,al

разряжает конденсаторы аналоговых входов, для заряда которых через подтягивающие резисторы- надо время .

Скорей всего она вообще не нужна при опросе порта только с кнопками

Это оказывается так сложно считать кнопки джойстика. Тогда легче оставить их стандартным функциям виндуса.