[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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren