Forum: Mikrocontroller und Digitale Elektronik Frage zu Matrix3x4.c


von Michael Lambertz (Gast)


Lesenswert?

Hallo Leute,

Ich möchte u.a. gerne eine 3x4 Matrix Tastatur mit meinem Atmega8 zu 
verbinden.

Als Denkanstoß dient mir dabei ein C-Code hier aus dem Forum.

http://www.mikrocontroller.net/attachment/48476/matrix3x4.c

Dazu habe ich ein paar Fragen und würde mich freuen, wenn ihr mir helfen 
könntet.

1. u8 findet die selbe Verwendung wie unsigned char. richtig?

2. Wie binde ich diese Datei in meinen C-Code ein? In "int main" oder 
gehört das noch davor?

3. Wie kann ich die eingegebene Zahl auf einem Display darstellen?
mit lcd_string(col-row);?

Vielen Dank für eure Mühe

Gruß Micha

von Karl H. (kbuchegg)


Lesenswert?

Michael Lambertz schrieb:

> 1. u8 findet die selbe Verwendung wie unsigned char. richtig?

In dem Fall ist es besser das u8 gegen ein char auszutauschen. Schau dir 
den Arrayinhalt an. Lauter Character. Also sollte man auch den richtigen 
Datentyp dafür nehmen. Eben char

> 2. Wie binde ich diese Datei in meinen C-Code ein? In "int main" oder
> gehört das noch davor?

Kopier den Inhalt vor deine main.
Das ist eine Funktion, die aufgerufen werden will.

> 3. Wie kann ich die eingegebene Zahl auf einem Display darstellen?
> mit lcd_string(col-row);?

No.
VOn der Funktion kriegst du offenbar eine Nummer zurück. Diese Nummer 
ist die Nummer der Taste. Aus dem MXKEY_TAB Array kriegst du dann direkt 
das zugehörige Zeichen als Character. Den mann dann natürlich ausgeben 
kann.

  uint8_t keyNr = keyscan();
  lcd_putc( MXKEY_TAB[keyNr] );

von Michael Lambertz (Gast)


Lesenswert?

Vielen Dank für die ausführliche Antwort, Karl-Heinz.

Deine Tipps klingen sehr vielversprechend.

von Karl H. (kbuchegg)


Lesenswert?

Wart mal.
Der Kommentar hier
1
     return col - row;               // 1..12 = key

macht mich stutzig.
Wenn der stimmt, dann ist die Verwendung so gedacht
1
  uint8_t keyNr = keyscan();
2
  if( keyNr != 0 )
3
    lcd_putc( MXKEY_TAB[keyNr - 1] );


Steht denn davon nichts im Begleittext zum Artikel wo du den Code 
herhast?

von Michael Lambertz (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich hab meinen C-Code dementsprechend umgeschrieben. (s.Anhang)

Leider klappt die LCD-Ausgabe nicht so recht.
Auf dem kompletten Display tauchen nur ungewöhnliche Zeichen auf.

Der Mikrocontroller erkennt zwar einen Tastendruck, kann den aber nicht 
verwerten, bzw. auf dem Display darstellen und gibt ein anderes Zeichen, 
anstatt einer Ziffer aus.

Vielleicht weiß einer von euch, wo ich den Fehler gemacht habe.

Danke und Gruß

Michi

von Karl H. (kbuchegg)


Lesenswert?

Probier doch mal das hier aus
1
int main()
2
{
3
4
int main (void)
5
{
6
  char buffer[20];
7
  uint8_t keyNr;
8
9
  lcd_off();                   // LCD Reset
10
  lcd_init();                  // Initialisierung des LCDs
11
    
12
  while( 1 )
13
  {
14
    keyNr = keyscan();
15
16
    if( keyNr != 0 )
17
    {
18
      lcd_setcursor( 0, 1 );
19
      sprintf( buffer, "Code %02d, Zeichen %c", (int)keyNr, (char)MXKEY_TAB[keyNr - 1] );
20
      lcd_string( buffer );
21
    }
22
  }
23
}

von Michael Lambertz (Gast)


Lesenswert?

Klappt leider immernoch nicht :(

Ich dank dir aber für deine Mühe, Karl-Heinz.
Hast mir sehr geholfen.

Ich werd mir wohl einen anderen Lösungsweg suchen müssen.

Bis dann...

von Karl H. (kbuchegg)


Lesenswert?

Michael Lambertz schrieb:
> Klappt leider immernoch nicht :(
Was heißt: klappt immer noch nicht.

Welche Zahlen stehen den für 'Code' dort? Da dürfen nur zahlen von 1 bis 
12 auftauchen.

> Ich werd mir wohl einen anderen Lösungsweg suchen müssen.

Wie wärs mit: den vorhandenen Code reparieren? Bisweilen sollen 
Programmierer sowas sogar machen! Oder kaufst du immer gleich ein neues 
Auto, wenn die Radkappen schmutzig sind? Vorausstzung ist natürlich, 
dass derjenige, der am Motor rumschraubt zumindest weiß, wie rum man 
einen Schraubendreher anfasst.

von Michael Lambertz (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Was heißt: klappt immer noch nicht.
>
> Welche Zahlen stehen den für 'Code' dort? Da dürfen nur zahlen von 1 bis
> 12 auftauchen.

Die LCD-Ausgabe klappt leider immer noch nicht.
Jetzt tauchen keine Zeichen mehr auf, sondern alle Felder des Displays 
sind nun komplett schwarz. Tastendruck wird auch nicht mehr erkannt.

Hab schon verschiedene Befehle für die LCD-Ausgabe versucht.

von Karl H. (kbuchegg)


Lesenswert?

Michael Lambertz schrieb:

> Die LCD-Ausgabe klappt leider immer noch nicht.

Dann solltest du dich zuerst mal um das LCD kümmern, anstatt da einen 
2-Fronten Krieg zu inszenieren, den du nicht gewinnen kannst.

Ich bin bisher eigentlich schon davon ausgegangen, dass du dein LCD 
unter Kontrolle hast, wenn du nach einer Tastatur-Matrix frägst.

von Michael Lambertz (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Ich bin bisher eigentlich schon davon ausgegangen, dass du dein LCD
> unter Kontrolle hast, wenn du nach einer Tastatur-Matrix frägst.

Bisher hat die Anzeige auf dem LCD auch hervorragend funktioniert.
Eine AD-Wandlung mit Anzeige der Messergebnisse funktionierte bisher 
problemlos.

Hast du möglicherweise eine Erklärung, warum das oben beschriebene 
Ereignis beim Display eintreten kann?

von Karl H. (kbuchegg)


Lesenswert?

Michael Lambertz schrieb:

> Hast du möglicherweise eine Erklärung, warum das oben beschriebene
> Ereignis beim Display eintreten kann?

zb dadurch, dass I/O Pins vom LCD mit I/O Pins vom LCD im Clinch liegen.
zb dadurch, dass unsauber programmiert wurde und Pins irrtümlich 
verändert werden, die gar nicht verändert werden sollen bei einem 
Zugriff.

von Michael Lambertz (Gast)


Lesenswert?

Du hast Recht, Karl Heinz.

In der lcd.h Datei hatte ich einige Ports gemeinsam sowohl für das LCD 
als auch für die Tastatur konfiguriert, was ich nicht berücksichtigt 
habe.

Nach tagelangem Suchen und Rumprobieren habe ich den vermeintlich 
"einfachen" Fehler also doch noch gefunden.

Danke...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.