Tastenmatrix, mal wieder

OP #2640728
Lesenswert?

Edit: Vergesst es, hab PullDowns vergessen...

Hi,
ich versuch grade eine Tastenmatrix auszulesen, aber irgendwie 
verzweifel ich grade.
Anzeigen tu ich mir die gedrückte Taste aktuell noch auf einer 7 Segment 
Anzeige, das funktioniert einwandfrei.
Die Anzeige springt aber hin und her, ich hab jetzt alles soweit raus 
gelöscht, das ich nurnoch 1, 4, 7 oder n (für Stern-Taste) anzeige.
Mal steht die Anzeige, dann springt alles wild hin und her. Ein 
Tastendruck wird nur manchmal wirklich angezeigt, danach flimmert alles 
wieder. Normal soll die letzte gedrückte Taste einfach dauerhaft 
angezeigt werden.
Angeschlossen ist im Konkreten Beispiel PC5 als Output, über die 
Tastenmatrix zurück auf PD0..PD3

Hat jemand Rat warum die Anzeige spinnt? Bzw warum's nicht so hinhaut 
wie ichs möchte?
1
#define F_CPU 16000000
2

3

4
/* Includes */
5
#include <avr/io.h>
6
#include <util/delay.h>
7
#include <avr/interrupt.h>
8

9
#include "config.h"
10

11
uint8_t pressed = 12;    //12 = Default Wert, 10 = *, 11 = #
12

13
int main (void)
14
{
15
  TCCR0 |= (1<<CS02)|(1<<CS00);        //CS02, CS00: Prescaler 1024, ~16,384ms
16
  TCCR2 |= (1<<CS22)|(1<<CS20);        //CS22: Prescaler 128, ~10,24ms
17
  TIMSK |= (1<<TOIE0)|(1<<TOIE2);      //Overflow Enable für Timer0&Timer2 (8bit)
18

19
  DDRD = 0b11110000;      //Ausgänge setzen
20
  DDRC |= (1<<DDC5);      //Ausgang setzen
21
  PORTC |= (1<<PC5);      //PullUps Einschalten
22

23
  sei();
24

25
  while(1)
26
  {
27
    [...] //Zuweisung Tastendruck -> Anzeige (und reset von 'pressed' auf 12)
28
  }
29
}
30

31
ISR(TIMER2_OVF_vect)
32
{
33
    [...]
34
}
35

36
ISR(TIMER0_OVF_vect)
37
{
38
  //Tastendruck zu "pressed" zuweisen
39
  if (Row1) pressed = 1;
40
  if (Row2) pressed = 4;
41
  if (Row3) pressed = 7;
42
  if (Row4) pressed = 10;  
43
}

config.h:
1
#define Row1 (PIND & (1<<PIND0))
2
#define Row2 (PIND & (1<<PIND1))
3
#define Row3 (PIND & (1<<PIND2))
4
#define Row4 (PIND & (1<<PIND3))

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