/* Sos1 2013 Eise Max Brahner Michael Heck Felix Uhr an LCD mit Weckfunktion & Datum Alarm.c AVR Studio 4 Compiler Options auf "0s" AVR Atmega32 */ #include #include #include "lcd.h" uint8_t ms=0,s1=0,s2=0,m1=0, // Variablen festlegen m2=0,h1=0,h2=0,w; // MS: Millisekunden S: Sekunden M: Minuten H: Stunden uint8_t t1=0,t2=0,mon1=0, // T: Tage MON: Monate J: Jahre mon2=0,j1=0,j2=0; uint8_t x1=0,x2=0; // Variablen zur Ausgabe von Uhrzeit uint8_t z1=0,z2=0; // Variablen zur Ausgabe von Uhrzeit des Weckers uint8_t y1=0,y2=0; // Variablen zur Ausgabe von Datum uint8_t day_complete=0; // Tag als Integer uint8_t month_complete=0; // Monat als Integer uint8_t year_complete=0; // Jahr als Integer uint8_t test1; uint8_t test2; //Name lytester //Eingabeparameter uint8_t year (Eingestelltes Jahr im Hauptprogramm) //Rückgabeparameter uint8_t 1 , wenn Schaltjahr // 0 , wenn kein Schaltjahr // //Funktion testet, ob das eingegebene Jahr ein Schaltjahr ist uint8_t leapyeartester (uint8_t year) { if((year%400==0) && !((year%100==0) && !(year%4==0))) return 1; else return 0; } //Name dpmtester //Eingabeparameter uint8_t monat (Eingestellter Monat im Hauptprogramm) // uint8_t jahr (Eingestelltes Jahr im Hauptprogramm) //Rückgabeparameter uint8_t Anzahl der Tage im Monat // //Funktion ermittelt, wieviel Tage der entsprechende Monat besitzt // abhängig von der Jahreszahl uint8_t dpmtester(uint8_t monat, uint8_t jahr) { uint8_t array_dpm[14] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; if (monat == 2) { // Februar: Schaltjahr unterscheiden if (leapyeartester(jahr)==1) return 29; else return 28; } if ((monat >= 1) && (monat <= 12)) return array_dpm[monat]; else { return 0; } } void setMonth () { y1=5; // Monate-Einer -- Schema siehe oben y2=0; mon1=-1; lcd_gotoxy(0,0); lcd_puts("Monat Einer*****"); lcd_gotoxy(y1,1); lcd_putc(y2+0x30); while (bit_is_set(PIND, PD3)); while (bit_is_clear(PIND, PD3)) for (mon1=0;mon1<10 && bit_is_clear(PIND, PD3);) { y2=mon1+0x30; lcd_gotoxy(y1,1); lcd_putc(y2); _delay_ms(350); mon1++; } y1=4; // Monate-Zehner -- Schema siehe oben y2=0; mon2=-1; lcd_gotoxy(0,0); lcd_puts("Monat Zehner****"); lcd_gotoxy(y1,1); lcd_putc(y2+0x30); if(mon1>3) // wenn März bis September { y2=0+0x30; lcd_gotoxy(y1,1); lcd_putc(y2); } else // sonst Wahl des Zehner-Monats { while (bit_is_set(PIND, PD3)); while (bit_is_clear(PIND, PD3)) for (mon2=0;mon2<2 && bit_is_clear(PIND, PD3);) { y2=mon2+0x30; lcd_gotoxy(y1,1); lcd_putc(y2); _delay_ms(350); mon2++; } } // Berechnen des Monats als Integer month_complete = ((mon2*10) + mon1); } /* Hauptprogramm */ int main(void) { PORTD|=(1< dpmresult) || (day_complete ==0)); /*+++++++++++++++++++++++++++++ -----------UHR STELLEN--------- +++++++++++++++++++++++++++++*/ lcd_clrscr (); // LCD clearen lcd_gotoxy(0,0); // Ausgabeposition festlegen lcd_puts("Die Uhr stellen"); // String ausgeben lcd_gotoxy(0,1); // Ausgabeposition festlegen lcd_puts("mit Taste S1"); // String ausgeben _delay_ms(2000); // Verzögerung von 2 Sekunden x1=8; // Variablen festlegen x2=0; m1=-1; // Minuten-Einer festlegen lcd_clrscr (); // LCD clearen lcd_gotoxy(4,0); // Ausgabeposition festlegen lcd_puts("Minuten E"); // String ausgeben lcd_gotoxy(x1,1); // Ausgabeposition festlegen lcd_putc(x2+0x30); // Variable + 30 ausgeben while (bit_is_set(PIND, PD3)); // Arrettieren solange nichts gedrückt while (bit_is_clear(PIND, PD3)) // Bei Tastendruck... for (m1=0;m1<10 && bit_is_clear(PIND, PD3);) { m1++; // Minute-Einer inkrementieren x2=m1+0x30; // Minuten-Einer + 30 wird Variable zugewies1n lcd_gotoxy(x1,1); // Ausgabeposition festlegen lcd_putc(x2); // Variable ausgeben _delay_ms(1000); // Verzögerung von 1 sekunde } x1=7; // Minuten-Zehner -- Schema siehe oben x2=0; m2=-1; lcd_gotoxy(4,0); lcd_puts("Minuten Z"); lcd_gotoxy(x1,1); lcd_putc(x2+0x30); while (bit_is_set(PIND, PD3)); while (bit_is_clear(PIND, PD3)) for (m2=0;m2<6 && bit_is_clear(PIND, PD3);) { m2++; x2=m2+0x30; lcd_gotoxy(x1,1); lcd_putc(x2); _delay_ms(1000); } x1=5; // Stunden-Einer -- Schema siehe oben x2=0; h1=-1; lcd_gotoxy(4,0); lcd_puts("Stunden E "); lcd_gotoxy(x1,1); lcd_putc(x2+0x30); while (bit_is_set(PIND, PD3)); while (bit_is_clear(PIND, PD3)) for (h1=0;h1<10 && bit_is_clear(PIND, PD3);) { h1++; x2=h1+0x30; lcd_gotoxy(x1,1); lcd_putc(x2); _delay_ms(1000); } x1=4; // Stunden-Zehner -- Schema siehe oben x2=0; h2=-1; lcd_gotoxy(4,0); lcd_puts("Stunden Z "); lcd_gotoxy(x1,1); lcd_putc(x2+0x30); while (bit_is_set(PIND, PD3)); while (bit_is_clear(PIND, PD3)) for (h2=0;h2<3 && bit_is_clear(PIND, PD3);) { h2++; x2=h2+0x30; lcd_gotoxy(x1,1); lcd_putc(x2); _delay_ms(1000); } lcd_gotoxy(0,0); // Uhr starten mit S2 lcd_puts("S2 Uhr starten"); lcd_gotoxy(6,1); lcd_puts(":"); _delay_ms(1000); /*+++++++++++++++++++++++++++++ -----------UHR STARTEN--------- +++++++++++++++++++++++++++++*/ while (bit_is_set(PIND, PD1)); // Arrettieren solange nichts gedrückt lcd_clrscr (); // LCD clearen lcd_gotoxy(4,0); // Ausgabeposition festlegen lcd_puts("AVR-Uhr"); // String ausgeben lcd_gotoxy(4,1); // Ausgabeposition festlegen lcd_puts(" : : "); // String ausgeben /*+++++++++++++++++++++++++++++ ---------UHR IM BETRIEB-------- +++++++++++++++++++++++++++++*/ for(;;) // Uhr im Betrieb { _delay_ms(10); ms++; if(ms>=95)//94 { ms=0; s1++; } w=s1; s1=s1+0x30; lcd_gotoxy(11,1); lcd_putc(s1); s1=w; if(s1>9) { s1=0; s2++; } w=s2; s2=s2+0x30; lcd_gotoxy(10,1); lcd_putc(s2); s2=w; if(s2>5) { s2=0; m1++; } w=m1; m1=m1+0x30; lcd_gotoxy(8,1); lcd_putc(m1); m1=w; if(m1>9) { m1=0; m2++; } w=m2; m2=m2+0x30; lcd_gotoxy(7,1); lcd_putc(m2); m2=w; if(m2>5) { m2=0; h1++; } w=h1; h1=h1+0x30; lcd_gotoxy(5,1); lcd_putc(h1); h1=w; if(h1>9) { h1=0; h2++; } w=h2; h2=h2+0x30; lcd_gotoxy(4,1); lcd_putc(h2); h2=w; if((h2>=2) & (h2>=4)) { h2=0; h1=0; } } return 0; }