PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abfragecodes für Tastatur (Bascom)



olee
04.12.2007, 21:10
Hi

Ich hab mal ein kleines Problem:



'=============================================
' PS/2 - Tastatur abfrage
'=============================================

$regfile = "m8def.dat"
$crystal = 8000000
'$baud = 9600

Config Portd = Output

Config Keyboard = Pinb.0 , Data = Pinb.1 , Keydata = Keydata

Dim Cursorposx As Byte
Dim Cursorposy As Byte
Dim Key As Byte
Dim S As String * 16 At $400 'Beide Variablen, String und Byte() liegen
Dim B(16) As Byte At $400 Overlay 'an der gleichen Stelle im Speicher

'===== Command ===========================================
Dim Text as String * 16
'====== Timer =============================================
Dim Seconds As Integer
Dim Hours As Integer
Dim Minutes As Integer
'================================================= =========

$serialinput = Kbdinput

Declare Sub TimerT
Declare Sub Write_nible(byval D As Byte) 'ein Nible (D4-D7) schreiben
Declare Sub Lcd_write_data(byval D As Byte) 'ins Datenregister schreiben
Declare Sub Lcd_write_string 'String S ausgeben

Initlcd
Cls

Cursor On Blink

Lowerline
S = "Tastatur + Timer"
Call Lcd_write_string
Home

Cursorposx = 1
Cursorposy = 1
Text = ""

Do
Key = Getatkbd()

If Key <> 0 Then
If Key = 8 Then
Shiftcursor Left
S = " "
Call Lcd_write_string
Cursorposx = Cursorposx - 1
End If

If Key = 52 Then
Cursorposx = Cursorposx - 1
End If

If Key = 54 Then
Cursorposx = Cursorposx + 1
End If

If Key = 44 Then
S = " "
Call Lcd_write_string
Shiftcursor Left
End If

If Key = 56 Then
Cursorposy = 1
End If

If Key = 50 Then
Cursorposy = 2
End If

If Key <> 54 And Key <> 8 And Key <> 0 And Key <> 52 And Key <> 56 And Key <> 50 Then
Cursorposx = Cursorposx + 1
S = Chr(key)
Call Lcd_write_string
Text = Text + Chr(key)
End If

If Key = 13 Then
s = LCase(Text)
If Left(s , 5) = "timer" then TimerT
Text = ""
Cls
Home
Cursorposx = 1
Cursorposy = 1
End If

If Cursorposx < 1 And Cursorposy = 2 Then
Cursorposx = 16
Cursorposy = 1
End If
If Cursorposx < 1 And Cursorposy = 1 Then Cursorposx = 1
If Cursorposx > 16 And Cursorposy = 1 Then
Cursorposx = 1
Cursorposy = 2
End If
If Cursorposx > 16 And Cursorposy = 2 Then Cursorposx = 16
Locate Cursorposy , Cursorposx

End If
Loop


End


'================================================= =========
'================================================= =========
Sub TimerT

Deflcdchar 1 , 32 , 10 , 32 , 4 , 32 , 17 , 14 , 32 'little Smily
Deflcdchar 2 , 32 , 12 , 12 , 32 , 32 , 1 , 1 , 32 'big Smily ol
Deflcdchar 3 , 32 , 6 , 6 , 32 , 32 , 16 , 16 , 32 'big Smily or
Deflcdchar 4 , 32 , 24 , 28 , 15 , 3 , 32 , 32 , 32 'big Smily ul
Deflcdchar 5 , 32 , 3 , 7 , 30 , 24 , 32 , 32 , 32 'big Smily ur
Cls

Seconds = 0
Minutes = 0
Hours = 0

'Config Portb.1 = Output
'Config Portb.0 = Input

Cls
Lowerline
S = "By Bjoern " + Chr(1) + " " + Chr(4) + Chr(5)
Call Lcd_write_string

Do
Cursor Off
Waitms 110

Incr Seconds
If Seconds = 60 Then
Incr Minutes
Seconds = 0
End If

If Minutes = 60 Then
Incr Hours
Minutes = 0
End If

Home
Upperline

If Hours < 10 Then
S = "0" + Str(hours)
Else
S = " " + Str(hours)
End If

If Minutes < 10 Then
S = S + ":0" + Str(minutes)
Else
S = S + ":" + Str(minutes)
End If

If Seconds < 10 Then
S = S + ":0" + Str(seconds) + " Uhr " + Chr(2) + Chr(3)
Else
S = S + ":" + Str(seconds) + " Uhr " + Chr(2) + Chr(3)
End If

Call Lcd_write_string
Home

Portb.0 = 1
If Pinb.1 = 0 Then
Hours = -1
end IF
Loop until Hours = -1
End SUB


'================================================= =========
'================================================= =========
'================================================= =========
Sub Write_nible(byval D As Byte)
If D.4 = 1 Then Portd.0 = 1 Else Portd.0 = 0
If D.5 = 1 Then Portd.1 = 1 Else Portd.1 = 0
If D.6 = 1 Then Portd.2 = 1 Else Portd.2 = 0
If D.7 = 1 Then Portd.3 = 1 Else Portd.3 = 0
Portd.5 = 1
Waitus 5
Portd.5 = 0
End Sub
'================================================= =========
Sub Lcd_write_data(byval D As Byte)
Portd.4 = 1
Call Write_nible(d)
Waitus 50
D = D * 16
Call Write_nible(d)
Waitus 50

End Sub
'================================================= =========
Sub Lcd_write_string
Dim Istring As Byte
For Istring = 1 To Len(s)
Call Lcd_write_data(b(istring))
Next Istring
End Sub
'================================================= =========
'================================================= =========
'================================================= =========


Kbdinput:
'we come here when input is required from the COM port
'So we pass the key into R24 with the GetATkbd function
' We need some ASM code to save the registers used by the function
$asm
push r16 ; save used register
push r25
push r26
push r27

Kbdinput1:
rCall _getatkbd ; call the function
tst r24 ; check for zero
breq Kbdinput1 ; yes so try again
pop r27 ; we got a valid key so restore registers
pop r26
pop r25
pop r16
$end Asm
'just return
Return

'The tricky part is that you MUST include a normal call to the routine
'otherwise you get an error
'This is no clean solution and will be changed
Key = Getatkbd()

Keydata:
'normal keys lower case
Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

'shifted keys UPPER case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0



Mit diesem einfachen Programm kann ich jetzt schon Tasten Abfragen. Mein Problem ist nun, dass eine menge Sondertasten in der von Bascom bereitgestellten Tabelle fehlen :

Keydata:
'normal keys lower case
Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

'shifted keys UPPER case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

Kann mir jemand da mal helfen ß

BASTIUniversal
05.12.2007, 15:54
Ich weiß ja nicht, ob du dir das RN schon mal näher angeschaut hast...aber es gibt hier ein

Extra Forum für Bascom

Verschoben!

Jaecko
06.12.2007, 15:03
Ich hab vor kurzem mal so ne Tastatur "analyisert"; dabei hab ich die ganzen Zahlen bei KeyData von 0, 1, 2, ... 253, 254, 255 durchnumeriert und mir die Codes, die beim Drücken einer Taste erzeugt werden, auf nem LCD darstellen lassen. Also wenn ich F4 drücke, wird mir die 12 angezeigt. Die Daten hab ich dann auch gleich so gelassen und arbeite direkt mit den "sortieren" Zahlen weiter.

Der Datenblock sieht dann also in etwa so aus
KeyData:
DATA 0,1,2,3....

Evtl hilft die Tabelle hier:



a 28
b 50
c 33
d 35
e 36
f 43
g 52
h 51
i 67
j 59
k 66
l 75
m 58
n 49
o 68
p 77
q 21
r 45
s 27
t 44
u 60
v 42
w 29
x 34
y 26
z 53
A 156
B 178
C 161
D 163
E 164
F 171
G 180
H 179
I 195
J 187
K 194
L 203
M 186
N 177
O 196
P 205
Q 149
R 173
S 155
T 172
U 188
V 170
W 157
X 162
Y 154
Z 181
1 22
2 30
3 38
4 37
5 46
6 54
7 61
8 62
9 70
0 69
! 150
" 158
§ 166
$ 165
% 174
& 182
/ 189
( 190
) 198
= 197
CAPS LOCK 88
TAB 13
^ 14
° 142
ß 78
? 206
ENTER 90
RÜCK 102
Taste Oben 224, 224, 117
Taste Unten 224, 224, 114
Taste Links 224, 224, 107
Taste Rechts 224, 224, 116
INS 224, 224, 112
DEL 224, 224, 113
HOME 224, 224, 108
END 224, 224, 105
PGUP 224, 224, 125
PGDN 224, 224, 122
ESC 118
SHIFT + INS 96, 96, 96, 240
SHIFT + DEL 96, 96, 96, 241
SHIFT + HOME 96, 96, 96, 236
SHIFT + END 96, 96, 96, 233
SHIFT + PGUP 96, 96, 96, 253
SHIFT + PGDN 96, 96, 96, 250
SHIFT + ESC 246
STRG L 20
STRG R 224, 224, 20
Windows L 224, 224, 31
Windows R 224, 224, 39
ALT 17
Space 41
ALT GR 224, 224, 17
SHIFT + ALT 145
SHIFT + CTRL 148
SHIFT + SPACE 169
SHIFT + ALTGR 96, 96, 145
SHIFT + Windows L 96, 96, 159
SHIFT + Windows R 96, 96, 167
Kontext 224, 224, 47
SHIFT + Kontext 96, 96, 167
DRUCK 224, 224, 224, 124
SHIFT + Druck 96, 96, 252
Rollen 126
SHIFT + Rollen 254
Pause 225, 119
Shift + Pause 97,247
Wake Up 224, 224, 94
SHIFT + WakeUp 96, 96, 222
Sleep 224, 224, 63
Shift + Sleep 96,96,191
Power 224, 224, 55
SHIFT + Power 96,96,183
F1 5
F2 6
F3 4
F4 12
F5 3
F6 11
F7 131
F8 10
F9 1
F10 9
F11 120
F12 7
SHIFT + F1 133
SHIFT + F2 134
SHIFT + F3 132
SHIFT + F4 140
SHIFT + F5 131
SHIFT + F6 139
SHIFT + F7 3
SHIFT + F8 138
SHIFT + F9 129
SHIFT + F10 137
SHIFT + F11 148
SHIFT + F12 135
Num Lock 119
SHIFT + NumLock 247
Numpad / 224,224,74
SHIFT + Numpad / 96,96,96,202
Numpad * 124
SHIFT + Numpad * 252
ä 82
Ä 210
ö 76
Ö 204
ü 84
Ü 212
+ 92
* 219
# 93
' 221
, 65
; 193
. 73
: 201
- 74
_ 202
< 97
> 225
Numpad - 123
SHIFT + Numpad - 251
Numpad + 121
SHIFT + Numpad + 249
Numpad 0 112
Numpad 1 105
Numpad 2 114
Numpad 3 122
Numpad 4 107
Numpad 5 115
Numpad 6 116
Numpad 7 108
Numpad 8 117
Numpad 9 125
SHIFT + Numpad 0 240
SHIFT + Numpad 1 233
SHIFT + Numpad 2 242
SHIFT + Numpad 3 250
SHIFT + Numpad 4 235
SHIFT + Numpad 5 243
SHIFT + Numpad 6 244
SHIFT + Numpad 7 236
SHIFT + Numpad 8 245
SHIFT + Numpad 9 253
TAB 13
SHIFT + TAB 141
SHIFT + RÜCK 230
SHIFT + ENTER 218

brutzler
22.03.2008, 20:12
Hmm

Du hast die Numlock-Taste erkennen können?
Klappt bei mir nicht. Allerdings habn ich keine komplette Tastatur, sondern nur einen PS/2-10erBlock dran.
Alle anderen Tatsen funktionieren, nur der NUMLOCK nicht.

Hier mal der Code.


'----------------------------------------------------------------------------
' PC AT-KEYBOARD Sample
' (c) 2000-2003 MCS Electronics
'----------------------------------------------------------------------------
'For this example :
'connect PC AT keyboard clock to PIND.2 on the 8535
'connect PC AT keyboard data to PIND.4 on the 8535

$regfile = "m644def.dat"
$crystal = 18432000
$baud = 19200
$prog &H00 , &H00 , &H00 , &H00
'The GetATKBD() function does not use an interrupt.
'But it waits until a key was pressed!

'configure the pins to use for the clock and data
'can be any pin that can serve as an input
'Keydata is the label of the key translation table
Config Keyboard = Pinb.2 , Data = Pinb.3 , Keydata = Keydata

'Dim some used variables
Dim S As String * 12
Dim B As Byte


'Show the program is running
Print "hello"

Do
'The following code is remarked but show how to use the GetATKBD() function
B = Getatkbd()
'B = Getatkbdraw() 'get a byte and store it into byte variable
'When no real key is pressed the result is 0
'So test if the result was > 0
If B > 0 Then
Print B ; " " ; Chr(b)
End If

Loop
End


'This is the key translation table

Keydata:
'normal keys lower case
Data 0 , 0 , 0 , 0 , 0 , 200 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , &H5E , 0
Data 0 , 0 , 0 , 0 , 0 , 113 , 49 , 0 , 0 , 0 , 122 , 115 , 97 , 119 , 50 , 0
Data 0 , 99 , 120 , 100 , 101 , 52 , 51 , 0 , 0 , 32 , 118 , 102 , 116 , 114 , 53 , 0
Data 0 , 110 , 98 , 104 , 103 , 121 , 54 , 7 , 8 , 44 , 109 , 106 , 117 , 55 , 56 , 0
Data 0 , 44 , 107 , 105 , 111 , 48 , 57 , 0 , 0 , 46 , 45 , 108 , 48 , 112 , 43 , 0
Data 0 , 0 , 0 , 0 , 0 , 92 , 0 , 0 , 0 , 0 , 13 , 0 , 0 , 92 , 0 , 0
Data 0 , 60 , 0 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

'shifted keys UPPER case
Data 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
Data 0 , 0 , 0 , 0 , 0 , 81 , 33 , 0 , 0 , 0 , 90 , 83 , 65 , 87 , 34 , 0
Data 0 , 67 , 88 , 68 , 69 , 0 , 35 , 0 , 0 , 32 , 86 , 70 , 84 , 82 , 37 , 0
Data 0 , 78 , 66 , 72 , 71 , 89 , 38 , 0 , 0 , 76 , 77 , 74 , 85 , 47 , 40 , 0
Data 0 , 59 , 75 , 73 , 79 , 61 , 41 , 0 , 0 , 58 , 95 , 76 , 48 , 80 , 63 , 0
Data 0 , 0 , 0 , 0 , 0 , 96 , 0 , 0 , 0 , 0 , 13 , 94 , 0 , 42 , 0 , 0
Data 0 , 62 , 0 , 0 , 0 , 8 , 0 , 0 , 49 , 0 , 52 , 55 , 0 , 0 , 0 , 0
Data 48 , 44 , 50 , 53 , 54 , 56 , 0 , 0 , 0 , 43 , 51 , 45 , 42 , 57 , 0 , 0

Manchmal "hängt die Kiste sich auch auf". Dann kommen sekundenlang keine Tasten rein. Manchmal gehts dann von selber wieder, manchmal muss ich resetten.

brutzler
22.03.2008, 23:09
Jetzt hab ich mal den Befehl getatkbdraw() ausprobiert,

da sehe ich beim Numlock, wie auch bei allen anderen Keys, immer 2 Zahlen im Logfenster. z.B: Numlock 119,240 oder die 8: 117,240

Also erkennt er den Numlock doch.

Dann stimmt wohl was nicht in der Key translation table.

Um das herauszufinden wäre es nicht schlecht, wenn ich dafür eine Beschreibung hätte. Gibts dazu was?


Edit: Manchmal sind es dann doch 3 Zahlen die ich reinbekomme??? Jetz steh ich vollkommen daneben.......

Was soll die "240" immer in der Mitte???


HILFEEEE ](*,)

linux_80
23.03.2008, 01:53
Hi,

mit getatkbdraw() bekommst du ja die Rohdaten der PS/2 Tastatur, evtl. solltest du mal sehen wie das mit PS/2 läuft, und wie die Tastaturcodes aufgebaut sind.

240 ist in hex F0 und das ist dann der Break-Code, also wenn die Taste wieder losgelassen wurde.

Gib die Werte von getatkbdraw mit Hex() aus, dann kannst Du hier vergleichen:
http://www.computer-engineering.org/ps2keyboard/scancodes2.html

brutzler
23.03.2008, 06:32
Ja, genau das was ich suche und nicht verstanden habe. Danke

Was noch gesagt werden muss ist, daß die Keydatas aus dem Bascom Sample unvollständig/falsch sind. Die Taste "/" gehört von 45 auf 47 umgeschrieben und der NUMLOCK ist nur mit "0" eingetragen.
Aber jetz hab ichs gecheckt und kann jede Taste meines Nummernblockes einlesen.