Seite 1 von 1
Multikey
Verfasst: So 15. Okt 2023, 11:03
von PIC18F2550
Hallo,
der Tastaturtreiber (PS2) liefert nur den ASCII code der zuletzt gedrückten Taste.
Ich müsste aber wissen ob mehrere Tasten gleichzeitig gedrückt sind und welche.
So eine Art Scancodetabelle wo vermerkt ist gedrückt oder nicht.
Gibt es sowas in der Art?
Danke.
Re: Multikey
Verfasst: Sa 21. Okt 2023, 12:29
von yeti
Die PS/2-Tastatur müsste Taste-Drück- und Taste-Loslaß-Codes liefern.
Such mal im Treiber nach "release" oder anderen fremdzüngigen Andeutungen von loslassen...
Re: Multikey
Verfasst: So 22. Okt 2023, 14:44
von PIC18F2550
Das müsste die Stelle sein wo der Scancode ermittelt wird.
Mal sehen wie das funktioniert.
Code: Alles auswählen
'
' Get scancode
'
newcode mov stat,#0 'reset state
:same call #receive 'receive byte from keyboard
cmp data,#$83+1 wc 'scancode?
if_nc cmp data,#$AA wz 'powerup/reset?
if_nc_and_z jmp #configure
if_nc cmp data,#$E0 wz 'extended?
if_nc_and_z or stat,#1
if_nc_and_z jmp #:same
if_nc cmp data,#$F0 wz 'released?
if_nc_and_z or stat,#2
if_nc_and_z jmp #:same
if_nc jmp #newcode 'unknown, ignore
'
'
' Translate scancode and enter into buffer
'
test stat,#1 wc 'lookup code with extended flag
rcl data,#1
mov data_s,data 'keyboard-de: store scancode for next table lookup with shift
call #look
cmp data,#0 wz 'if unknown, ignore
if_z jmp #newcode
mov t,_states+6 'remember lock keys in _states
mov x,data 'set/clear key bit in _states
shr x,#5
add x,#_states
movd :reg,x
mov y,#1
shl y,data
test stat,#2 wc
:reg muxnc 0,y
if_nc cmpsub data,#$F0 wc 'if released or shift/ctrl/alt/win, done
if_c jmp #update
mov y,_states+7 'get shift/ctrl/alt/win bit pairs
shr y,#16
cmpsub data,#$E0 wc 'translate keypad, considering numlock
if_c test _locks,#%100 wz
if_c_and_z add data,#@keypad1-@table
if_c_and_nz add data,#@keypad2-@table
if_c call #look
if_c jmp #:flags
'for keyboard-de changed #$DD to #lock
'in next code segment
cmpsub data,#lock wc 'handle scrlock/capslock/numlock
if_c mov x,#%001_000
if_c shl x,data
if_c andn x,_locks
if_c shr x,#3
if_c shr t,#29 'ignore auto-repeat
if_c andn x,t wz
if_c xor _locks,x
if_c add data,#lock
if_c_and_nz or stat,#4 'if change, set configure flag to update leds