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!
Hi
Ich hab mal ein kleines Problem:
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 :Code:'============================================= ' 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
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 ß
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!
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:
Code: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
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.
Manchmal "hängt die Kiste sich auch auf". Dann kommen sekundenlang keine Tasten rein. Manchmal gehts dann von selber wieder, manchmal muss ich resetten.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
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![]()
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/...cancodes2.html
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.
Lesezeichen