mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastatur


Autor: Albert Huber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe eine Tastatur (40 Tasten) auf dem Bildschirm, die aus lauter 
Kreisen bestehen. Ich möchte über diese in meinem Programm Rechtecke 
drüberziehen und wenn in einem Rechteck die Maus gedrückt wird dann wird 
in einem Array der dazupassende Eintrag auf 1 gesetzt.

Mein Problem ist jetzt, ich möchte nicht alle 40 Tasten nach folgender 
Art abfragen:
   if ((TasteX >= 35 && TasteX <= 75) && (TasteY >= 355 && TasteY <= 
395))
    Tastendruck[0] = 1;
   usw. 40x

Weiß vielleicht jemand eine bessere Lösung? mit for oder switch case 
oder so

Vielen Dank für Eure Antworten!!

lg
Albert

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leg dir eine (nicht sichtbare) Bitmap an und fülle den Hintergrund mit 
schwarz (0, 0, 0).
Nun zeichne in dieser Bitmap jeden Button mit einer anderen Farbe, z.B. 
Button 1: (1, 1, 1), Button 2: (2, 2, 2) ...
Wennn du nun einen Mausklick bekommst, so schaust du einfach in der 
Bitmap nach, welche Farbe der entsprechende Pixel hat und schon weißt 
du, auf welchen Button geklickt wurde.

Autor: Albert Huber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist, die Farben sind festgelegt, alle haben die gleiche 
Farbe!!

leider, sonst wärs eine gute Idee, Danke

lg Albert

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du sollst auf die nicht sichtbare Bitmap mit anderen Farben malen, als 
auf deine eigentlichen Form.
Wenn du in deinem eigentlichen Fenster ein Kreis für einen Button malst, 
dann malst du diesen Kreis auch noch auf die unsichtbare Bitmap, 
allerdings mit einer anderen Farbe und zwar für jeden Button einen 
andere Farbe. Später im Programmlauf, wenn der Benutzer mit der Maus auf 
einen Button klickt bekommst du die Nachricht WM_MOUSEDOWN inkl. der 
Koordinaten. Nun mußt du mit diesen Koordinaten in der unsichtbaren 
Bitmap nachschauen, was diese für eine Farbe an dieser Stelle hat. 
Anhand der Farbe kannst du dann feststellen, welcher Button geklickt 
wurde.

Autor: Albert Huber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist nicht möglich, die Grafik ist sehr groß und da würd ich dann 
wieder so viel Speicher brauchen,

Ich habs jetzt mal so programmiert für 12 Tasten, bin aber unglücklich 
damit,
kann man das vielleicht irgendwie einfacher machen

  if ((keyX >= 35 && keyX <= dX) && (keyY >= 355 && keyY <= dY))
      mtxKey[8] = 1;
        if ((keyX >= 85 && keyX <= dX) && (keyY >= 355 && keyY <= dY))
      mtxKey[9] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 355 && keyY <= dY))
      mtxKey[10] = 1;
    if ((keyX >= 35 && keyX <= dX) && (keyY >= 405 && keyY <= dY))
      mtxKey[17] = 1;
    if ((keyX >= 85 && keyX <= dX) && (keyY >= 405 && keyY <= dY))
      mtxKey[18] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 405 && keyY <= dY))
      mtxKey[19] = 1;

    if ((keyX >= 35 && keyX <= dX) && (keyY >= 455 && keyY <= dY))
      mtxKey[24] = 1;
    if ((keyX >= 85 && keyX <= dX) && (keyY >= 455 && keyY <= dY))
      mtxKey[25] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 455 && keyY <= dY))
      mtxKey[26] = 1;

    if ((keyX >= 35 && keyX <= dX) && (keyY >= 505 && keyY <= dY))
      mtxKey[33] = 1;
    if ((keyX >= 85 && keyX <= dX) && (keyY >= 505 && keyY <= dY))
      mtxKey[34] = 1;
    if ((keyX >= 135 && keyX <= dX) && (keyY >= 505 && keyY <= dY))
      mtxKey[35] = 1;

Autor: Kai (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Es reicht auch, wenn du die Maske mit mit 8-Bit Farbtiefe anlegst. 
Selbst wenn dein Programm den kompletten Bildschirm belegt, dann wäre 
das nur 1,25MB (bei 1280x1024).
Aussehen würde das dann in etwa so, wie auf dem angehängten Bild. Links 
dein Programm mit den vielen Buttons, rechts die Maske, die eigentlich 
nicht sichtbar ist. Ich habe zur besseren Verdeutlichung nur den roten 
Farbkanal benutzt und die Abstände zwischen den Farben auf 10 
vergrößert.

Wenn du deine Buttons in gleichbleibenden Abständen angeordnet hast, 
dann kannst du mit einer kleinen Rechnung aus den x- und y-Werten die 
Zeile bzw. Spalte berechnen und daraus den Index des angeklickten 
Buttons. Die Gültigkeitsbereiche der Mausklicks wären dann halt 
rechteckig und nicht rund wie deine Buttons selbst, aber das machst du 
im Moment ja auch so.

Autor: Kai (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das könnte etwa so aussehen:

col = ((keyX - 35) / 50);
if (((keyX - 35) % 50) > dX)
{
    // auf keinem Button, da rechts am Button in der Spalte vorbei
    col = -1;
}
row = ((keyY - 355) / 50);
if (((keyY - 35) % 50) > dY)
{
    // auf keinem Button, da unter dem Button in der Zeile vorbei
    row = -1;
}
if ((row != -1) && (col != -1))
{
    index = col + row * ButtonsPerRow;
}

Es kann sein, dass du ein paar Werte noch anpassen mußt!

Autor: G. Nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum schreibst Du die Koordinaten der Rechtecke nicht in ein Feld 
(array) und suchst dann mit einer for-Schleife den Index, der der Taste 
entspricht.
Verkürzend brauchst Du bei gleichen Tastengrößen nur X0/Y0 speichern, da 
Ylen und Xlen immer gleich sind.
Wenn die Koordinaten sortiert angelegt sind, kannst Du auch iterativ den 
Feldindex suchen.

Autor: G. Nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... X0/Y0 zu speichern, ...

Soviel Zeit muß sein :-)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt 
sich deren Position berechnen ...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus t. Firefly wrote:
> Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt
> sich deren Position berechnen ...

Rechnen? Da müsste man ja nachdenken wie man das
berechnen könnte. Das macht doch heute kein Mensch mehr.
Dafür haben wir ja Computer.

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt
>> sich deren Position berechnen ...

>Rechnen? Da müsste man ja nachdenken wie man das
>berechnen könnte. Das macht doch heute kein Mensch mehr.
>Dafür haben wir ja Computer.

Rufus hat nur ein paar Buchstaben vergessen:
> Wenn die Rechtecke gleichmäßig in einer Matrix angeordnet sind, lässt
> MAN sich deren Position DURCH DEN COMPUTER berechnen ...

Wenn die Koodinaten (Mittelpunkt) der Kreise und deren Radius bekannt 
sind, kann ziemlich einfach die Grenzen berechnen...(das geht auch auf 
Papier...)

Autor: Albert Huber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Beiträge,
ich habs schon, das Problem war auch, dass die Tasten nicht gleichmässig 
angeordnet waren, nur manche, ich habs jetztunterteilt in gleichmäßig 
angeortnete und die anderen eben,
ABER DANKE FÜR EURE IDEEN!!1

lg
Albert

Autor: OlFi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei 40 Tasten in Vollbild Darstellung, hätte jede Taste eine bestimmte 
Höhe und Breite.

z.B.:

4 Zeilen mit jeweils 10 Tasten

1024 --> 102,4 breit
768  -->  192 hoch

Man könnte jetzt die Mauskoordinaten nehmen und durch diese Faktoren 
teilen.

Angenommen der Nullpunkt ist oben links in der Ecke des Bildschirms.

Beispiel:

Mausposition: X0=1000; Y0=700

1000/102,4 = 9,77
700/192  = 3,65

Nachkommastellen sind uninteressant.

Der Cursor steht bei Taste (Taste=3 * 9 = 27

Jetzt füllst du einen String mit 40 Zeichen (z.B. char Zeichen[40])und 
gibst auf dem Bildschrim Zeichen[Taste-1] aus.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> angeortnete und die anderen eben,

Wenn sie nicht regelmässig angeordnet sind, dann kannst
du das so machen:
struct Taste_t {
  int Links;
  int Oben;
  uint8_t Code;
}

struct Tasten_t Tasten[] = {
  { {  35, 104, 1 },   // 'A'
    {  85, 104, 2 },   // 'B'
    { 120, 102, 3 },   // 'C'
    ...
  }
};

....

   TastenCode = -1;

   for( i = 0; i < sizeof( Tasten ) / sizeof( *Tasten ); ++i ) {
     if( ClickPositionX > Tasten[i].Links &&
         ClickPositionX < Tasten[i].Links + Tastenbreite &&
         ClickPositionY > Tasten[i].Oben &&
         ClickPositionY < Tasten[i].Oben + Tastenhöhe ) {
       TastenCode = Tasten[i].Code;
       break;
     }
   }

   // Tastencode enthält hier die Nummer der identifizierten
   // Taste oder -1, wenn die Position nicht über einer
   // Taste war

Das hat dann den Vorteil, dass neue Tasten sehr einfach
hinzuzufügen sind: Einfach ins Array eintragen.

Wenn die interessierenden Bereiche nicht gleich gross sind,
dann nimmt man auch noch die Breite und Höhe mit in die
Struktur auf.

Autor: G. Nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl-Heinz

Schön, dass Du meine Idee aufgreifst :-)
Wichtig wäre noch, die struct mit den Koordinaten -1,-1 abzuschließen, 
um das Ende variabel zu gestalten.

Damit kann man dann auch unterschiedliche Tastenfelder (z.b. numerische 
Eingabe + variable Parameterlisten) zur Laufzeit zusammenbinden und 
abarbeiten. Beachten muß man dabei nur, dass die Tastencodes 
unterschiedlich sind.
Bei größerem RAM-Speicher macht man soetwas vorteilhaft auf dem heap.

Autor: Rahul, der Trollige (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wichtig wäre noch, die struct mit den Koordinaten -1,-1 abzuschließen,
>um das Ende variabel zu gestalten.

Hä? Die Variable-Grösse wird durch das "sizeof"-Gedöns realsiert.
Den dritten Parameter in Karl Heinz Struct könnte man für alles mögliche 
benutzen. Der Tastenindex ist ja schon durch die Schleife vorgegeben 
(Man muß ich sich nur merken...)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
G. Nicht wrote:

> Wichtig wäre noch, die struct mit den Koordinaten -1,-1 abzuschließen,
> um das Ende variabel zu gestalten.

Schau dir nochmal genau an, wie ich die Endebedingung in
der for-Schleife realisiert habe.

> Bei größerem RAM-Speicher macht man soetwas vorteilhaft auf dem heap.

Beachte auch, dass es den Begriff 'Heap' in C nicht gibt.
Wenn du unter heap das verstehst was ich drunter verstehe
(Speicher, der für malloc/free benutzt wird), dann: nein,
das willst du ganz sicher nicht am heap machen.

Autor: G. Nicht (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Schau dir nochmal genau an, wie ich die Endebedingung in
>der for-Schleife realisiert habe.

Gut, für eine konstante Tabelle ist das natürlich in Ordnung. Wenn 
jedoch unterschiedliche Tastatur-Layouts verwendet werden, scheint es 
sinvoller, nur eine Suchroutine zu haben, die das Ende der Struktur 
selber erkennen kann.

>... das willst du ganz sicher nicht am heap machen.

Doch, genau dort, dazu ist der Haufen da.
Statische Strukturen im RAM brauchen immer Speicher, auch wenn sie nicht 
aktiv sind. Lokale Strukturen - wenn man sie zusammenbinden will - 
lassen sich zur Laufzeit am besten mit malloc() und free() verwalten. 
Meine Meinung.




Autor: michael k. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo zusammen
ich hab ein problem und zwa is das flachbandkabel von der g15 tastatur 
am display gerissen. hat jemand eine idee oder wo bekommt man ein neues 
display her?
gruss micha

Autor: Wegstaben Verbuchsler (wegstabenverbuchsler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@michael k.

dies ist nicht der Sammelthread für alle Hardware und Software Probleme 
im Zusammenhang mit irgendeiner "Tastatur". Mach bitte einen neuen 
Thread auf, denn dein spezielles Problem wird hier niemand suchen und 
vermuten. Und nimm einen gescheiteren Betreff als nur das Wort 
"Tastatur".

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.