#include #define F_CPU 16000000 #include #define HOURS 3 #define MINUTES 17 #define SECONDS 50 #define PERIOD 121 #define ON_TIME 2 void switch_line(double *a, double *b){ double aux; aux = *a; *a = *b; *b = aux; } int angleToMs(double angle){ return (int)(PERIOD * angle/360); } int main(){ double h = HOURS, m = MINUTES, s = SECONDS; double ms = 0; double angle_hour, angle_minute, angle_second; int current_time, aux; DDRD = 0xFF; PORTD = 63; while(1){ angle_hour = (double)360/12 * h + (double)360/(12*60) * m + (double)360/(12*60*60) * s; angle_minute = (double)360/60 * m + (double)360/(60*60) * s; angle_second = (double)360/60 * s; if(angle_minute > angle_second) switch_line(&angle_minute, &angle_second); if(angle_hour > angle_minute) switch_line(&angle_hour, &angle_minute); if(angle_minute > angle_second) switch_line(&angle_minute, &angle_second); current_time = 0; aux = angleToMs(angle_hour); _delay_ms(aux); PORTD = PORTD ^ 63; _delay_ms(ON_TIME); PORTD = PORTD ^ 63; current_time += (aux + ON_TIME); aux = angleToMs(angle_minute) - current_time; if(aux > 0){ _delay_ms(aux); PORTD = PORTD ^ 63; _delay_ms(ON_TIME); PORTD = PORTD ^ 63; current_time += (aux + ON_TIME); } aux = angleToMs(angle_second) - current_time; if(aux > 0){ _delay_ms(aux); PORTD = PORTD ^ 63; _delay_ms(ON_TIME); PORTD = PORTD ^ 63; current_time += (aux + ON_TIME); } aux = PERIOD - current_time; if(aux > 0) _delay_ms(aux); ms += PERIOD; if(ms >= 1000){ s ++; ms = ms - 1000; } if(s == 60) { m ++; s = 0; } if(m == 60){ h ++; m = 0; } if(h == 12) h = 0; } return 0; }