void init_port(void);
char clock_number(int);
void digit_1(int);
void digit_2(int);
void digit_3(int);
void digit_4(int);
void clr_digit(void);
void A4_digit_clock(void);
void increment_hr_mint(void);
void hr_mint_write(void);
volatile char *outf = (volatile char *) 0x31;
volatile char *outk = (volatile char *) 0x108;
volatile char *outb = (volatile char *) 0x25;
volatile char *ina = (volatile char *) 0x20;
int hr1, hr2, mint1, mint2;
int hr = 00, mint = 00, sec = 00;
void setup()
{
init_port();
init_timer();
// put your setup code here, to run once:
}
void init_port(void)
{
volatile char *dirf = (volatile char *) 0x30;
volatile char *dirk = (volatile char *) 0x107;
volatile char *dirb = (volatile char *) 0x24;
volatile char *dira = (volatile char *) 0x21;
*dirb = 0x01;
*dira = 0x00;
*dirf = 0xff;
*dirk = 0x0f;
}
void init_timer(void)
{
volatile char *timer1_TCCR1A = (volatile char *)0X80;
volatile char *timer1_TCCR1B = (volatile char *)0x81;
volatile short *timer1_TCNT1 = (volatile short *)0x84;
volatile short *timer1_OCR1A = (volatile short *)0x88;
volatile char *timer1_TIMSK1 = (volatile char *)0x6F;
*timer1_TCCR1A = 0;
*timer1_TCCR1B = 0;
*timer1_TCNT1 = 0;
*timer1_OCR1A = 15800;
*timer1_TCCR1B = 0x0d;
*timer1_TIMSK1 = 0x02;
}
char clock_number(int x)
{
char outf [10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
char out = outf[x];
return out;
}
void digit_1(int y)
{
*outf = clock_number(y);
*outk = 0x0e;
}
void digit_2(int y)
{
*outf = clock_number(y);
*outk = 0x0d;
}
void digit_3(int y)
{
*outf = clock_number(y);
*outk = 0x0b;
}
void digit_4(int y)
{
*outf = clock_number(y);
*outk = 0x07;
}
void clr_digit(void)
{
*outf = 0x00;
*outk = 0xff;
}
void A4_digit_clock(void)
{
digit_1(hr1);
clr_digit();
digit_2(hr2);
clr_digit();
digit_3(mint1);
clr_digit();
digit_4(mint2);
clr_digit();
}
void increment_hr_mint(void)
{
if((*ina & 0x01) == 0x01)
{
delay(250);
hr++;
if (hr>23)
{
hr = 00;
}
}
else if ((*ina & 0x02) == 0x02)
{
delay(250);
mint++;
if (mint>59)
{
mint = 00;
}
}
hr_mint_write();
}
void alarm(void)
{
if((*ina & 0x04) == 0x04)
{
}
}
void hr_mint_write(void)
{
hr1 = hr/10;
hr2 = hr%10;
mint1 = mint/10;
mint2 = mint%10;
}
ISR(TIMER1_COMPA_vect)
{
*outb = *outb ^ 0x01;
sec++;
if(sec >59)
{
mint++;
if (mint > 59)
{
hr++;
if(hr > 23)
{
hr = 00;
}
mint = 00;
}
sec = 00;
}
hr_mint_write();
}
void loop()
{
increment_hr_mint();
A4_digit_clock();
}