В тексте программы роутера для управления кабиной XL-29 есть фрагмент считывания состояния кнопок джойстика. Там только 4 кнопки, но сам джойстик имеет 8 кнопок.
Может, кто подсказать, что нужно дописать, чтобы считывалось показание всех 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 ) ;
В начале дописать такие же паттерны, но для 1000b, 100b, 10b и 1b в «and al» и, соответственно, в «shr al» у тебя будут уже 3, 2, 1 и 0. Только не забудь, что в конце каждого паттерна регистр al сохраняется в каку-то переменную (knopkaN), которую надо заранее определить. Ну и в label14.Caption сам допишешь?
В начале дописать такие же паттерны, но для 1000b, 100b, 10b и 1b в «and al» и, соответственно, в «shr al» у тебя будут уже 3, 2, 1 и 0.
Спасибо! Но так я уже пробовал. Не работает! Считываются нули.
Ну вот даже еще раз попробовал.
////////// кнопки джойстика /////////
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 постоянно нули.
В восьмибитном порту 201H сидит информация о состоянии только четырёх кнопок (в битах D7-D4), потому что биты D3-D0 заняты координатной информацией. Размещать инфу о состоянии ещё четырёх кнопок там просто негде.
С восьмикнопочным джойстиком никогда не работала, но думаю, что для получения сведений о состоянии остальных 4-х кнопок нужно либо работать с портом 201H как с 16-битным (то есть, юзать команду IN AX,DX), либо лезть в какой-то другой порт, кроме 201H.
Возможны также другие варианты, но лучше вперёд не забегать и проверить это.
Жмите на разные кнопки, а в процедуре обработки прерываний записывайте копию слова, считанного из порта 201H в регистр AX, прямо в память. И посмотрите отладчиком, в каких битах что сидит. Тогда станет ясно, как запрограммировать съём состояния дополнительных четырёх кнопок.
и ещё если читать слишком часто, то вот эта конструкция:
out dx,al
разряжает конденсаторы аналоговых входов, для заряда которых через подтягивающие резисторы- надо время .
Скорей всего она вообще не нужна при опросе порта только с кнопками