mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Folientastatur


Autor: Keymaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo habe meine Folientastatur
(http://www1.conrad.de/conrad/layout2/detail.fh?fh_...)
folgendermaßen angeklemmt:
die ersten drei leitungen (Spalten) PORTC0-2
die anderen 4 (Zeilen) an PORTC3-6



Hier das Prog
======================================================================== 
====
void main(void)
{
  ////////////////////////////////////////
  ////  Variablendeklarationen    ////
  ////////////////////////////////////////
  char Zahl;

  Zahl = 0;

  ////////////////////////////////////////
  ////    Portbelegungen      ////
  ////////////////////////////////////////
  DDRA    =  0xff;  //Port A als Ausgang definieren[Display]
  DDRC  |=  0x07;  //Port C0-2 als Ausgang
  DDRC  &=  0x07;  //Port C3-6 als Eingang
  PORTC   |=  0x78;  //enable pull-ups C3-6

  ////////////////////////////////////////
  ////  Displayinitialisierung    ////
  ////////////////////////////////////////
  //lcd_init(LCD_DISP_ON);
  lcd_init(LCD_DISP_ON);
  lcd_clrscr();
  lcd_gotoxy(0,1);
  lcd_puts("Ready");
  lcd_gotoxy(0,0);

while(1)
  {
    ////  Spalte_1  ////
    PORTC |= 0x07;    //Port C0-2 auf HIGH setzen
    PORTC &= 0xFE;    //Port C0 LOW setzen [Spalte 1]

    if( ( PINC & ( 1 << PC3 ) ) == 0 )      //Zeile_1
    {
      Zahl = 1;
      lcd_puts("1");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC4 ) ) == 0 )      //Zeile_2
    {
      Zahl = 4;
      lcd_puts("4");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC5 ) ) == 0 )      //Zeile_3
    {
      Zahl = 7;
      lcd_puts("7");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC6 ) ) == 0 )      //Zeile_4
    {
      Zahl = '*';
      lcd_puts("*");
    }
    _delay_ms(50);

    ////  Spalte_2  ////
    PORTC |= 0x07;    //Port C0-2 auf HIGH setzen
    PORTC &= 0xFD;    //Port C1 LOW setzen [Spalte 2]

    if( ( PINC & ( 1 << PC3 ) ) == 0 )      //Zeile_1
    {
      Zahl = 2;
      lcd_puts("2");
    }
    _delay_ms(50);

    if( ( PINC & ( 1 << PC4 ) ) == 0 )      //Zeile_2
    {
      Zahl = 5;
      lcd_puts("5");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC5 ) ) == 0 )      //Zeile_3
    {
      Zahl = 8;
      lcd_puts("8");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC6 ) ) == 0 )      //Zeile_4
    {
      Zahl = '0';
      lcd_puts("0");
    }
    _delay_ms(50);

    ////  Spalte_3  ////
    PORTC |= 0x07;    //Port C0-2 auf HIGH setzen
    PORTC &= 0xFB;    //Port C2 LOW setzen [Spalte 3]

    if( ( PINC & ( 1 << PC3 ) ) == 0 )      //Zeile_1
    {
      Zahl = 3;
      lcd_puts("3");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC4 ) ) == 0 )      //Zeile_2
    {
      Zahl = 6;
      lcd_puts("6");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC5 ) ) == 0 )      //Zeile_3
    {
      Zahl = 9;
      lcd_puts("9");
    }
    _delay_ms(50);
    if( ( PINC & ( 1 << PC6 ) ) == 0 )      //Zeile_4
    {
      Zahl = '#';
      lcd_puts("#");
    }
    _delay_ms(50);
      }
}
======================================================================== 
=

so wenn ich nun mein ATMega16 damit flashe, dann erscheint die ganze 
zeit nur 2 auf dem Display, als wäre die ganze zeit die taste für 2 
gedrückt....

Danke !

Autor: Stefan Gemmel (steg13)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mir dein Programm nicht angesehen, aber bei mir war es so dass 
die Taste 7 "geklemmt" hat. Bis ich die Tastatur aufgeklebt hatte.
Aber ich denke das hast du nachgemessen.

Autor: Keymaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja richtig, habe die Tastatur durchgemessen, also da klemmt nichts,
wäre ja auch zu schön bei einer nagelneuen tastatur, aber aufgeklebt 
habe ich sie allerdings auch noch nicht....

woran könnte es denn schätzungsweise noch liegen ?
also die abfrage ist gleich wie bei all den anderen, halt nur 
angepasst....

    if( ( PINC & ( 1 << PC3 ) ) == 0 )      //Zeile_1
    {
      Zahl = 2;
      lcd_puts("2");
    }
    _delay_ms(50);


und sonst änder ich an dem port ja auch nichts....

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs mal mit einem einfacheren Testpgm
das dir die 3 Pinwerte einfach mal so
wie sie abgelesen werden ausgibt?

Dann siehst du sofort ob es an deiner Auswertung
(die ich nicht kontrolliert habe) liegt, oder
ob von der Taste tatsächlich ständig was gemeldet wird.


Autor: Keymaster (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ne brauch ich nicht, habe die folientastatur ja komplett 
durchgemmesen...
da kommt absolut nichts an ....

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ne brauch ich nicht

Na ja, wenn du meinst.
Die Hardware ist es nicht, die Software ist es nicht.
Also müsste es eigentlich funktionieren.

Was kommt als nächstes? Compilerfehler?

Autor: antworter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum wartest du nach jedem Pin-Test 50ms ? So wie ich das sehe, wartest 
Du 12*50ms - liest also nur alle 600ms den Tastaturstatus.



schönerer quelltext (wenn nicht nach Anzahl Zeilen bezahlt):

mach mal:

  zahl = -1;
  switch (!PINC)
  {
    case (1 << PC3): Zahl=1; break;
    case (1 << PC4): Zahl=2; break;
    ....
  }
  if (zahl != -1) lcd_put(ord(`0`) + zahl);

Autor: antworter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
huch...heißt natürlich

switch(~PINC)

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
antworter wrote:
> schönerer quelltext (wenn nicht nach Anzahl Zeilen bezahlt):

Wenns nach dem geht, würde ich das so machen (Ausserdem bin ich
tippfaul)

char SpaltenPin[] = { 0x01, 0x02, 0x04 );

char Spalte[3][4] = { { 1, 4, 7, '*' },
                      { 2, 5, 8, 0 },
                      { 3, 6, 9, '#' } };

char CharSpalte[3][] = { { "147*" },
                         { "2580" },
                         { "369#" } };

....

    zahl = -1;

    for( i = 0; i < 3; ++i ) {
      PORTC = ~SpaltenPin[i];    // Port C die Spalte auswählen
                                 // Das Schaltet auch unnötigerweise
                                 // die Pullups immer wieder ein,
                                 // aber das macht nichts.

      Index = ( PINC & 0x78 ) >> 3;
      if( Index > 0 ) {
        zahl = Spalte[i][Index];
        lcd_putc( CharSpalte[i][Index] );
      }
      _delay_ms(50);
    }

aber das ist eine andere Geschichte.

Autor: antworter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auch sehr schön - und vor allem recht laufzeitoptimal

tippfaul ? glaub ich jetzt irgendwie nicht ;-)

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> auch sehr schön

nur hats einen (kleinen) Schönheitsfehler.
Es funktioniert so nicht :-)
Ist aber kein Problem, ist leicht behebbar.
Tip: In Index ist jeweils eines von 4 Bit gesetzt
wenn die Taste gedrückt wurde. Das heist aber nicht,
dass das dann die Zahlen von 0 bis 4 ergibt.
Abhilfe: Die Codierarrays auf 16 Einträge erweitern.

Habs auch erst jetzt bei erneutem Durchlesen gemerkt :-)

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.