Forum: Compiler & IDEs 3x4 Matrix-Tastatursteuerung (MM-537)


von Günther M. (lumperich)


Lesenswert?

Hallo zusammen,

ich bräuchte mal Hilfe zur Entwicklung eines Programms mit C.
Ich soll fürs Studium eine Matrix-Tastaurabfrage mit repeat-Funktion 
realisieren. Wir verwenden das miniModul-537.
Aufgabe dabei ist die Entwicklung einer Polling-Routine die eine 
zyklische Abfrage der Tasten realisiert und die Entwicklung einer 
Funktion die bei permanent gedrückter Taste repetierend den Tastaturcode 
an ein Anzeigemodul abgibt.

Ausgabeports: P5.0, P5.1, P5.2 und P5.3
Eingabeports: P5.4, P5.5 und P5.6

Da ich absolut keine Ahnung vor der Materie habe hoffe ich das Ihr mir 
weiterhelfen könnt, ich habe schon im Netz gesucht aber nichts 
hilfreiches gefunden.
Ich würde mich freuen wenn Ihr Anregungen oder noch besser eine Lösung 
für mich habt ;)

Freundliche Grüße
Günther

von Karl H. (kbuchegg)


Lesenswert?

Lass den Repeat erst mal weg und bschäftige dich nur mit der Abfrage der 
Matrix.

Das Prinzip einer Matrixabfrage ist bekannt?

Du hast eine Reihe von Ausgängen. Die Ausgänge sind mit den Eingängen 
derart verknüpft, dass wenn du eine Ausgangsleitung aktivierst UND eine 
Taste, die in der Zeile(Spalte, ja nach Verschaltung) dieser 
Ausgangsleitung liegt, gedrückt ist, du an einer der Eingangsleitungen 
diesen Tastendruck siehst. Die registrierst du, merkst dir, dass diese 
Taste gedrückt ist. Dann gehts zur nächsten Zeile (Spalte) und wieder 
kann dann eine gedrückte Taste dieser Zeile (Spalte) detektiert werden. 
Macht man das reihum für alle Zeilen, dann hat man die komplette Matrix 
einmal abgescannt.

> Da ich absolut keine Ahnung vor der Materie habe

Was muss man sich unter "Absolut keine Ahnung" vorstellen? So eine 
Matrix ist schon kein Einsteigerprojekt mehr. D.h. zu diesem Zeitpunkt 
solltest du eigentlich schon das eine oder andere Programm geschrieben 
haben und zb normale Taster abgefragt und ausgewertet haben.

von Peter D. (peda)


Lesenswert?

Günther Metzger schrieb:
> Da ich absolut keine Ahnung vor der Materie habe

Was hast Du dann bisher im Studium gemacht?
Ich kenne das so, daß die Aufgaben auf dem Vorlesungsstoff aufbauen, sie 
sollen ihn vertiefen.


Günther Metzger schrieb:
> oder noch besser eine Lösung
> für mich habt ;)

Könnte ich machen, dauert etwa 10min.
Würde Dir aber nichts nützen, weil:
1. der Prof sieht sofort, daß sie nicht von Dir ist.
2. Du kannst sie nicht erklären.


Peter

von Heinz (Gast)


Lesenswert?

> Da ich absolut keine Ahnung vor der Materie habe hoffe ich das Ihr mir
> weiterhelfen könnt, ich habe schon im Netz gesucht aber nichts
> hilfreiches gefunden.

Wenn du keine Ahnung hast, warum wird dir dann diese Aufgabe gestellt? 
Du studierst und hast im Netz nichts gefunden?

von Günther Metzger (Gast)


Lesenswert?

Hi kbuchegg,

danke erstmal für die rasche Antwort.
Also ja das Prinzip der Matrixabfrage ist klar. Was mir fehlt ist die 
Programmierung mit C, da hab ich nicht wirklich viel Ahnung. Na gut, so 
schlecht sind meine Kentnisse bei C auch wieder nicht aber zumindest 
dafür reichen sie dann doch nicht ganz.

Bei der Ausgabe habe ich 4 Ausgänge und 3 Eingänge.
Ich habe da schon ein wenig was geschrieben:
1
#pragma large           /* use memory model 'large'            */
2
3
#include <REG517.H>     /* Register Set of 80517 controller    */
4
#include <stdio.h>      /* Standard I/O functions              */
5
#include "serinit.h"    /* Automatic baudrate detection        */
6
 /*mainprogram                                                              
7
8
  sbit P5_0 = P5^0;  
9
  sbit P5_1 = P5^1;  
10
  sbit P5_2 = P5^2;  
11
  sbit P5_3 = P5^3;  
12
  sbit P5_4 = P5^4;  
13
  sbit P5_5 = P5^5;  
14
  sbit P5_6 = P5^6;
15
16
void main (void)  {     /* execution starts here               */
17
18
  SerInit();            /* call automatic baudrate detection   */
19
  
20
21
  putchar(' ');         /* send dummy-Byte for compatibility   */
22
23
  printf  ("\x1AHello World\n");                       
24
25
  
26
27
  while (1) {           /* An embedded program without any     */
28
                        /* operating system usually does not   */
29
                        /* stop and never returns.             */
30
                        /* We've used an endless loop in this  */
31
                        /* example.                            */
32
33
34
   P5_0=1;
35
  if P5_4=1
36
  then printf("Taste 1")
37
  else if P5_5=1
38
  then printf("Taste 2")
39
  else if P5_6=1
40
  then printf("Taste 3")
41
  else p5_0=0;
42
43
  printf ("  char = %02bX\n",getchar()); 
44
                        
45
                        /* print the two digit hex code of     */
46
                        /* any received character              */
47
  }
48
}
Der Anfang ist schon richig so meinte mein Betreuer aber die while 
Schleife ist nicht richtig bzw da muss noch mehr hin.

von Karl H. (kbuchegg)


Lesenswert?

> Was mir fehlt ist die Programmierung mit C, da hab
> ich nicht wirklich viel Ahnung.

Das merkt man

Das hier
1
  if P5_4=1
2
  then printf("Taste 1")
3
  else if P5_5=1
4
  then printf("Taste 2")
5
  else if P5_6=1
6
  then printf("Taste 3")
7
  else p5_0=0;

ist doch ein einziger Syntax/Semantic Fehler.

Du solltest dich schleunigst in C soweit auf die Rolle kriegen, bei den 
Fehlern, die du hier machst. Das sind Anfängerfehler, Marke 'Erste 
Lektion, erste Stunde'.

 =   ist nicht dasselbe wie ==
 Die Bedingung in einem if steht in C in Klammern
 es gibt kein then
 Strichpunkte scheinen dir unbekannt zu sein.


Matrix ist schön und gut. Aber du brauchst erst mal einen Crashkurs in 
C.
Und zwar rasend schnell! Was du über Weihnachten machen wirst, weißt du 
jetzt ja: Einen Compiler für den PC organisieren (da gibt es einige 
freie Compiler), in der Uni-Bibliothek ein C-Buch ausleihen und dann in 
den 2 Wochen zumindest das erste Drittel des Buches samt Übungen 
durcharbeiten.

Wie soll man sich mit jemanden über das Umformen von Gleichungen 
unterhalten, wenn er schon beim kleinen 1x1 ganz offensichtlich 
aussteigt und Punkt- vor Strichrechnung nicht intus hat?


> Na gut, so schlecht sind meine Kentnisse bei C auch wieder nicht
Du beliebst zu scherzen?
Wenn das was ich da sehe jetzt nicht ein Irrtum deinerseits ist 
(falsches File gepostet), dann sind sie katastrophal. printf fehlerfrei 
hinschreiben zu können qualifiziert nicht als 'einigermassen gute C 
Kentnisse'.

Wenn du C programmierst, dann musst du auch in C programmieren und nicht 
in Pascal.


Du magst dich ob der Offenheit wundern. Aber ganz brutal gesagt: Wenn du 
da nicht schleunigst anfängst an deinen grundlegenden C-Fähigkeiten zu 
arbeiten, dann wird das nix mit diesem Semester. Da ist nicht nur Feuer, 
sondern bereits ein halber Grossbrand am Dach! Und das liegt nicht 
daran, dass du noch nie µC oder eine Matrix programmiert hast. Da fehlt 
es auf einer viel grundlegenderen Ebene.

von Günther Metzger (Gast)


Lesenswert?

Also zuerst hab ich geschrieben das es mir klar ist das ich nicht viel 
Ahnung vom Programmieren habe, da muss man einen nicht dumm machen wenn 
man keine Ahnung hat. Deswegen bin ich ja auch schließlich hier, damit 
einem geholfen wird.
Und ebenso habe ich auch geschieben, dass die while Schleife nicht 
richtig ist!

von Karl H. (kbuchegg)


Lesenswert?

Günther Metzger schrieb:
> Also zuerst hab ich geschrieben das es mir klar ist das ich nicht viel
> Ahnung vom Programmieren habe, da muss man einen nicht dumm machen wenn
> man keine Ahnung hat.

Und zu dem Zeitpunkt bin ich auch noch davon ausgegangen, dass sich das 
'Keine Ahnung haben' im wesentlichen auf die Matrix bezieht. Vielleicht 
ein kleines Problem mit der Bitbehandlung oder im Speichern der 
Tastendrücke oder wie man den Autorepeat hinkriegt.

Dann hast du geschrieben
> Na gut, so schlecht sind meine Kentnisse bei C auch wieder nicht

und was dann gekommen ist, war einfach nur ......

> Deswegen bin ich ja auch schließlich hier, damit
> einem geholfen wird.

Das geht nicht. Ohne das du Vorarbeit leistest, kann dir hier keiner 
helfen.
Was soll ich dir (nur als Beispiel: in Mathe) bei Differntialrechnung 
helfen, wenn du mit dem Auflösen von Klammern oder simplen 
Gleichungsumformungen nicht klar kommst?


Wenn du mir beruflich sagst, du hättest einigermassen Kentnisse in C und 
lieferst dann sowas ab um Hilfe zu erhalten, dann schmeiss ich dich 
hochkant raus. Denn das werte ich als Betrug im Einstellungsgespräch.
Jemand der sich als angehender Dolmetsch ausgibt und dann radebrechtet 
"We is hungri on Schnitzel" hat ganz einfach dreist gelogen und das 
liegt nicht daran, dass er nicht weiß, wie die Engländer zu Schnitzel 
sagen.

von Günther M. (lumperich)


Lesenswert?

hallo zusammen
so ich hab mich mal ein wenig informiert und hab das folgende erreicht.

Ich bin mir aber nicht sicher ob ich die spaltenabfrage brauche und wie 
man den Input bzw Output deklarieren kann. Ich denke mal mit stdin bzw 
stdout.

von Günther M. (lumperich)


Lesenswert?

#pragma large                     /* use memory model 'large' 
*/
#include <REG517.H>                    /* Register Set of 80517 
controller    */
#include <stdio.h>                     /* Standard I/O functions 
*/
#include <serinit.h>                   /* Automatic baudrate detection 
*/

//-------------------------------------------//
//Zeilenabfrage//
  sbit P4_0 = P4^0;

  sbit Sp1 = P5^4;
  sbit Sp2 = P5^5;
  sbit Sp3 = P5^6;

  sbit Ze1 = P5^0;
  sbit Ze2 = P5^1;
  sbit Ze3 = P5^2;
  sbit Ze4 = P5^3;

 unsigned char taste = 0;
  int zeile=1, spalte=0;

void wait (void)  {                    /* wait function 
*/
  ;                                    /* only to delay for LED flashes 
*/
}




void tastendruck_zeile1(void)
{
  Ze1        =      1;
       if(Sp1 == 1) taste= 1;
      else if(Sp2 == 1) taste= 2;
      else if(Sp3 == 1) taste= 3;
     Ze1        =      0;
}

void tastendruck_zeile2(void)
{
  Ze2        =      1;
     if(Sp1 == 1)taste = 4;
     else if(Sp2 == 1)taste = 5;
     else if(Sp3 == 1)taste = 6;
  Ze2        =      0;
}

void tastendruck_zeile3(void)
{
  Ze3        =      1;
    if(Sp1 == 1)taste= 7;
    else if(Sp2 == 1)taste= 8;
    else if(Sp3 == 1)taste= 9;
  Ze3        =      0;
}



void tastendruck_zeile4(void)
{
  Ze4        =      1;
    if(Sp1 == 1)taste=10;
    else if(Sp2 == 1)taste=11;
    else if(Sp3 == 1)taste=12;
    Ze4        =      0;
}

//-------------------------------------------//
//Spaltenabfrage //
/*
  sbit Sp1 = P5^0;
  sbit Sp2 = P5^1;
  sbit Sp3 = P5^2;

  sbit Ze1 = P5^3;
  sbit Ze2 = P5^4;
  sbit Ze3 = P5^5;
  sbit Ze4 = P5^6;

 unsigned char taste1 = 0;
  int zeile=0, spalte=1;

void tastendruck_spalte1(void)   {
  Sp1        =      1;
      if(Ze1 == 1) taste1= 1;
     else if(Ze2 == 1) taste1= 4;
     else if(Ze3 == 1) taste1= 7;
     else if(Ze4 == 1) taste1= 10;
  Sp1        =      0;
}

void tastendruck_spalte2(void)   {
  Sp2        =      1;
     if(Ze1 == 1) taste1= 2;
     else if(Ze2 == 1) taste1= 5;
     else if(Ze3 == 1) taste1= 8;
     else if(Ze4 == 1) taste1= 11;
  Sp2        =      0;
}

void tastendruck_spalte3(void)   {
  Sp3       =      1;
       if(Ze1 == 1) taste1= 3;
      else if(Ze2 == 1) taste1= 6;
      else if(Ze3 == 1) taste1= 9;
      else if(Ze4 == 1) taste1= 12;
  Sp3        =      0 ;
}
*/

//------------------------------------------------------------------//
//cases//

void tasteerkennen(void)
{
  switch (taste)
  {
        case    0   :               break;

        case    1   :               printf ("\x1A 1 \n");
                                   taste=0;
                                    break;

        case    2   :               printf ("\x1A 2 \n");
                                    taste=0;
                                    break;

        case    3   :               printf ("\x1A 3 \n");
                                     taste=0;
                                    break;

        case    4   :                printf ("\x1A 4 \n");
                                    taste=0;
                                    break;

        case    5   :                printf ("\x1A 5 \n");
                                    taste=0;
                                    break;

        case    6   :               printf ("\x1A 6 \n");
                                     taste=0;
                                    break;

        case    7   :                printf ("\x1A 7 \n");
                                     taste=0;
                                    break;

        case    8   :                printf ("\x1A 8 \n");
                                     taste=0;
                                    break;

        case    9   :                printf ("\x1A 9 \n");
                                     taste=0;
                                    break;

       case    10  :                printf ("\x1A * \n");
                                     taste=0;
                                    break;

        case    11  :              printf ("\x1A 0 \n");

                                      taste=0;
                                    break;

        case    12  :                printf ("\x1A # \n");
                                    taste=0;
                                    break;

                              }
}

void tastatur(void)
{
  unsigned int i;                      /* delay var 
*/
    for (i=0; i<6000; i++)
{                          /* delay for 12000 counts              */
      wait ();                           /* call wait function 
*/
    }

/*   tastendruck_spalte1();
   tastendruck_spalte2();
   tastendruck_spalte3();
*/
  tastendruck_zeile1();
  tastendruck_zeile2();
  tastendruck_zeile3();
  tastendruck_zeile4();

   tasteerkennen();
}


//---------------------------------------------------------------------- 
----------------------------------//
//Hauptprogramm//


void main()
{
  unsigned int i;                      /* delay var 
*/
    serinit();                           /* call automatic baudrate 
detection   */

    putchar(' ');                        /* send dummy-Byte for 
compatibility   */
  printf ('k');

while(1)
{
  //serial.waitEvent();
  tastatur();

  P4_0 = 0;                          /* output to LED port 
*/
    for (i=0; i<18000; i++) {          /* delay for 12000 counts 
*/
      wait ();                         /* call wait function 
*/
    }

    P4_0 = 1;                          /* output to LED port 
*/
    for (i=0; i<6000; i++) {           /* delay for 12000 counts 
*/
      wait ();                         /* call wait function 
*/
    }
}
}

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.