// 7-Segmentanzeige, Common Cathode, 4 Anzeigen // ATmega8, 8MHz // AVR-Studio, Optimierungsgrad: O2 // erstellt am 13/12/2010 // www.alex-handfest.de #include #include // gibt die Zahl auf der 7-Segmentanzeige aus // mögliche Zahlenwerte: -999 bis 9999 void seg7_zahl (int); // gibt eine einstellige positive Zahl an der angegeben Stelle aus // seg7_stellezahl ( Stelle 0..3, Zahl 0..9) void seg7_stellezahl (char, char); // Pin- und Portlogik void seg7_pins (char); void seg7_ports (char); //Variablen für 7-Segmentanzeige unsigned char multiplex_count = 0; unsigned char negativ = 0; unsigned char seg7_stelle[4] = {'\0'}; //Variablen für das Testprogramm unsigned int sek_count = 0; signed int count = -1300; int main(void) { //Globale Interrupts einschalten sei(); //Timer init TCCR0 = (0< 0,002048s // Interrupt Frequenz >= 200 Hz, sonst flackert die Anzeige //Ausgänge DDRD = 0xff; // PortD: 8 Ausgänge (7 Segmente + Punkt) // Common Cathode -> aktive high für Zahl DDRC = 0xff; // PortC: 4 Ausgänge (Anzahl der Zahlen) // CC NPN gesteuert -> aktive high für Stelle //nach der Inizialisierung wird 'ini.' angezeigt seg7_stelle[0] = 'i'; seg7_stelle[1] = 'n'; seg7_stelle[2] = 'i'; seg7_stelle[3] = 'p'; while(1){ //leere Schleife } return 0; } // --------- Time Overflow alle 0,002048s -------- ISR(TIMER0_OVF_vect){ // 7-Segmentanzeige if (multiplex_count == 4) multiplex_count = 0; seg7_pins(seg7_stelle[multiplex_count]); seg7_ports(multiplex_count); multiplex_count++; // Testprogramm: sek_count++; if (sek_count == 10){ //10 * 0,002048s sek_count = 0; if (count > 10500) count = -1300; //zählt von -1300 bis 10500 count++; seg7_zahl(count); } } // --------- Einlesen und Auswerten der Zahl -------- void seg7_zahl (signed int zahl){ //mögliche Zahlenwerte: -999 bis 9999 if (zahl < 0){ zahl = zahl * -1; //aus negativ wird positiv negativ = 1; } else negativ = 0; if (zahl < 10) { //eine 1-stellige Zahl seg7_stelle[0] = zahl%10; if (negativ == 0) seg7_stelle[1] = 'x'; else seg7_stelle[1] = 'n'; seg7_stelle[2] = 'x'; seg7_stelle[3] = 'x'; } else if (zahl < 100) { //eine 2-stellige Zahl seg7_stelle[0] = zahl%10; seg7_stelle[1] = (zahl%100 - seg7_stelle[0]) / 10; if (negativ == 0) seg7_stelle[2] = 'x'; else seg7_stelle[2] = 'n'; seg7_stelle[3] = 'x'; } else if (zahl < 1000) { //eine 3-stellige Zahl seg7_stelle[0] = zahl%10; seg7_stelle[1] = (zahl%100 - seg7_stelle[0]) / 10; seg7_stelle[2] = (zahl%1000 - seg7_stelle[1]) / 100; if (negativ == 0) seg7_stelle[3] = 'x'; else seg7_stelle[3] = 'n'; } else if (zahl < 10000 && negativ == 0){ //eine 4-stellige positive Zahl seg7_stelle[0] = zahl%10; seg7_stelle[1] = (zahl%100 - seg7_stelle[0]) / 10; seg7_stelle[2] = (zahl%1000 - seg7_stelle[1]) / 100; seg7_stelle[3] = (zahl%10000 - seg7_stelle[2]) / 1000; } else if (zahl >=1000 && negativ == 1){ //Fehlerausgabe: " lo " wenn Zahl < -999 seg7_stelle[0] = 'x'; seg7_stelle[1] = 'o'; seg7_stelle[2] = 'l'; seg7_stelle[3] = 'x'; } else { //Fehlerausgabe: " hi " wenn Zahl > 9999 seg7_stelle[0] = 'x'; seg7_stelle[1] = 'i'; seg7_stelle[2] = 'h'; seg7_stelle[3] = 'x'; } } // --------- schreiben einer Zahl an einer bestimmten Stelle -------- void seg7_stellezahl (char stelle, char zahl){ seg7_ports(stelle); seg7_pins(zahl); } // --------- Pinlogik -------- void seg7_pins (char schreiben){ //schaltet die Pins für eine Stelle //PD0=a, 1=b, 2=c, 3=d, 4=e, 5=dot, 6=g, 7=f // fg.edcba if (schreiben == 0 ) PORTD = 0b10011111; if (schreiben == 1 ) PORTD = 0b00000110; if (schreiben == 2 ) PORTD = 0b01011011; if (schreiben == 3 ) PORTD = 0b01001111; if (schreiben == 4 ) PORTD = 0b11000110; if (schreiben == 5 ) PORTD = 0b11001101; if (schreiben == 6 ) PORTD = 0b11011101; if (schreiben == 7 ) PORTD = 0b00000111; if (schreiben == 8 ) PORTD = 0b11011111; if (schreiben == 9 ) PORTD = 0b11001111; if (schreiben == 'n') PORTD = 0b01000000; //negativ if (schreiben == 'h') PORTD = 0b11010100; //h von high if (schreiben == 'i') PORTD = 0b00000100; //i von high if (schreiben == 'l') PORTD = 0b10011000; //l von low if (schreiben == 'o') PORTD = 0b01011100; //o von low if (schreiben == 'x') PORTD = 0b00000000; //nix, leer if (schreiben == 'p') PORTD = 0b00100000; //Punkt // fg.edcba } // --------- Portlogik -------- void seg7_ports (char port){ //schaltet die STellen (nicht Ports ^^) if (port == 0) PORTC = 0b00000001; if (port == 1) PORTC = 0b00000010; if (port == 2) PORTC = 0b00000100; if (port == 3) PORTC = 0b00001000; }