So eben bin ich auf eine andere Idee gekommen.
Könnte ich die ganze Sache nicht einfach mit einem Inkrement lösen. Bei jedem Tastendruck eine Variable um eins erhöhen und einfach an einem Port ausgeben? Soweit die Theorie. Wie sieht das ganze in C aus.
Klar kannst du das machen. Hier ist mal der Code einer "Uhr". Das Programm verwendet einerseits einen Timer-Interrupt um eine Variable hochzuzählen und überprüft andererseits zwei Taster und einen Schalter, mit denen man die Uhr stellen kann.
Code:
#define __AVR_ATmega8
#include <inttypes.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
volatile uint8_t zeitZaehl, second, minute, hour;
void ioinit (void)
{
/*Ports*/
DDRB = 0;
DDRD = 2; //alles bis auf TX auf Ausgang
PORTD = 28; //Pullups an PD2-4 an
/*Timer2 - Prescale 64*/
ASSR=BV(AS2); //externen Uhrenquarz verwenden
TCCR2=1; //kein Prescale
TIMSK=BV(TOIE2); //Interupt an
sei (); /*Interrupts an*/
hour=17;minute=52;
}
int main (void)
{
ioinit ();
for (;;) /* Endlosschleife */
{;}
return (0);
}
SIGNAL (SIG_OVERFLOW2)
{
if (++zeitZaehl>127){
zeitZaehl=0;
if (++second>59)
{
second=0;
if (++minute>59)
{
minute=0;
if (++hour>23)
{
hour=0;
}
}
}
if (!(PIND&4))
{
if (PIND&16) {if (++hour>23) hour=0;}
else if (++minute>59) minute=0;
}
if (!(PIND&8))
{
if (PIND&16) {if (--hour>200)hour=23;}
else if (--minute>200)minute=59;
}
}
}
Wenn du Fragen zu einzelnen Codestellen hast, nur zu!
Lesezeichen