[PIC] Problem mit Matrix Tastatur

OP #1640621
Lesenswert?
• ▲
▼
Guten Abend!

Ich habe hier eine Schaltung mit einer Matrix Tastatur, 2 Tastern und 
einem LCD.

Das Problem ist wenn ich meine Tastatur abfrage bekomme ich immer den 
Stern zurück und das in einer Endlosschleife obwohl ich keine Taste 
drücke. Hier ist der Code dazu:
1
void main(void)
2
{
3
// Definition von Variablen
4
char data[16];
5
unsigned char t;
6

7
//Einstellen der Ports
8
// 0 = Output
9
// 1 = Input
10
TRISC = 0b00000000; // PORT C Ausgang
11
PORTC = 0x00;
12

13
TRISB = 0b00011000; // RB3, RB4 is Input
14
PORTB = 0x0F;
15

16
// Port A Einstellungen
17
// Alle PortA Pins digital I/O
18
ADCON1 = 0xFF;
19

20
TRISA = 0b00000000; // PORTA alles Ausgang
21

22
// XLCD Open
23
OpenXLCD( FOUR_BIT & LINES_5X7 );
24

25
/** Interrupts ***********************/
26
INTCONbits.GIE  = 0;    // Interrupts generell erlauben
27
INTCONbits.RBIF = 0;    // Interrupt on Change Flag aus
28
INTCONbits.RBIE = 1;    // Interrupt on Change aktivieren
29
RCONbits.IPEN   = 0;    // Interrupt priority aus
30

31
/** S T A R T   H A U P T P R O G R A M M *********/
32
while(1)
33
{
34
  t = 0;
35
  t = tast();
36

37
  // Abfrage ob eine Taste gedrückt wurde.
38
  if( t )
39
  {
40
    SetDDRamAddr( 0 );    // Cursor auf Position 0.
41
    while( BusyXLCD() );  // Warten bis LCD fertig ist.
42
    putcXLCD( t );      // Ausgabe eines Zeichens am LCD.
43
    while( BusyXLCD() );  // Warten bis LCD fertig ist.
44
  }
45

46
  Delay1KTCYx( 50 );
47
}
48

49
}
50

51
// Tastatur abfragen
52
unsigned char tast( void )
53
{
54
  TRISA = 0x0F; // RA0 bis RA3 sind Eingänge
55

56
  PORTBbits.RB0 = 0;
57
  PORTBbits.RB1 = 1;
58
  PORTBbits.RB2 = 1;
59

60
  if( !PORTAbits.RA3 )
61
  {
62
      return '*';
63
  }
64

65
  return 0;
66
}

Ich suche nun schon 2 Abende aber ich finde das Problem nicht.

Bitte helft mir!
Danke
Andreas
Angehängte Dateien:
OP #1640831
Lesenswert?
• ▲
▼
Hab nach endlosem herum probieren noch immer keine Lösung gefunden.

Folgender Codefetzten bedeutet doch, dass der Char * nur zurückgegeben 
wird wenn an PIN RA3 ein Low Pegel anliegt oder? Dort liegt aber immer 
ein High Pegel an durch den Pull UP Widerstand R4. Wieso springt er dort 
trotzdem immer hinein? Woran kann das liegen?

1
// Tastatur abfragen
2
unsigned char tast( void )
3
{
4
  TRISA = 0x0F; // RA0 bis RA3 sind Eingänge
5

6
  if( !PORTAbits.RA3 )
7
  {
8
      return '*';
9
  }
10

11
  return 0;
12
}
OP #1641052
Lesenswert?
• ▲
▼
Peter Dannegger schrieb:
> Vielleicht solltest Du ein Leerzeichen ' ' ausgeben, wenn der Returnwert
> 0 ist.
> Sonst bleibt das einmal geschriebene Zeichen bis in alle Ewigkeit
> stehen.

Wenn der return Wert 0 ist passt alles weil ja if( t ) steht. Dann führt 
er die Schleife nicht aus. Das Problem ist das er trotz High an RA3 die 
Schleife ausführt und einen * zurück gibt als return Wert.
OP #1641715
Lesenswert?
• ▲
▼
Habe wieder weiter probiert. Wenn ich statt RA3 die PINs RA0 und RA1 
verwende funktioniert es das er nicht in die Schleife springt. Wenn ich 
RA2 bis RA5 verwende springt er wieder in die Schleife obwohl die PINs 
auf High liegen. Haben die PINs irgendeine spezielle Funktion oder 
bedürfen einer Sonderbehandlung? Im Datenblatt wäre mir nichts 
aufgefallen.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.