// 数码管数据 P0 口,数码管控制 P2 口

#include


#include

#include

#include

#include

#define code PROGMEM

#define uchar unsigned char

#define uint unsigned int

code const ucharLED_7[16] = {0x28, 0x7E, 0xA2, 0x62, 0x74, 0x61, 0x21, 0x7A, 0x20, 0x60,0xff};//common of +

code const uchar position[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};

 

 

uchar TIme[4]; // 时间计数

volaTIle uchar disp_buff[8]; // 显示缓冲区

volaTIle uchar TIme_count = 0;

volatile uchar point_on = 0;

volatile uchar posit = 0;

volatile uchar time_10ms_ok = 0;

void time_to_dispbuff(void);

void time1_init(void);

void time0_init(void);

void display(void);

int main(void)

{

PORTA = 0xff;

DDRA = 0xff;

PORTC = 0xff;

DDRC = 0xff;

time[0] = 00;//1/10sec

time[1] = 30;//sec

time[2] = 59;//minute

time[3] = 23;//hour

time_to_dispbuff();

time1_init();

sei();

while(1)

{

if(time_10ms_ok)

{

time_10ms_ok = 0;

if(++time[0]》=100)

{

time[0] = 0;

point_on = ~point_on;

if(++time[1]》=60)

{

time[1] = 0;

if(++time[2]》=60)

{

time[2] = 0;

if(++time[3]》=24)

{

time[3] = 0;

}

}

}

}

time_to_dispbuff();

}

}

}

void time0_init(void)

{

TCCR0 = 0x05;

TCNT0 = 0xea;

TIFR |= 0x02;

TIMSK |= 0x02;

}

void time1_init(void)

{

TCCR1A = 0x00;

TCCR1B = 0x01;

TCNT1 = 0xa99a;

//TCNT1H = 0xa9;

//TCNT1L = 0x9a;

TIFR |= 0x80;

TIMSK |= 0x80;

}

SIGNAL(SIG_OVERFLOW1)

{

TCNT1 = 0xa99a;

display();

if(++time_count 》=5)

{

time_10ms_ok = 1;

time_count = 0;

}

}

void display(void)

{

PORTC = 0xff;

PORTA = pgm_read_byte(&led_7[disp_buff[posit]]);

if(point_on && ((posit==2)||(posit==4)||(posit==6)))PORTA &= 0x7f;

PORTC = pgm_read_byte(&position[posit]);

if(++posit》=8)posit = 0;

}

void time_to_dispbuff(void)

{

uchar i,j=0;

for(i=0;i《=3;i++)

{

disp_buff[j++] = time[i]%10;

disp_buff[j++] = time[i]/10;

}

}