#include  // Definitionen laden
#include  // Interrupts laden
#include  // Delay-Bibliothek laden

// **  mit STK 200 (LED neg. Logik) und ATtiny2313 @ 1MHz

/* 6 LEDs sollen in ihrer Helligkeit gesteuert werden
   Helligkeit soll Werte von 0 bis 15 annehmen
   Wiederholung 100 mal pro Sekunde: ISR muss 1500 * pro Sekunde aufgerufen werden
*/

unsigned char helligkeit[]={7,15,14,0,1,2,3}; // Helligkeitswerte der LED

ISR(TIMER0_OVF_vect){
  static unsigned char level = 0;           // zaehlt die Helligkeitslevel
  unsigned char i,ausgabe=0;
  PORTB |= 128; // PB7 an
  TCNT0= ?;                                 // wieder richtig vorspannen
  for (i=0;i<7;i++){
    if(level>=helligkeit[i]) ausgabe |= 1 << i; // LED aus
  }
  PORTB = (PORTB & 0b10000000) | ausgabe;
  if (level >= 14) level = 0;
  else level++;
  PORTB &= ~128; // PB7 aus
}

#define KEYREADER ~PIND & 0b00111111 // Einlesen, invertieren, maskieren zurecht schieben  
#include "keycheck.inc"        // http://mezdata.de/avr/083_c-entprellen/keycheck.inc 

unsigned char auswerteTaste(){ // ermittelt die Nummer der niedrigsten Taste
  unsigned char i;
  for (i=0;i<6;i++){
    if(keyEnter&(1 << i)) break;
  }
  return i;
}

int main(){          // Hauptprogramm
  unsigned char i,up =1;
  PORTB=0xff;        // alle LED aus
  DDRB=0xff;         // PB als Ausgang
  TCCR0B = ?;        // Phi / ?
  TIMSK = 1<< TOIE0; // Interrupt frei geben
  sei();             // globale Interruptfreigabe
  while(1){          // Endlosschleife
    keyCheck();
    if (keyEnter){
      i = auswerteTaste();
      if (helligkeit[i]>=15) helligkeit[i]=0;
      else helligkeit[i]++;
    }
    else{
      if(up){
        if (helligkeit[6]>=15) up=0;
        else helligkeit[6]++;
      }
      else{
        if (helligkeit[6]<=0) up=1;
        else helligkeit[6]--;
      }
      _delay_ms(50);
    }
  }
  return 0;
}