Hochzähler in C..Microkontroller
-
Hallo, müssen einen Code zum Hochzählen einer 7SEG Anzeige (0000-9999) erstellen, dass ganze soll auf einem AVR Microkontroller laufen. Sprache C. Handelt sich um ein Unterprogramm.
Könnte evtl. jemand kurz drüberschauen? Ist nochn Fehler drin bzw. lässt sich etwas vereinfachen?
/* Anmerkungen: - zahlen[] beinhaltet die a,b,c,d,e,f,g Kombinationen für die jeweiligen Zahlen - aktWert[] wird dazu verwendet um den Zählstand mit der Timer-Zähl-Routine auszutauschen - aktStand ist im Prinzip dasselbe, nur als integer... - zustand dient zur Erfassung der steigenden Flanke( bei 0-Logik das Loslassen der Taste ) - die Initialisierung vom Timer muss eventuell noch getrimmt werden...(man müsste halt wissen wie schnell gezählt werden soll) - in dem Beispiel wird davon ausgegangen dass beim Loslassen des Tasters(an PINB) der Zählvorgang gestartet wird */ #define F_CPU 8000000 // #include <stdio.h> #include <avr/io.h> #include <avr/interrupt.h> const unsigned char zahlen[10] = {0x3f, 0x08, 0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned char aktWert[4] = { 0,0,0,0}; // am Anfang 0 bool zustand = true; int main(){ /* Initialisierung der PORTS PORTA : a-g PORTB : Eingang für Schalter PORTC : Segment0 - Segment3 */ DDRA = 0xff; // A auf Ausgang PORTB = 0xff; DDRC = 0xff; // C auf Ausgang // Timer initialisieren TCCR0 = 3; // Systemtakt / 64 TIMSK |= (1<<TOIE0); while(1){ for(int i=0, k=1; i<4; i++, k*=2){ PORTA = zahlen[aktWert[i]]; PORTC = k; } if(PINB == 0xff && zustand==false) { sei();} else if(PINB != 0xff) zustand = false; else zustand = true; } } ISR(TIMER0_OVF_vect){ static signed int aktStand = 0; unsigned int tmp; if(aktStand==9999){aktWert[0]=0; aktWert[1]=0; aktWert[2]=0; aktWert[3]=0; aktStand = -1;} aktStand++; tmp = aktStand; for(int i=0; i<4; i++){ aktWert[i]= tmp % 10; tmp /= 10; } }