#include #include #include #include #define DATA_SET PORTB |= (1<<4) //Schreibe 1 in momentan Pin #define DATA_CLR PORTB &= ~(1<<4)//Schreibe 0 in momentanen Pin #define CLK_SET PORTB |= (1<<3) //Schiebt das Bit ins Schieberegister #define CLK_CLR PORTB &= ~(1<<3) #define STROBE_SET PORTB |= (1<<2)// Strobe gibt die Zustände durch #define STROBE_CLR PORTB &= ~(1<<2) #define clear_all led[0]=0;led[1]=0;led[2]=0;led[3]=0;led[4]=0;led[5]=0;led[6]=0;led[7]=0;led[8]=0;led[9]=0;led[10]=0;led[11]=0 #define StundeLinks0 led[3]|=0x1F; led[4]|=0x11; led[5]|=0x1F //0X:XX #define StundeLinks1 led[3]|=0x00; led[4]|=0x00; led[5]|=0x1F //1X:XX #define StundeLinks2 led[3]|=0x1D; led[4]|=0x15; led[5]|=0x17 //2X:XX #define StundeRechts0 led[7]|=0x1F; led[8]|=0x11; led[9]|=0x1F //X0:XX #define StundeRechts1 led[7]|=0x00; led[8]|=0x00; led[9]|=0x1F //X1:XX #define StundeRechts2 led[7]|=0x1D; led[8]|=0x15; led[9]|=0x17 //X2:XX #define StundeRechts3 led[7]|=0x11; led[8]|=0x15; led[9]|=0x1F //X3:XX #define StundeRechts4 led[7]|=0x07; led[8]|=0x04; led[9]|=0x1F //X4:XX #define StundeRechts5 led[7]|=0x17; led[8]|=0x15; led[9]|=0x1D //X5:XX #define StundeRechts6 led[7]|=0x1F; led[8]|=0x15; led[9]|=0x1D //X6:XX #define StundeRechts7 led[7]|=0x01; led[8]|=0x01; led[9]|=0x1F //X7:XX #define StundeRechts8 led[7]|=0x1F; led[8]|=0x15; led[9]|=0x1F //X8:XX #define StundeRechts9 led[7]|=0x17; led[8]|=0x15; led[9]|=0x1F //X9:XX #define MinuteLinks0 led[3]|=0x3E0; led[4]|=0x220; led[5]|=0x3E0 //XX:0X #define MinuteLinks1 led[3]|=0x000; led[4]|=0x000; led[5]|=0x3E0 //XX:1X #define MinuteLinks2 led[3]|=0x3A0; led[4]|=0x2A0; led[5]|=0x2E0 //XX:2X #define MinuteLinks3 led[3]|=0x2A0; led[4]|=0x2A0; led[5]|=0x3E0 //XX:3X #define MinuteLinks4 led[3]|=0x0E0; led[4]|=0x080; led[5]|=0x3E0 //XX:4X #define MinuteLinks5 led[3]|=0x2E0; led[4]|=0x2A0; led[5]|=0x3A0 //XX:5X #define MinuteRechts0 led[7]|=0x3E0; led[8]|=0x220; led[9]|=0x3E0 //XX:X0 #define MinuteRechts1 led[7]|=0x000; led[8]|=0x000; led[9]|=0x3E0 //XX:X1 #define MinuteRechts2 led[7]|=0x3A0; led[8]|=0x2A0; led[9]|=0x2E0 //XX:X2 #define MinuteRechts3 led[7]|=0x2A0; led[8]|=0x2A0; led[9]|=0x3E0 //XX:X3 #define MinuteRechts4 led[7]|=0x0E0; led[8]|=0x080; led[9]|=0x3E0 //XX:X4 #define MinuteRechts5 led[7]|=0x2E0; led[8]|=0x2A0; led[9]|=0x3A0 //XX:X5 #define MinuteRechts6 led[7]|=0x3E0; led[8]|=0x2A0; led[9]|=0x3A0 //XX:X6 #define MinuteRechts7 led[7]|=0x020; led[8]|=0x020; led[9]|=0x3E0 //XX:X7 #define MinuteRechts8 led[7]|=0x3E0; led[8]|=0x2A0; led[9]|=0x3E0 //XX:X8 #define MinuteRechts9 led[7]|=0x2E0; led[8]|=0x2A0; led[9]|=0x3E0 //XX:X9 #define SekundeOn led[11]|=0x00A; #define SekundeOff led[11]=0x000; //Variablen uint16_t spalte=0; uint8_t count=0; uint16_t led[12]; volatile unsigned char sekunden; volatile unsigned char minuten; volatile unsigned char stunden; uint8_t Std_L,Std_R,Min_L,Min_R; void Zeitberechnung() { clear_all; Std_L=stunden/10; Std_R=stunden%10; Min_L=minuten/10; Min_R=minuten%10; switch(Std_L) { case 0:StundeLinks0;break; case 1:StundeLinks1;break; case 2:StundeLinks2;break; } switch(Std_R) { case 0:StundeRechts0;break; case 1:StundeRechts1;break; case 2:StundeRechts2;break; case 3:StundeRechts3;break; case 4:StundeRechts4;break; case 5:StundeRechts5;break; case 6:StundeRechts6;break; case 7:StundeRechts7;break; case 8:StundeRechts8;break; case 9:StundeRechts9;break; } switch(Min_L) { case 0:MinuteLinks0;break; case 1:MinuteLinks1;break; case 2:MinuteLinks2;break; case 3:MinuteLinks3;break; case 4:MinuteLinks4;break; case 5:MinuteLinks5;break; } switch(Min_R) { case 0:MinuteRechts0;break; case 1:MinuteRechts1;break; case 2:MinuteRechts2;break; case 3:MinuteRechts3;break; case 4:MinuteRechts4;break; case 5:MinuteRechts5;break; case 6:MinuteRechts6;break; case 7:MinuteRechts7;break; case 8:MinuteRechts8;break; case 9:MinuteRechts9;break; } if(sekunden%2==1) { SekundeOn; } else { SekundeOff; } } void inittimer() { //32768 1/s mit 8Bit 2^8 -> 256s mit Prescaler 128 = 1s //Timer2 ASSR|=(1< 0,01s pro Bildaufbau 10ms/12=0,83ms pro Zeile // 1 MHz --> 1 us * 830= 0,83 us sei(); } ISR(TIMER2_OVF_vect) { sekunden++; if(sekunden==60) { sekunden=0; minuten++; if(minuten==60) { minuten=0; stunden++; if(stunden==24) { stunden=0; } } } } ISR(TIMER1_COMPA_vect) { count++; if (count==12) { count=0; DATA_CLR; } else { DATA_SET; } CLK_SET; CLK_CLR; PORTB &= ~0x03; PORTC &= ~0x0F; PORTD &= ~0xF0; STROBE_SET; STROBE_CLR; spalte=led[count]; PORTB |=(spalte >> 8) & 0x03; PORTC |=spalte & 0x0F; PORTD |=spalte & 0xF0; } int main(void) { //int16_t Zeile; sekunden=50; minuten=47; stunden=13; DDRC = 0x0f; // PC0-PC3 (R1-R9) zu Ausgänge DDRB = 0xff; // PD4-PD7 (R5-R8) zu Ausgänge DDRD = 0xff; // PB0-PB1 (R9-R10() zu Ausgänge //ACSR = 0x80; PORTD = 0; // alle Bits auf 0 PORTB = 0; PORTC = 0; inittimer(); while(1) { Zeitberechnung(); } }