Hallo,
mein "Progrämmchen" ist etwas zu groß geworden, vllt findet einer von
euch noch eine Möglichkeit etwas zu kürzen... Ich habe schon Stunde in h
abgekürzt, damit es etwas weniger Speicher frisst, aber es reicht noch
nicht... (also eine abgespeckte Version, wenn z.B. wieder von 0,0,0
anstatt von der aktuellen Uhrzeit gestellt wird habe ich schon)
Bevor ich es vergesse... das Programm steuert eine LCD Anzeige an und
frägt zu Beginn die aktuelle Uhrzeit ab, danach läuft die Uhr und man
kann sie wieder stellen, wenn man nochmals den Taster drückt...
Vielleciht findet auch noch einer eine Verbesserung, denn im Moment ist
es ja so, dass die Uhrzeit nicht ununterbrochen läuft sondern, imer
wieder aussetzt, wenn Daten an das LCD-Display geschickt werden...
Hier der Code:
1 | #include "lcd.c"
|
2 | #include <avr/interrupt.h>
|
3 |
|
4 | volatile unsigned char time_ist;
|
5 | unsigned char Buffer[20];
|
6 | unsigned int std=0;
|
7 | unsigned int min=0;
|
8 | unsigned int sek=0;
|
9 |
|
10 | ISR (TIMER1_COMPA_vect ) {
|
11 | time_ist++;
|
12 | }
|
13 |
|
14 | void timer (unsigned long time_soll) {
|
15 | time_ist = 0;
|
16 | TCCR1A = 0;
|
17 | TCCR1B = 1 <<CS10;
|
18 | TCCR1B |= 1 <<WGM12;
|
19 | OCR1A = 64000 ;
|
20 | TIMSK = 1 << OCIE1A;
|
21 | sei();
|
22 | while (time_soll >= time_ist) {}
|
23 | }
|
24 |
|
25 | int zeit (int einheit, int umbruch,const char* worte){
|
26 | lcd_clrscr ();
|
27 | lcd_puts (worte);
|
28 | itoa( einheit, Buffer, 10 );
|
29 | lcd_puts (Buffer);
|
30 | timer(50);
|
31 | while(PIND & (1<<PIND4) )
|
32 | if(!(PIND & (1<<PIND3) )) {
|
33 | if(++einheit == umbruch) einheit = 0;
|
34 | lcd_clrscr ();
|
35 | lcd_puts (worte);
|
36 | itoa( einheit, Buffer, 10 );
|
37 | lcd_puts (Buffer);
|
38 | timer(50);
|
39 | }
|
40 | return einheit;
|
41 | };
|
42 |
|
43 | void stellen(){
|
44 | std = zeit(std,24,"h: ");
|
45 | min = zeit(min,60,"min: ");
|
46 | sek = zeit(sek,60,"s: ");
|
47 | }
|
48 |
|
49 | int main (void) {
|
50 |
|
51 | PORTD= 0x18;
|
52 | DDRD = 0x18;
|
53 | lcd_init (LCD_DISP_ON);
|
54 | stellen();
|
55 |
|
56 | for (;;){
|
57 | timer (250);
|
58 | if(++sek == 60){
|
59 | sek = 0;
|
60 | if(++min == 60){
|
61 | min = 0;
|
62 | if(++std == 24){
|
63 | std = 0;
|
64 | }
|
65 | }
|
66 | }
|
67 | lcd_clrscr ();
|
68 | lcd_puts (" ");
|
69 | if(std < 10) lcd_puts("0");
|
70 | itoa( std, Buffer, 10 );
|
71 | lcd_puts (Buffer);
|
72 | lcd_puts(":");
|
73 | if(min < 10) lcd_puts("0");
|
74 | itoa( min, Buffer, 10 );
|
75 | lcd_puts (Buffer);
|
76 | lcd_puts(":");
|
77 | if(sek < 10) lcd_puts("0");
|
78 | itoa( sek, Buffer, 10 );
|
79 | lcd_puts (Buffer);
|
80 | if(!(PIND & (1<<PIND4))) stellen();
|
81 | };
|
82 | }
|
Vielen Dank schon einmal :)