Hallo,
ich habe von euch soviel gelernt, dass ich natürlich so viel wie nur möglich zurückgeben will (einiges ist aber immernoch im Aufbau).
Vielleicht ist der eine oder andere beim integrieren einer Tastatur, so kann ich evtl. helfen![]()
Ziel:
Nutzung eines Ports (adc)
Mehrfachbelegung der Tastatur
Vor einiger Zeit sah ich ein Schema zu einer Tastatur über Spannungsteiler (sieht aus wie eine Matrix) von Manf.
Das war mein Leitfaden.
Nun hatte ich eine schöne simple Tastatur von einem Kumpel erhalten.
Diese wollte ich über einen analogen Port auswerten.
Die Bilder zur Tastatur sind im Anhang, die Farben ziehen sich durch alle Blätter - einheitlich).
Auf der Rückseite sind 2 Layer angebracht, die eine für die Umrandung und die andere für den Druckpunkt der Tasten. Den mittleren Layer konnte man mit einer Taschenlampe "verfolgen" (von anderer Seite durchleuchten).
Als die Hardware erledigt war, kam das programmieren. Da gab es gleich das Problem mit der Spannung. Diese müsste absolut konstant sein, wenn man direkt mit den Spannungswerten arbeitet.
Also habe ich der Tastatur 2x 100nF und einen 4,7yF Elko spendiert (siehe Zeichnung) und die Spannungen ausgelesen und die Werte aufgeschrieben.
Nun habe ich den Werten einen Toleranzbereich zugeordnet, indem etwas passiert (indem Fall einfach print ""). Jedoch war das sinnlos, da der Wert absolut identisch bleibt, falls die Spannungsquelle exakt identisch bleibt. Also habe ich danach mit den exakten Werten programmiert.
Aber was ist, wenn man die Spannungsquelle wechseln muss, oder ähnliches. Es reicht schon eine Differenz in 1/100 Bereich, um den erhaltenen Wert im 1/10 Bereich zu verändern.
Es blieb mir nichts anderes übrig, als alles abzuspeichern. Da Volt als single gespeichert ist, lag es auf der Hand alle Tastenspannungen auch als single abzuspeichern und vergleichen zu lassen.
Jetzt kann man durch die jeweilige Taste etwas im terminal anzeigen lassen, auf dem LCD, oder einen anderen Port damit steuern.
Zuvor muss man alle Tasten einmal drücken, diese Spannungswerte werden dann abgespeichert.
Man kann somit auch auf andere Spannungsquellen problemlos umsteigen.
Die Tastatur hat aber noch andere Zeichen (Mehrfachbelegung), also habe ich die "Ctrl", "Shift" und die "Alpha" Taste zum Umschalten missbraucht. Später kann ich dafür einen entsprechenden Schalter benutzen.
Nur die Taste "0" und die "3" haben sich überschnitten, sodass ich die Taste "Alt" als "0" betreibe.
abgespeckter Code (habe nur die Demo):
vollständiger Code (so soll er aussehen, aber ich kann ihn nicht testen, da er für die Demo zu groß ist ---> muss mir wohl die Vollversion kaufenCode:$regfile = "m32def.dat" $framesize = 32 $swstack = 256 $hwstack = 128 $crystal = 16000000 $baud = 9600 Config Adc = Single , Prescaler = Auto , Reference = Avcc Config Pina.0 = Input Config Pina.7 = Input Const Ref = 5 / 1023 Dim Volt As Single Dim Ws As Word Dim T1 As Single Dim T2 As Single Dim T3 As Single Dim T4 As Single Dim T5 As Single Dim T6 As Single Dim T7 As Single Dim T8 As Single Dim T9 As Single Dim T10 As Single Dim T11 As Single Dim T12 As Single Dim T13 As Single Dim T14 As Single Dim T15 As Single Dim T16 As Single Dim T17 As Single Dim T18 As Single Dim T19 As Single Dim T20 As Single Dim T21 As Single Dim T22 As Single Dim T23 As Single Dim T24 As Single Dim T25 As Single Dim T26 As Single Dim T27 As Single Dim T29 As Single Dim T30 As Single Declare Sub Initialisierung Declare Sub Speichern Declare Sub Terminal Do Print "start" Gosub Speichern Print "terminal" Gosub Terminal Loop Sub Terminal Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref If Volt = T1 Then Print "F1" Waitms 500 Elseif Volt = T2 Then Print "F2" Waitms 500 Elseif Volt = T3 Then Print "Pfeilnachoben" Waitms 500 Elseif Volt = T4 Then Print "Esc" Waitms 500 Elseif Volt = T5 Then Print "Backslash" Waitms 500 Elseif Volt = T6 Then Print "F3" Waitms 500 Elseif Volt = T7 Then Print "Pfeilnachlinks" Waitms 500 Elseif Volt = T8 Then Print "Pfeilnachunten" Waitms 500 Elseif Volt = T9 Then Print "Pfeilnachrechts" Waitms 500 Elseif Volt = T10 Then Print "Stern" Waitms 500 Elseif Volt = T11 Then Print "F4" Waitms 500 Elseif Volt = T12 Then Print "7" Waitms 500 Elseif Volt = T13 Then Print "8" Waitms 500 Elseif Volt = T14 Then Print "9" Waitms 500 Elseif Volt = T15 Then Print "Plus" Waitms 500 Elseif Volt = T16 Then Print "F5" Waitms 500 Elseif Volt = T17 Then Print "4" Waitms 500 Elseif Volt = T18 Then Print "5" Waitms 500 Elseif Volt = T19 Then Print "6" Waitms 500 Elseif Volt = T20 Then Print "Punkt" Waitms 500 Elseif Volt = T22 Then Print "1" Waitms 500 Elseif Volt = T23 Then Print "2" Waitms 500 Elseif Volt = T24 Then Print "3" Waitms 500 Elseif Volt = T25 Then Print "Enter" Waitms 500 Elseif Volt = T29 Then Print "Komma" Waitms 500 Elseif Volt = T30 Then Print "0" Waitms 500 End If Loop End Sub Sub Initialisierung Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref Loop Until Volt > 0 End Sub Sub Speichern Gosub Initialisierung T1 = Volt Print "F1" Waitms 500 Gosub Initialisierung T2 = Volt Print "F2" Waitms 500 Gosub Initialisierung T3 = Volt Print "Pfeilnachoben" Waitms 500 Gosub Initialisierung T4 = Volt Print "ESC" Waitms 500 Gosub Initialisierung T5 = Volt Print "Backslash" Waitms 500 Gosub Initialisierung T6 = Volt Print "F3" Waitms 500 Gosub Initialisierung T7 = Volt Print "Pfeilnachlinks" Waitms 500 Gosub Initialisierung T8 = Volt Print "Pfeilnachunten" Waitms 500 Gosub Initialisierung T9 = Volt Print "Pfeilnachrechts" Waitms 500 Gosub Initialisierung T10 = Volt Print "Stern" Waitms 500 Gosub Initialisierung T11 = Volt Print "F4" Waitms 500 Gosub Initialisierung T12 = Volt Print "L" Waitms 500 Gosub Initialisierung T13 = Volt Print "M" Waitms 500 Gosub Initialisierung T14 = Volt Print "N" Waitms 500 Gosub Initialisierung T15 = Volt Print "Plus" Waitms 500 Gosub Initialisierung T16 = Volt Print "F5" Waitms 500 Gosub Initialisierung T17 = Volt Print "Q" Waitms 500 Gosub Initialisierung T18 = Volt Print "R" Waitms 500 Gosub Initialisierung T19 = Volt Print "S" Waitms 500 Gosub Initialisierung T20 = Volt Print "Punkt" Waitms 500 Gosub Initialisierung T21 = Volt Print "Ctrl" Waitms 500 Gosub Initialisierung T22 = Volt Print "U" Waitms 500 Gosub Initialisierung T23 = Volt Print "V" Waitms 500 Gosub Initialisierung T24 = Volt Print "U" Waitms 500 Gosub Initialisierung T25 = Volt Print "Enter" Waitms 500 Gosub Initialisierung T26 = Volt Print "Shifttaste" Waitms 500 Gosub Initialisierung T27 = Volt Print "Alpha" Waitms 500 Gosub Initialisierung T29 = Volt Print "Komma" Waitms 500 Gosub Initialisierung T30 = Volt Print "Alt" Waitms 500 End Sub End):
So, nun ein paar Bilder der Tastatur:Code:$regfile = "m32def.dat" $framesize = 32 $swstack = 256 $hwstack = 128 $crystal = 16000000 $baud = 9600 Config Adc = Single , Prescaler = Auto , Reference = Avcc Config Pina.0 = Input Config Pina.7 = Input Const Ref = 5 / 1023 Dim Volt As Single Dim Ws As Word Dim T1 As Single Dim T2 As Single Dim T3 As Single Dim T4 As Single Dim T5 As Single Dim T6 As Single Dim T7 As Single Dim T8 As Single Dim T9 As Single Dim T10 As Single Dim T11 As Single Dim T12 As Single Dim T13 As Single Dim T14 As Single Dim T15 As Single Dim T16 As Single Dim T17 As Single Dim T18 As Single Dim T19 As Single Dim T20 As Single Dim T21 As Single Dim T22 As Single Dim T23 As Single Dim T24 As Single Dim T25 As Single Dim T26 As Single Dim T27 As Single Dim T29 As Single Dim T30 As Single Declare Sub Initialisierung Declare Sub Speichern Declare Sub Terminal Declare Sub Erstbelegung Declare Sub Zweittbelegung Declare Sub Dritttbelegung Do Print "start" Gosub Speichern Print "terminal" Gosub Terminal Loop Sub Speichern Gosub Initialisierung T1 = Volt Print "F1" Waitms 500 Gosub Initialisierung T2 = Volt Print "F2" Waitms 500 Gosub Initialisierung T3 = Volt Print "Pfeilnachoben" Waitms 500 Gosub Initialisierung T4 = Volt Print "ESC" Waitms 500 Gosub Initialisierung T5 = Volt Print "Backslash" Waitms 500 Gosub Initialisierung T6 = Volt Print "F3" Waitms 500 Gosub Initialisierung T7 = Volt Print "Pfeilnachlinks" Waitms 500 Gosub Initialisierung T8 = Volt Print "Pfeilnachunten" Waitms 500 Gosub Initialisierung T9 = Volt Print "Pfeilnachrechts" Waitms 500 Gosub Initialisierung T10 = Volt Print "Stern" Waitms 500 Gosub Initialisierung T11 = Volt Print "F4" Waitms 500 Gosub Initialisierung T12 = Volt Print "L" Waitms 500 Gosub Initialisierung T13 = Volt Print "M" Waitms 500 Gosub Initialisierung T14 = Volt Print "N" Waitms 500 Gosub Initialisierung T15 = Volt Print "Plus" Waitms 500 Gosub Initialisierung T16 = Volt Print "F5" Waitms 500 Gosub Initialisierung T17 = Volt Print "Q" Waitms 500 Gosub Initialisierung T18 = Volt Print "R" Waitms 500 Gosub Initialisierung T19 = Volt Print "S" Waitms 500 Gosub Initialisierung T20 = Volt Print "Punkt" Waitms 500 Gosub Initialisierung T21 = Volt Print "Ctrl" Waitms 500 Gosub Initialisierung T22 = Volt Print "U" Waitms 500 Gosub Initialisierung T23 = Volt Print "V" Waitms 500 Gosub Initialisierung T24 = Volt Print "U" Waitms 500 Gosub Initialisierung T25 = Volt Print "Enter" Waitms 500 Gosub Initialisierung T26 = Volt Print "Shifttaste" Waitms 500 Gosub Initialisierung T27 = Volt Print "Alpha" Waitms 500 Gosub Initialisierung T29 = Volt Print "Komma" Waitms 500 Gosub Initialisierung T30 = Volt Print "Alt" Waitms 500 End Sub Sub Initialisierung Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref Loop Until Volt > 0 End Sub Sub Terminal Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref If Volt = T21 Then Gosub Erstbelegung Elseif Volt = T26 Then Gosub Zweittbelegung Elseif Volt = T27 Then Gosub Dritttbelegung End If Loop Until Volt > 0 End Sub Sub Erstbelegung Print "Erstbelegung" Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref If Volt = T1 Then Print "F1" Waitms 500 Elseif Volt = T2 Then Print "F2" Waitms 500 Elseif Volt = T3 Then Print "Pfeilnachoben" Waitms 500 Elseif Volt = T4 Then Print "Esc" Waitms 500 Elseif Volt = T5 Then Print "Backslash" Waitms 500 Elseif Volt = T6 Then Print "F3" Waitms 500 Elseif Volt = T7 Then Print "Pfeilnachlinks" Waitms 500 Elseif Volt = T8 Then Print "Pfeilnachunten" Waitms 500 Elseif Volt = T9 Then Print "Pfeilnachrechts" Waitms 500 Elseif Volt = T10 Then Print "Stern" Waitms 500 Elseif Volt = T11 Then Print "F4" Waitms 500 Elseif Volt = T12 Then Print "7" Waitms 500 Elseif Volt = T13 Then Print "8" Waitms 500 Elseif Volt = T14 Then Print "9" Waitms 500 Elseif Volt = T15 Then Print "Plus" Waitms 500 Elseif Volt = T16 Then Print "F5" Waitms 500 Elseif Volt = T17 Then Print "4" Waitms 500 Elseif Volt = T18 Then Print "5" Waitms 500 Elseif Volt = T19 Then Print "6" Waitms 500 Elseif Volt = T20 Then Print "Punkt" Waitms 500 Elseif Volt = T22 Then Print "1" Waitms 500 Elseif Volt = T23 Then Print "2" Waitms 500 Elseif Volt = T24 Then Print "3" Waitms 500 Elseif Volt = T25 Then Print "Enter" Waitms 500 Elseif Volt = T29 Then Print "Komma" Waitms 500 Elseif Volt = T30 Then Print "0" Waitms 500 Elseif Volt = T26 Then Gosub Zweittbelegung Elseif Volt = T27 Then Gosub Dritttbelegung End If Loop End Sub Sub Zweittbelegung Print "Zweitbelegung" Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref If Volt = T1 Then Print "F6" Waitms 500 Elseif Volt = T2 Then Print "F7" Waitms 500 Elseif Volt = T3 Then Print "Pg Up" Waitms 500 Elseif Volt = T4 Then Print "\" Waitms 500 Elseif Volt = T5 Then Print "Space" Waitms 500 Elseif Volt = T6 Then Print "F8" Waitms 500 Elseif Volt = T7 Then Print "Home" Waitms 500 Elseif Volt = T8 Then Print "End" Waitms 500 Elseif Volt = T9 Then Print "/" Waitms 500 Elseif Volt = T10 Then Print "9" Waitms 500 Elseif Volt = T11 Then Print "F10" Waitms 500 Elseif Volt = T29 Then Print "Del" Waitms 500 Elseif Volt = T21 Then Gosub Erstbelegung Elseif Volt = T27 Then Gosub Dritttbelegung End If Loop End Sub Sub Dritttbelegung Print "Drittbelegung" Do Start Adc Ws = Getadc(7) Waitms 50 'um Spannungsschwankungen beim Tippen zu übergehen Volt = Ws * Ref If Volt = T1 Then Print "A" Waitms 500 Elseif Volt = T2 Then Print "B" Waitms 500 Elseif Volt = T3 Then Print "C" Waitms 500 Elseif Volt = T4 Then Print "D" Waitms 500 Elseif Volt = T5 Then Print "E" Waitms 500 Elseif Volt = T6 Then Print "F" Waitms 500 Elseif Volt = T7 Then Print "G" Waitms 500 Elseif Volt = T8 Then Print "H" Waitms 500 Elseif Volt = T9 Then Print "I" Waitms 500 Elseif Volt = T10 Then Print "J" Waitms 500 Elseif Volt = T11 Then Print "K" Waitms 500 Elseif Volt = T12 Then Print "L" Waitms 500 Elseif Volt = T13 Then Print "M" Waitms 500 Elseif Volt = T14 Then Print "N" Waitms 500 Elseif Volt = T15 Then Print "O" Waitms 500 Elseif Volt = T16 Then Print "P" Waitms 500 Elseif Volt = T17 Then Print "Q" Waitms 500 Elseif Volt = T18 Then Print "R" Waitms 500 Elseif Volt = T19 Then Print "S" Waitms 500 Elseif Volt = T20 Then Print "T" Waitms 500 Elseif Volt = T22 Then Print "U" Waitms 500 Elseif Volt = T23 Then Print "V" Waitms 500 Elseif Volt = T24 Then Print "W" Waitms 500 Elseif Volt = T25 Then Print "X" Waitms 500 Elseif Volt = T29 Then Print "Z" Waitms 500 Elseif Volt = T30 Then Print "Y" Waitms 500 Elseif Volt = T21 Then Gosub Erstbelegung Elseif Volt = T26 Then Gosub Zweittbelegung End If Loop End Sub End







):
Zitieren

Lesezeichen